Псевдоэлементы CSS: синтаксис ::before и ::after с примерами кода
#Веб-разработка #CSS и верстка #Фронтенд CSSДля кого эта статья:
- Веб-разработчики и дизайнеры, стремящиеся улучшить свои навыки в CSS
- Специалисты по фронтенд-разработке, заинтересованные в оптимизации кода
- Учащиеся или новички в веб-дизайне, ищущие практические советы по использованию псевдоэлементов
Изящество веб-дизайна кроется в деталях, и псевдоэлементы ::before и ::after — это секретное оружие, которое трансформирует заурядные сайты в произведения искусства без единой строчки дополнительного HTML. Представьте: добавить иконку, декоративную линию или контрольную метку — и всё это без загромождения разметки! 🎯 Эти невидимые помощники дизайнера предоставляют беспрецедентные возможности для манипуляций визуальными элементами, что делает их освоение критически важным для любого разработчика, стремящегося выйти за рамки базовых навыков CSS.
Что такое псевдоэлементы
Псевдоэлементы ::before и ::after — это особые CSS-селекторы, которые позволяют добавлять декоративный контент до или после содержимого выбранного HTML-элемента. По сути, они создают виртуальные элементы, которых нет в исходной DOM-структуре, но которые становятся видимыми на странице.
Технически, псевдоэлементы ::before и ::after являются дочерними элементами того HTML-элемента, к которому применяются. Они расширяют возможности стилизации без необходимости добавления дополнительных тегов, что делает вёрстку более чистой и семантически правильной.
Основные характеристики псевдоэлементов:
- Не являются физическими HTML-элементами, но визуально отображаются на странице
- Создаются и контролируются исключительно через CSS
- По умолчанию имеют стиль отображения
inline - Требуют обязательного свойства
contentдля активации - Не могут быть выбраны через JavaScript напрямую (только через getComputedStyle)
| Характеристика | ::before | ::after |
|---|---|---|
| Расположение | Перед содержимым элемента | После содержимого элемента |
| Порядок отображения в DOM | Первый дочерний элемент | Последний дочерний элемент |
| Поддержка браузерами | С IE8+ (как :before), современные браузеры с двойным двоеточием | С IE8+ (как :after), современные браузеры с двойным двоеточием |
Михаил, ведущий фронтенд-разработчик Когда я только начинал свой путь в веб-разработке, я воспринимал псевдоэлементы как странную причуду CSS. Я ошибочно полагал, что их единственная функция — добавлять незначительные украшения. Однажды мне поручили разработать интерфейс с сотнями карточек товаров, каждая из которых имела значок "Новинка" в углу. Мой первоначальный подход требовал дополнительного
<div>для каждого значка, что делало HTML громоздким. Мой наставник указал на более элегантное решение — использовать псевдоэлемент::before. Одна строка CSS заменила сотни строк HTML, и я понял истинную мощь этих инструментов. С тех пор псевдоэлементы стали моими надежными помощниками в создании чистого и масштабируемого кода.

Базовый синтаксис и правила работы с
Синтаксис псевдоэлементов прост, но требует точного соблюдения определенных правил. В современном CSS используется двойное двоеточие (::), чтобы отличать псевдоэлементы от псевдоклассов, хотя для обратной совместимости со старыми браузерами иногда применяют одинарное двоеточие.
Базовый синтаксис выглядит следующим образом:
selector::before {
content: "Текст или символ";
/* другие CSS свойства */
}
selector::after {
content: "Текст или символ";
/* другие CSS свойства */
}
Ключевые правила при работе с псевдоэлементами:
- Обязательное свойство content: Даже если вы не хотите добавлять текст, необходимо указать пустое значение
content: ""; - Одиночное или двойное двоеточие: Современный стандарт требует двойного (
::), но для совместимости со старыми браузерами можно использовать одинарное (:) - Наследование стилей: Псевдоэлементы наследуют стили родительского элемента, если не указано иное
- Применимость: Нельзя применять к элементам замены (
img,input) и пустым элементам (br,hr) - Взаимодействие с пользователем: Могут реагировать на события, но не могут иметь собственных обработчиков событий
Пример базового применения:
/* Добавление кавычек к цитатам */
blockquote::before {
content: "«";
color: #555;
font-size: 2em;
margin-right: 5px;
}
blockquote::after {
content: "»";
color: #555;
font-size: 2em;
margin-left: 5px;
}
Для различных браузеров существуют нюансы поддержки. Важно знать, что Internet Explorer до версии 8 поддерживал только одинарное двоеточие, а некоторые функциональности могут не работать в устаревших браузерах.
Основные свойства и применение content для псевдоэлементов
Свойство content — это сердце любого псевдоэлемента. Без него ::before и ::after не отобразятся, даже если вы укажете все остальные стили. Это свойство определяет, какое содержимое будет вставлено в псевдоэлемент.
Основные значения свойства content:
- Текстовые строки:
content: "Любой текст"; - Пустая строка:
content: "";(используется для чисто декоративных элементов) - Атрибуты элемента:
content: attr(href);(извлекает значение указанного атрибута) - URL изображения:
content: url(path/to/image.jpg); - Счетчики:
content: counter(section);(для автоматической нумерации) - Специальные символы:
content: "\2022";(Unicode-символы) - Комбинация значений:
content: "Раздел " counter(section) ": ";
Примеры практического применения content:
/* Отображение значения атрибута title при наведении */
a[title]::after {
content: " (" attr(title) ")";
opacity: 0;
transition: opacity 0.3s;
}
a[title]:hover::after {
opacity: 1;
}
/* Автоматическая нумерация разделов */
body {
counter-reset: section;
}
h2::before {
counter-increment: section;
content: "Раздел " counter(section) ": ";
color: #555;
}
/* Добавление иконки к внешним ссылкам */
a[href^="http"]::after {
content: " \1F517";
font-size: 0.8em;
}
Особенно полезной функцией является использование attr(), которая позволяет динамически извлекать значения атрибутов HTML-элемента и использовать их в качестве содержимого псевдоэлемента. Это позволяет создавать интерактивные подсказки, отображать дополнительную информацию без дублирования контента.
| Тип контента | Синтаксис | Применение |
|---|---|---|
| Текст | content: "Текст"; | Подписи, метки, декоративные элементы |
| Атрибуты | content: attr(атрибут); | Всплывающие подсказки, метаданные |
| Счетчики | content: counter(имя); | Нумерация, списки, оглавления |
| Изображения | content: url(путь); | Иконки, маркеры, декоративные элементы |
| Пустое значение | content: ""; | Декоративные формы, фоны, позиционирование |
Позиционирование и стилизация
После определения содержимого с помощью свойства content, следующим шагом является позиционирование и стилизация псевдоэлементов. Здесь скрывается огромный потенциал для создания сложных визуальных эффектов.
По умолчанию псевдоэлементы ::before и ::after имеют стиль отображения inline. Однако, изменив свойство display, можно трансформировать их поведение.
Основные методы позиционирования:
- Абсолютное позиционирование: Самый распространенный подход, позволяющий размещать псевдоэлементы относительно их родительского элемента.
- Использование свойства float: Позволяет обтекать псевдоэлементы текстом.
- Flexbox и Grid: При изменении
displayродителя, псевдоэлементы могут стать частью flex или grid контейнера. - Трансформации: Позволяют вращать, масштабировать и перемещать псевдоэлементы.
Пример с абсолютным позиционированием:
.card {
position: relative;
padding: 20px;
border: 1px solid #ddd;
}
.card::before {
content: "";
position: absolute;
top: -10px;
left: 20px;
width: 20px;
height: 20px;
background: white;
border-left: 1px solid #ddd;
border-top: 1px solid #ddd;
transform: rotate(45deg);
}
Этот код создает стилизованную "речевую подсказку" с небольшим треугольным выступом сверху.
Стилизация псевдоэлементов практически не отличается от стилизации обычных HTML-элементов. Вы можете применять к ним большинство CSS-свойств:
- Размеры: width, height, padding, margin
- Фон: background-color, background-image, gradient
- Рамки: border, border-radius
- Тени: box-shadow, text-shadow
- Анимации и переходы: transition, animation
- Трансформации: transform (rotate, scale, translate)
Особое внимание стоит обратить на z-index при абсолютном позиционировании. По умолчанию псевдоэлементы ::before располагаются под содержимым элемента, а ::after — над ним, но это поведение можно изменить.
Анна, UI/UX дизайнер Однажды я столкнулась с интересной задачей — создать эффект "загнутого уголка" для карточек товаров без использования дополнительных изображений. Решение пришло в виде двух наложенных друг на друга псевдоэлементов с абсолютным позиционированием. Первый
::beforeсоздавал тень, а второй::after— сам уголок. Всего несколько строк CSS, и эффект выглядел как настоящий трехмерный загиб бумаги! Клиент был в восторге от того, что мы смогли добиться такого результата без нагрузки на сервер дополнительными запросами изображений. С тех пор я всегда стараюсь найти элегантное решение с псевдоэлементами прежде, чем добавлять лишние HTML-теги или графику. Это экономит время разработки, улучшает производительность сайта и делает код более поддерживаемым.
Практические кейсы использования псевдоэлементов в веб-дизайне
Псевдоэлементы ::before и ::after открывают широчайшие возможности для веб-дизайна. Они позволяют создавать сложные визуальные эффекты с минимальным количеством кода. Рассмотрим некоторые из наиболее полезных и часто используемых приемов. 🔥
1. Создание декоративных элементов и разделителей
/* Стильный разделитель с градиентом */
.section-divider::after {
content: "";
display: block;
width: 50%;
height: 3px;
margin: 20px auto;
background: linear-gradient(to right, transparent, #6a11cb, transparent);
}
2. Добавление иконок к элементам интерфейса
/* Иконка телефона перед номером */
.phone::before {
content: "\260E"; /* Unicode символ телефона */
margin-right: 10px;
color: #0066cc;
}
/* Стрелка для элементов выпадающего списка */
.dropdown::after {
content: "\25BC"; /* Unicode символ стрелки вниз */
margin-left: 5px;
font-size: 0.8em;
transition: transform 0.3s;
}
.dropdown:hover::after {
transform: rotate(180deg);
}
3. Создание наложений и эффектов затемнения
/* Затемнение фона при наведении на карточку */
.card {
position: relative;
overflow: hidden;
}
.card::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0);
transition: background-color 0.3s;
}
.card:hover::before {
background-color: rgba(0, 0, 0, 0.5);
}
4. Визуальные индикаторы состояния
/* Индикатор загрузки для кнопок */
.button.loading::after {
content: "";
display: inline-block;
width: 12px;
height: 12px;
margin-left: 10px;
border: 2px solid #fff;
border-top-color: transparent;
border-radius: 50%;
animation: spin 1s infinite linear;
}
@keyframes spin {
100% { transform: rotate(360deg); }
}
5. Стилизованные формы и фигуры
/* Создание треугольника без использования изображений */
.triangle::before {
content: "";
display: block;
width: 0;
height: 0;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-bottom: 15px solid #333;
}
/* Создание круга с обводкой */
.circle::after {
content: "";
display: inline-block;
width: 20px;
height: 20px;
margin-left: 10px;
border: 2px solid #0066cc;
border-radius: 50%;
}
6. Создание всплывающих подсказок
/* Стилизованная всплывающая подсказка */
.tooltip {
position: relative;
cursor: help;
}
.tooltip::after {
content: attr(data-tooltip);
position: absolute;
bottom: 125%;
left: 50%;
transform: translateX(-50%);
width: max-content;
max-width: 250px;
padding: 5px 10px;
background-color: #333;
color: white;
border-radius: 4px;
font-size: 0.8em;
opacity: 0;
visibility: hidden;
transition: 0.3s;
}
.tooltip:hover::after {
opacity: 1;
visibility: visible;
}
Эти примеры демонстрируют лишь малую часть возможностей псевдоэлементов. Комбинируя их с другими CSS-свойствами, вы можете создавать практически любые декоративные эффекты без необходимости загружать дополнительные изображения или усложнять HTML-разметку.
Псевдоэлементы
::beforeи::after— это не просто инструменты для косметических улучшений, а мощные помощники в создании семантически чистой и эффективной верстки. Их мастерское использование отличает опытного верстальщика от новичка. Как показывают рассмотренные примеры, эти невидимые элементы способны значительно расширить ваши возможности дизайна без единого изменения в HTML-структуре. Погрузитесь в экспериментирование с псевдоэлементами, и вы обнаружите, что многие сложные задачи визуализации имеют элегантные CSS-решения, которые делают ваш код более чистым, производительным и масштабируемым.
Владимир Лисицын
разработчик фронтенда