JavaRush /Курсы /Модуль 1: Web Core /Псевдоэлементы ::before и ::after

Псевдоэлементы ::before и ::after

Модуль 1: Web Core
15 уровень , 5 лекция
Открыта

6.1 Свойство content

Псевдоэлементы ::before и ::after позволяют добавлять контент до и после содержимого элемента, не изменяя HTML-код. Они широко используются для декоративных целей, улучшения пользовательского интерфейса и создания более интерактивных веб-страниц.

Что такое псевдоэлементы ::before и ::after?

Псевдоэлементы ::before и ::after создают виртуальные элементы, которые вставляются соответственно до и после содержимого выбранного элемента. Эти псевдоэлементы часто используются для добавления иконок, декоративных элементов, или других визуальных эффектов.

Синтаксис before:

    
      селектор::before {
        content: "текст или другие значения";
        /* стили */
      }
    
  

Синтаксис after:

    
      селектор::after {
        content: "текст или другие значения";
        /* стили */
      }
    
  

Свойство content

Ключевым свойством для псевдоэлементов ::before и ::after является content. Это свойство определяет содержимое псевдоэлемента. Оно может быть строкой текста, изображением, или даже пустым значением, если нужен только визуальный эффект.

Возможные значения свойства content:

  • Текст: "текст"
  • Изображение: url("path/to/image.png")
  • Пустое значение: ""
  • Атрибуты: attr(attributeName)
  • Счетчики: counter(name)

6.2 Примеры использования ::before и ::after

Добавление декоративных элементов

Пример 1: Добавление иконки перед текстом

В этом примере псевдоэлемент ::before используется для добавления иконки перед текстом ссылки. margin-right добавляет пространство между иконкой и текстом:

CSS
    
      /* Добавление иконки перед текстом ссылки */

      a::before {
        content: "🔗";
        margin-right: 5px;
      }
    
  

Пример 2: Добавление декоративного элемента после абзаца

В этом примере псевдоэлемент ::after добавляет декоративный элемент после абзаца. display: block и text-align: right используются для выравнивания элемента по правому краю:

CSS
    
      /* Добавление декоративного элемента после абзаца */

      p::after {
        content: "❦";
        display: block;
        text-align: right;
        color: red;
      }
    
  

Создание декоративных рамок и фонов

Пример 3: Декоративная рамка вокруг элемента

В этом примере псевдоэлемент ::before используется для создания декоративной полосы над элементом div. position: absolute и top: -10px позволяют позиционировать полосу выше элемента:

CSS
    
      /* Декоративная рамка вокруг элемента */

      div::before {
        content: "";
        display: block;
        width: 100%;
        height: 10px;
        background-color: #3498db;
        position: absolute;
        top: -10px;
        left: 0;
      }
    
  

Пример 4: Автоматическое добавление кавычек

В этом примере псевдоэлементы ::before и ::after используются для добавления кавычек вокруг блока цитаты:

CSS
    
      /* Автоматическое добавление кавычек вокруг цитаты */

      blockquote::before {
        content: "“";
        font-size: 2em;
        color: #ccc;
      }

      blockquote::after {
        content: "”";
        font-size: 2em;
        color: #ccc;
      }
    
  

Пример 5: Нумерация заголовков

В этом примере псевдоэлемент ::before используется для добавления номера перед заголовком h2. counter-increment увеличивает значение счетчика, а content: counter(section) вставляет текущее значение счетчика:

CSS
    
      /* Нумерация заголовков */

      h2::before {
        counter-increment: section;
        content: counter(section) ". ";
        font-weight: bold;
      }
    
  

6.3 Применение и стилизация псевдоэлементов

Стилизация псевдоэлементов

Псевдоэлементы можно стилизовать так же, как и любые другие элементы. Они поддерживают большинство CSS-свойств, включая цвет, фон, границы, размеры и позиционирование.

Использование псевдоэлементов для создания сложных макетов

Псевдоэлементы часто используются для создания декоративных элементов в макетах, таких как рамки, тени и другие визуальные эффекты, без необходимости добавления дополнительных HTML-элементов.

Пример: каждый элемент списка будет иметь синий маркер перед текстом:

CSS
    
      ul li::before {
        content: "•";
        color: blue;
        margin-right: 5px;
      }
    
  
HTML
    
      <ul>
        <li>Item 1</li>
        <li>Item 2</li>
        <li>Item 3</li>
      </ul>
    
  

6.4 Пример полной реализации

CSS
    
      /* Добавление иконки перед текстом ссылки */

      a::before {
        content: "🔗";
        margin-right: 5px;
      }

      /* Добавление декоративного элемента после абзаца */

      p::after {
        content: "❦";
        display: block;
        text-align: right;
        color: red;
      }

      /* Декоративная рамка вокруг элемента */

      .decorative-box {
        position: relative;
      }

      .decorative-box::before {
        content: "";
        display: block;
        width: 100%;
        height: 10px;
        background-color: #3498db;
        position: absolute;
        top: -10px;
        left: 0;
      }

      /* Автоматическое добавление кавычек вокруг цитаты */

      blockquote::before {
        content: "“";
        font-size: 2em;
        color: #ccc;
      }

      blockquote::after {
        content: "”";
        font-size: 2em;
        color: #ccc;
      }

      /* Нумерация заголовков */

      h2::before {
        counter-increment: section;
        content: counter(section) ". ";
        font-weight: bold;
      }
    
  
HTML
    
      <!DOCTYPE html>
      <html lang="en">
        <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Пример псевдоэлементов ::before и ::after</title>
          <link rel="stylesheet" href="styles.css">
        </head>
        <body>
          <a href="#">Ссылка с иконкой</a>
          <p>Абзац с декоративным элементом после текста</p>
          <div class="decorative-box">Элемент с декоративной рамкой</div>
          <blockquote>Цитата с автоматическими кавычками</blockquote>
          <h2>Заголовок с нумерацией</h2>
          <h2>Еще один заголовок</h2>
        </body>
      </html>
    
  
1
Задача
Модуль 1: Web Core, 15 уровень, 5 лекция
Недоступна
Иконка корзины
Иконка корзины
1
Задача
Модуль 1: Web Core, 15 уровень, 5 лекция
Недоступна
Кавычки перед цитатой
Кавычки перед цитатой
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анастасия Уровень 47
23 июля 2025
В 3 примере (Декоративная рамка вокруг элемента) не забудьте прописать самому div, к которому будите применять стиль - position: relative, а то у меня с первого раза не получилось (т.к. строчка уезжала за экран из-за настройки top: -10px;) Вдруг вы такие же внимательные как и я %) И да, тут получается не рамка а полоска над div Так же в 5 примере (Нумерация заголовков), не указано, что надо в body прописать counter-reset: section; (создание счетчика). Если его не слоздать там, то счетчик работать не будет (у меня все было с 1 без него). Так же попробовала создать его в div, которым обернула заголовки - тоже работает. Поэтому и в последнем примере не работает нумерация...
Vadim Makarenko Уровень 42
17 июня 2025
Замечание по поводу первой задачи. В условии не уточняется в виде чего должна быть вставлена иконка корзины: в виде символа или файла. Валидация предполагает только первое. Кстати, хотя решение зачлось при простом копировании символа из задания, вероятно можно воспользоваться и вставкой текста - юникода, в котором традиционное U+ заменяется символом экранирования \
RayCowperwood Уровень 48
26 мая 2025
counter-increment: section; это уже интересно Свойство counter-increment в CSS используется для увеличения значения счётчика, созданного с помощью counter-reset. Оно особенно полезно при создании автоматической нумерации элементов (например, заголовков, списков, разделов и т.д.) Пример

body {
  counter-reset: section; /* создаем счетчик с именем section и обнуляем его */
}

h2::before {
  counter-increment: section; /* увеличиваем счетчик section на 1 */
  content: "Раздел " counter(section) ". "; /* вставляем значение счетчика */
}
💡 Что происходит: Сначала мы обнуляем счётчик section на уровне body. Затем каждый элемент h2, при рендере, увеличивает section на 1. С помощью content: counter(section) мы вставляем текущее значение счётчика перед заголовком. 🛠️ Дополнительно: Можно увеличивать не на 1, а на любое число:

counter-increment: section 2;

Можно использовать несколько счётчиков:

counter-increment: chapter section;

Vadim Makarenko Уровень 42
17 июня 2025
counter-reset использовать не обязательно. Если в counter-increment встречается название счётчика, который ранее не был объявлен, то он будет автоматически создан с нулевым начальным значением и тут же инкрементирован. Аналогично могут действовать counter-set, counter() и counters() (без инкремента, конечно). Вопрос в другом: почему на втором заголовке, где о счётчике уже известно, на том же <h2> выводится не 2, а опять 1 ? И ещё: почему синий прямоугольник над цитатой назван "декоративной рамкой", хотя он ничего не окружает?
RayCowperwood Уровень 48
17 июня 2025
.decorative-box::before создаёт тонкий синий прямоугольник сверху элемента — это не рамка вокруг, а скорее "декоративная полоска сверху" - просто курс написан с кучей ошибок для быстрого сруба $$$ а насчет счетчика, Вы правы, спецификация CSS действительно говорит, что счётчик автоматически создаётся при первом использовании counter-increment, даже без явного counter-reset. Но на практике браузеры работают по-разному, и поведение может отличаться. При первом counter-increment: section; если счётчик section не был объявлен явно, браузер должен создать его с начальным значением 0 и увеличить до 1 Если явно добавить сброс счетчика для body

body {
  counter-reset: section;
}
то все корректно отработает и первый h2 - получит 1, второй h2 - 2