Menu

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

::before и ::after вставляют генерируемое содержимое первым и последним дочерним элементом прямо из CSS. Разберем свойство content, зачем нужен пустой content, позиционирование, подсказки через attr(), счетчики и где они не работают.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Что делают ::before и ::after

::before вставляет блок первым дочерним элементом, а ::after последним дочерним элементом. Что будет в блоке, задает свойство content. В HTML ничего не добавляется: браузер генерирует это из CSS.

В HTML есть только 9 и Tests pass. Знак доллара, подпись «/ month» и галочка появляются из CSS. Они наследуют стили элемента (шрифт, цвет), если их не переопределить, как в примерах выше.

Синтаксис

selector::before {
  content: "text";   /* required */
  /* any other styles */
}

selector::after {
  content: "";       /* empty string: a box with no text */
}
Значение contentРезультат
"text"Строка. "\A" дает перенос строки (с white-space: pre), "\2192" символ Unicode (→)
""Пустой блок для фигур и украшений
attr(data-label)Значение атрибута элемента
counter(step)Значение CSS-счетчика
open-quote / close-quoteКавычки для языка элемента
none или normalПсевдоэлемента нет (normal по умолчанию)

content обязателен. Без него ::before и ::after не создаются, сколько бы других свойств вы им ни задали.

Декоративные фигуры с content: ""

С content: "" псевдоэлемент становится пустым блоком, которому можно задать размер и цвет. По умолчанию он строчный, а строчный блок игнорирует width и height, поэтому задайте ему display: block, inline-block или position: absolute:

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

Для украшения поверх элемента или вокруг него задайте псевдоэлементу position: absolute, а самому элементу position: relative, чтобы смещения отсчитывались от элемента:

Обратите внимание на порядок при сочетании с псевдоклассом: сначала состояние, потом псевдоэлемент, .link:hover::after, но никогда .link::after:hover.

Чтение атрибутов через attr(): подсказка

attr() подставляет значение атрибута в content, поэтому одно правило показывает на каждом элементе свой текст:

Подсказка только по наведению невидима для пользователей клавиатуры и сенсорных экранов. Все важное размещайте на странице или показывайте еще и по :focus, добавив элементу tabindex="0".

Нумерация счетчиками

CSS-счетчики и ::before нумеруют элементы без ручного ввода чисел:

Добавьте или удалите шаг, и номера обновятся сами.

Где ::before и ::after не работают

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

  • <img>, <video>, <iframe> (замещаемые элементы)
  • <input>, <select>, <textarea> (элементы форм) и <br>

Некоторые браузеры рисуют их на чекбоксе или битом изображении, но это непоследовательно. Повесьте псевдоэлемент на обертку: <span class="field"><input></span> и оформите .field::after.

Частые ошибки

  • Нет content. Самая частая причина, почему ничего не видно. Добавьте content: "".
  • Размер у строчного псевдоэлемента. width и height не работают, пока не задан display: block, inline-block или position: absolute.
  • Неправильный порядок с состоянием. a:hover::after работает, a::after:hover нет.
  • Абсолютное позиционирование без позиционированного родителя. Тогда псевдоэлемент выравнивается по какому-то далекому предку. Добавьте элементу position: relative.
  • Настоящее содержимое в CSS. Текст в content нельзя выделить или скопировать. Храните информацию в HTML.

Часто задаваемые вопросы

Что делает ::before в CSS?

Создает псевдоэлемент, который становится первым дочерним элементом выбранного элемента и заполняется тем, что указано в свойстве content. ::after делает то же самое как последний дочерний элемент. В HTML их нет, поэтому они удобны для иконок, подписей и украшений.

Почему не отображается ::before или ::after?

Самая частая причина: нет свойства content, без него псевдоэлемент не создается. Для пустого декоративного блока используйте content: "". Другие причины: строчный псевдоэлемент с шириной и высотой (задайте ему display: block или inline-block) или элемент вроде <img> или <input>, который не может их содержать.

Чем :before отличается от ::before?

По поведению ничем. ::before с двумя двоеточиями это современный синтаксис, который обозначает псевдоэлементы; :before с одним двоеточием это старое написание из CSS2, которое браузеры до сих пор принимают для before, after, first-line и first-letter.

Можно ли использовать ::before на img или input?

Надежно нельзя. Псевдоэлементы вставляются внутрь содержимого элемента, а у замещаемых элементов вроде <img> и элементов форм вроде <input> нет для них области содержимого. Оберните элемент в <span> или <div> и повесьте псевдоэлемент на обертку.

Озвучивают ли программы чтения с экрана содержимое ::before?

Как правило, да: текст из content обычно входит в доступное имя, но его нельзя выделить или скопировать. Храните настоящую информацию в HTML, а псевдоэлементы используйте для украшений и небольших визуальных подсказок.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ