Перейти к основному содержимому

Псевдоклассы и псевдоэлементы

Разработчику Аналитику Тестировщику
Архитектору Инженеру

Псевдо-селекторы

Синтаксис

Псевдоклассы изначально записывались с одним двоеточием (:hover), а псевдоэлементы — также с одним (:before). В CSS3 был введён чёткий синтаксис:

  • Псевдоклассы — одно двоеточие (:nth-child, :focus-visible)
  • Псевдоэлементы — два двоеточия (::before, ::backdrop)

Браузеры по-прежнему поддерживают старый синтаксис (:before) для обратной совместимости, но современный стандарт рекомендует использовать два двоеточия для псевдоэлементов.


Почему псевдо?

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

Псевдоклассы ( :pseudo-class) в определённом состоянии. Псевдоклассы пишутся с одним двоеточием.

Помните, что такое классы? Теперь представьте, что вы хотите изменить элемент не всегда, а только в определённой ситуации.

Например:

  • Когда пользователь наводит мышку на кнопку.
  • Когда ссылка уже была посещена.
  • Когда это первый элемент в списке.

Для этого используются псевдоклассы.

Они записываются через двоеточие после селектора:

a:hover {
color: orange;
}

— это значит: «когда на ссылку наводят мышкой — сделай её оранжевой».

Ещё примеры:

Если у нас есть DOM-элемент p:

<p>Мы хотим изменить здесь шрифт</p>

...то в CSS мы пишем:

p:first-child {
font-weight: bold;
}

Проще говоря — если абзац — первый среди своих "братьев и сестёр" (соседей), сделай его жирным.

А если у нас есть форма, и мы хотим изменить фокус в теге input:

input:focus {
border: 2px solid green;
}

— когда поле ввода активно (на нём курсор), обведи его зелёной рамкой.

Это способ сказать: «примени стиль, если элемент находится в каком-то особом состоянии или занимает особое положение».


Динамические

Динамические (взаимодействие с пользователем)

ПсевдоклассОписаниеПример
:hoverПри наведении курсораa:hover { color: red; }
:activeВ момент кликаbutton:active { opacity: 0.8; }
:focusПри фокусе (например, input)input:focus { border-color: blue; }
:visitedПосещённая ссылкаa:visited { color: purple; }
:focus-visibleЭлемент в фокусе, и фокус виден (например, при навигации клавиатурой)button:focus-visible { outline: 2px solid blue; }
:focus-withinЭлемент или один из его потомков в фокусе.form-group:focus-within { border-color: green; }
:targetЭлемент, чей id совпадает с хешем в URL#section1:target { background: #f0f0f0; }

Структурные

Структурные (положение в DOM)

ПсевдоклассОписаниеПример
:first-childПервый дочерний элементli:first-child { font-weight: bold; }
:last-childПоследний дочерний элементdiv:last-child { margin-bottom: 0; }
:nth-child(n)Элемент под номером ntr:nth-child(2n) { background: #f5f5f5; }
:not(selector)Все элементы, кроме указанныхp:not(.warning) { color: black; }
:nth-of-type(n)n-й элемент определённого типа среди братьевp:nth-of-type(2) { color: gray; }
:first-of-typeПервый элемент своего типа среди братьевh2:first-of-type { margin-top: 0; }
:last-of-typeПоследний элемент своего типа среди братьевimg:last-of-type { border-radius: 8px; }
:only-childЕдинственный дочерний элемент родителяdiv:only-child { width: 100%; }
:only-of-typeЕдинственный элемент своего типа среди братьевspan:only-of-type { font-style: italic; }

Состояния

Состояния элементов

ПсевдоклассОписаниеПример
:checkedВыбранный чекбокс / радио-кнопкаinput:checked + label { color: green; }
:disabledОтключённый элемент формыbutton:disabled { opacity: 0.5; }
:emptyПустой элемент (без детей)div:empty { display: none; }

Формы и валидация

ПсевдоклассОписаниеПример
:validПоле формы прошло валидациюinput:valid { border-color: green; }
:invalidПоле формы не прошло валидациюinput:invalid { border-color: red; }
:requiredОбязательное для заполнения полеinput:required { background: #fff8e1; }
:optionalНеобязательное полеinput:optional { opacity: 0.8; }
:user-valid / :user-invalidСостояние после взаимодействия пользователя (экспериментальные)input:user-invalid { box-shadow: 0 0 4px red; }

Эти псевдоклассы позволяют создавать реактивные формы без JavaScript.


Псевдоэлементы

Что такое псевдоэлемент?

Псевдоэлементы (::pseudo-element) стилизуют части элемента (например, первую букву или строку). Псевдоэлементы пишутся с двумя двоеточиями.

А теперь представьте, что вы хотите добавить что-то новое, чего нет в HTML.

Например:

  • Маленькую иконку после каждой ссылки.
  • Кавычки в начале цитаты.
  • Стилизовать только первую букву абзаца.

Вы не хотите ради этого писать лишние теги. Вот тут и помогают псевдоэлементы. Они создают виртуальные части элемента — как будто они есть, но в коде их нет. Записываются через два двоеточия:

.quote::before {
content: "“";
font-size: 1.5em;
}

.quote::after {
content: "”";
font-size: 1.5em;
}

— это добавит кавычки в начало и конец любого элемента с классом .quote.

Ещё пример:

p::first-letter {
font-size: 2em;
float: left;
margin-right: 5px;
}

— «сделай первую букву абзаца большой и обтекаемой».

li::marker {
color: red;
}

— «сделай маркер списка (точку или цифру) красным».

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

Эти инструменты вместе дают полный контроль над тем, как выглядит ваш сайт — от общих форм до мельчайших деталей.


Основные псевдоэлементы

ПсевдоклассОписаниеПример
::beforeВставляет контент перед элементом.quote::before { content: ""; }
::afterВставляет контент после элемента.link::after { content: ""; }
::first-letterПервая буква элементаp::first-letter { font-size: 2em; }
::first-lineПервая строка элементаarticle::first-line { font-weight: bold; }
::selectionСтиль выделенного текста::selection { background: yellow; }
::backdropФон под модальным окном (при dialog::showModal())dialog::backdrop { background: rgba(0,0,0,0.7); }
::placeholderСтиль placeholder в полях вводаinput::placeholder { color: #999; }
::file-selector-buttonКнопка выбора файла в <input type="file">input[type="file"]::file-selector-button { background: #007bff; }
::cueСубтитры в медиаэлементах (WebVTT)video::cue { color: white; background: transparent; }

Особенности поведения

  • Псевдоэлементы не существуют в DOM, поэтому к ним нельзя получить доступ через JavaScript.
  • Содержимое, добавленное через ::before и ::after, отображается только если задано свойство content.
  • Значение content может быть строкой, url(), attr() или даже пустым (""), но не может содержать HTML.
  • Некоторые псевдоклассы, такие как :visited, ограничены в стилях из соображений приватности (нельзя менять background-image, visibility и др.).