Что делают ::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, а псевдоэлементы используйте для украшений и небольших визуальных подсказок.