
CSS Псевдоклассы и псевдоэлементы: полное руководство
ДБ
Дмитрий Борисенко
· 3 минуты чтения
Псевдоклассы стилизуют элемент по его состоянию или позиции, а псевдоэлементы создают виртуальные элементы, которых нет в разметке. Вместе они закрывают то, ради чего раньше добавляли лишние теги или писали JavaScript.
Разница между псевдоклассами и псевдоэлементами
Псевдоклассы (:)
Нацеливаются на элементы в зависимости от их состояния или позиции:
Псевдоэлементы (::)
Создают или нацеливаются на виртуальные элементы:
Псевдоклассы пишут с одним двоеточием :, псевдоэлементы с двумя ::.
Основные псевдоклассы
1. Интерактивные состояния
Интерактивные состояния кнопки
Loading...
:focus или :focus-visible
Самая частая ошибка в CSS-доступности выглядит так:
Обводку убирают, потому что она «портит дизайн» при клике мышью. Но вместе с мышью её теряет и человек, который ходит по сайту с клавиатуры. Он просто перестаёт видеть, где находится.
Для этого и появился :focus-visible. Браузер сам решает, показывать ли кольцо
фокуса: при клике мышью — нет, при переходе по Tab — да. Вам не нужно ничего
отслеживать.
Если обводка по умолчанию не нравится, замените её на свою, но не удаляйте. И не
заменяйте на один box-shadow: в режиме высокой контрастности Windows тени не
рисуются, а outline рисуется.
2. Структурные псевдоклассы
Структурные селекторы nth-child
Loading...
Полезные паттерны nth-child:
3. Псевдоклассы форм
Валидация и состояния форм
Loading...
4. Продвинутые селекторы
:has() — Родительский селектор
:has() — тот самый «родительский селектор», которого ждали двадцать лет. С
конца 2023 года он Baseline и работает во всех основных браузерах, так что
экзотикой его считать уже поздно.
Стилизовать элемент по тому, что лежит внутри него, раньше можно было только из JavaScript. Теперь это одна строка CSS.
Селектор :has() для родителей
Loading...
:target — Элемент по якорю
Навигация с :target
Loading...
Псевдоэлементы
1. ::before и ::after
Псевдоэлементы ::before и ::after
Loading...
Стрелка у внешней ссылки выше — текстовый символ в content, и он зависит от
шрифта. В одном начертании стрелка выглядит тонкой, в другом съезжает по базовой
линии. Предсказуемее подставить иконку картинкой: content: '' плюс
background-image с SVG прямо в правиле, без отдельного файла и лишнего
запроса. Разметку для такой вставки нужно экранировать, и удобнее это сделать в
кодировщике SVG для CSS, чем вручную заменять
угловые скобки и кавычки.
2. Кастомные счётчики
CSS счётчики с ::before
Loading...
3. ::first-letter и ::first-line
Типографика с ::first-letter
Loading...
4. ::selection — Стилизация выделения
Кастомное выделение текста
Loading...
Практические примеры
Кастомный чекбокс
Кастомный чекбокс без JavaScript
Loading...
Состояние загрузки (Skeleton)
Skeleton loader эффект
Loading...
Инструменты для работы с CSS
Когда селекторы разрастаются, приходится считать специфичность:
Специфичность CSS: калькулятор веса селектора
Вставьте селектор и узнайте его вес — станет понятно, какое правило победит в каскаде и почему стиль не применяется.
Попробовать
Для создания визуальных эффектов с градиентами в псевдоэлементах:
CSS градиент: генератор фона онлайн
Соберите CSS-градиент визуально — линейный, радиальный или конический — настройте цветовые точки и направление и скопируйте готовый код CSS и Tailwind.
Попробовать
Советы по производительности
- Псевдоэлементы создают реальные узлы и попадают в render tree.
- Разросшиеся селекторы замедляют рендеринг, держите специфичность в разумных пределах.
- Тени и фильтры в
::beforeи::afterобходятся дорого. - CSS containment ограничивает область пересчёта стилей.
Поддержка браузерами
Почти всё из перечисленного работает везде:
| Селектор | Поддержка |
|---|---|
:hover, :focus, :active |
все браузеры |
:nth-child(), :first-child |
все браузеры |
::before, ::after |
все браузеры |
:is(), :where() |
современные браузеры |
:has() |
современные, с 2023 года |
:focus-visible |
современные браузеры |
Распространённые ошибки
1. Забывание content для ::before/::after
2. Двойное двоеточие для псевдоклассов
3. Попытка стилизовать ::before у элементов замены
Заключение
На псевдоклассах и псевдоэлементах держится изрядная часть повседневного CSS. С ними делают:
- интерактивные элементы без JavaScript;
- декоративные вставки без лишних тегов в HTML;
- подсветку состояний формы и валидации;
- составные компоненты вроде кастомных чекбоксов и скелетонов;
- нормальный фокус с
:focus-visible.
Что запомнить
- Для фокуса берут
:focus-visible, а не:focus, и обводку не удаляют. :has()наконец-то даёт стилизовать родителя по содержимому.::beforeи::afterдержат на себе всю декорацию, но требуютcontent.- Псевдоклассы комбинируются, и этим стоит пользоваться.
- Длинные цепочки селекторов бьют по скорости рендеринга.
Полезные ресурсы
Специфичность CSS: калькулятор веса селектора
Вставьте селектор и узнайте его вес — станет понятно, какое правило победит в каскаде и почему стиль не применяется.
Попробовать
CSS градиент: генератор фона онлайн
Соберите CSS-градиент визуально — линейный, радиальный или конический — настройте цветовые точки и направление и скопируйте готовый код CSS и Tailwind.
Попробовать
Код в примерах выше правится прямо на странице, результат обновляется сразу.



