Представьте: пользователь наводит курсор на кнопку — она плавно меняет цвет. Нажимает на неё — слегка «утапливается». Выбирает пункт в списке — и он выделяется. Всё это не JavaScript и не сложные скрипты, а псевдоклассы CSS — простой, но мощный инструмент, который превращает статичный дизайн в живой и отзывчивый.
- Работает с веб-интерфейсами,
- Хочет лучше понимать, как реализуются интерактивные состояния,
- Стремится создавать не только красивые, но и удобные макеты,
Что такое псевдоклассы?
Псевдоклассы — это специальные ключевые слова в CSS, которые позволяют применить стили к элементам в определённом состоянии. Они не требуют дополнительной разметки или скриптов — браузер сам определяет, когда элемент:
- Наведён (
:hover), - Нажат (
:active), - В фокусе (
:focus), - Или даже является первым в списке (
:first-child).
Зачем их знать дизайнеру?
- Коммуникация с разработчиками – вы сможете точнее объяснять, как должны выглядеть интерактивные элементы.
- Прототипирование – в Figma или других инструментах можно имитировать состояния через аналоги псевдоклассов.
- Контроль качества – понимание CSS помогает замечать ошибки в вёрстке (например, забытый
:focusу кнопок).
В этой статье разберём ключевые псевдоклассы, которые полезны дизайнерам, и покажем, как их применять для создания интуитивных интерфейсов.
1. Основные псевдоклассы для интерактивности: оживляем интерфейс
Дизайн — это не только визуальная эстетика, но и поведение элементов. Псевдоклассы помогают описать, как компоненты реагируют на действия пользователя, делая интерфейс предсказуемым и приятным. Разберём ключевые из них.
:hover — «наведение»
Что делает?
Применяет стили, когда курсор оказывается над элементом.
- Кнопки (изменение фона, тени, подчеркивание).
- Карточки товаров (подсветка, плавное увеличение).
- Меню (смена цвета пунктов).
.button:hover {
background-color: #3a7bd5;
transform: translateY(-2px); /* Лёгкий «подпрыг» */
transition: all 0.3s ease; /* Плавность */
}
Совет: На тач-устройствах :hover может срабатывать при первом касании — учитывайте это!
:active — «нажатие»
Что делает?
Срабатывает, пока элемент удерживается нажатым (например, кнопка мыши зажата).
- Эмуляция «утапливания» кнопок (например, смещение вниз или затемнение).
- Интерактивные иконки (например, «лайк» при нажатии).
.button:active {
transform: translateY(1px); /* Эффект вдавливания */
box-shadow: none; /* Убираем тень */
}
:focus — «фокус»
Что делает?
Активируется, когда элемент выбран (например, клавишей Tab или кликом). Критически важен для доступности!
- Поля ввода (input, textarea).
- Кнопки и ссылки (чтобы клавиатурные пользователи видели, где находятся).
.input:focus {
outline: 2px solid #3a7bd5; /* Чёткий контур */
border-color: transparent; /* Опционально */
}
Совет: Никогда не удаляйте outline полностью — замените его на кастомный стиль.
:visited — «посещённые ссылки»
Что делает?
Позволяет стилизовать ссылки, по которым уже переходили.
a:visited {
color: #8e44ad; /* Фиолетовый для посещённых */
opacity: 0.8; /* Лёгкое затемнение */
}
Ограничение: Из соображений безопасности в современных браузерах для :visited можно менять только color, background-color, и opacity.
Почему это важно для дизайнеров?
- Микровзаимодействия — именно псевдоклассы создают ощущение «отклика» интерфейса.
- Прототипирование — в Figma можно настроить аналоги
:hoverи:activeчерез Interactive Components. - UX-аудит — проверяйте, учтены ли все состояния в макетах (особенно
:focus).
Далее: В следующей главе разберём псевдоклассы для работы со структурой — :nth-child(), :not() и другие.
2. Структурные псевдоклассы: контроль элементов без лишних классов
Дизайнеры часто сталкиваются с задачами вроде:
«Первый элемент в списке должен быть крупнее, а каждый чётный — с другим фоном».
Раньше это требовало ручного добавления классов (first, even), но сейчас структурные псевдоклассы CSS делают это автоматически.
:first-child и :last-child — крайние элементы
Зачем?
Стилизовать первый/последний элемент в блоке без лишней разметки.
/* Первая карточка в списке с акцентом */
.card:first-child {
border-left: 4px solid #3a7bd5;
}
/* Последний пункт меню без разделителя */
.menu-item:last-child {
border-bottom: none;
}
:nth-child() — точечный выбор
Зачем?
Выбрать элементы по порядку: чётные, нечётные, конкретные позиции или даже по формуле.
/* Чётные строки таблицы */
tr:nth-child(even) {
background: #f9f9f9;
}
/* Каждый 3-й элемент в сетке */
.grid-item:nth-child(3n) {
margin-right: 0; /* Сброс отступа для новой строки */
}
/* Только первые 3 элемента */
li:nth-child(-n+3) {
font-weight: bold;
}
:not() — исключения
Зачем?
Применить стили ко всем элементам, кроме указанных.
/* Все кнопки, кроме disabled */
.button:not(:disabled) {
cursor: pointer;
}
/* Все пункты списка, кроме последнего */
li:not(:last-child) {
margin-bottom: 12px;
}
:empty — пустые элементы
Зачем?
Скрыть или стилизовать контейнеры без содержимого (например, если контент подгружается динамически).
/* Скрыть пустые блоки с ошибками */
.error-message:empty {
display: none;
}
/* Декоративный плейсхолдер для пустого состояния */
.card:empty::before {
content: "Загрузка...";
opacity: 0.5;
}
Почему это полезно дизайнерам?
- Чистые макеты — не нужно просить разработчиков добавлять классы вручную.
- Гибкость — можно быстро менять правила (например, «выделять каждый 5-й элемент» без правки HTML).
- Динамический контент — если данные приходят из CMS, псевдоклассы автоматически адаптируются.
Практический совет:
В Figma частично можно имитировать :nth-child, создая компоненты с вариациями (например, «первый/последний элемент»).
Далее: В следующей главе разберём менее очевидные, но мощные псевдоклассы вроде :target, :checked и :has() (для работы с формами и сложными селекторами).
3. Специальные псевдоклассы: формы, состояние и продвинутые сценарии
Помимо базовой интерактивности и структурных правил, CSS предлагает узкоспециализированные псевдоклассы для работы с формами, динамическим контентом и даже условиями. Эти приёмы особенно полезны при создании сложных интерфейсов без JavaScript.
:checked — работа с переключателями
Зачем? Стилизовать чекбоксы, радиокнопки и переключатели (toggles).
/* Прячем стандартный input */
.input-checkbox {
appearance: none;
width: 18px;
height: 18px;
border: 2px solid #3a7bd5;
border-radius: 4px;
}
/* Стиль при активации */
.input-checkbox:checked {
background-color: #3a7bd5;
background-image: url("data:image/svg+xml,..."); /* Галочка */
}
:target — CSS-аналог якорных ссылок
Зачем? Изменять стиль элемента, на который ссылаются через #id в URL.
<a href="#tab1">Вкладка 1</a> <a href="#tab2">Вкладка 2</a> <div id="tab1" class="tab">Контент 1</div> <div id="tab2" class="tab">Контент 2</div>
.tab { display: none; }
.tab:target { display: block; } /* Показываем активную вкладку */
Ограничение: Не подходит для сложных сценариев (например, анимации переключения).
:has() — «родительский» селектор
Зачем? Выбрать элемент, который содержит определённый дочерний элемент (новинка CSS!).
/* Карточка, внутри которой есть лейбл "New" */
.card:has(.badge-new) {
border: 2px solid gold;
}
/* Форма, где input невалиден */
.form-group:has(:invalid) {
background: #ffe6e6;
}
Поддержка: Работает во всех современных браузерах (с 2023 года).
:is() и :where() — группировка селекторов
Зачем? Упростить сложные правила.
/* Без :is() */
.header h1, .header h2, .header h3 {
color: #3a7bd5;
}
/* С :is() */
.header :is(h1, h2, h3) {
color: #3a7bd5;
}
:is()— учитывает специфичность.:where()— обнуляет специфичность (полезно для переопределения стилей).
Почему это важно для дизайнеров?
- Кастомизация форм — больше не нужно мириться со стандартными чекбоксами.
- Динамика без JS — например, можно создать аккордеон только на CSS.
- Компонентный подход —
:has()позволяет стилизовать целые блоки по их содержимому.
Что дальше?
В финальной части разберём:
- Как комбинировать псевдоклассы для сложных эффектов,
- Лайфхаки для анимации состояний,
- Чеклист по доступности.
4. Комбинирование псевдоклассов: продвинутые техники и чеклист доступности
Теперь, когда мы разобрали основные псевдоклассы, пришло время соединить их в мощные комбинации, добавить анимацию и убедиться, что всё работает для всех пользователей.
4.1. Комбинирование псевдоклассов
Можно накладывать условия, например:
button:focus:active { transform: scale(0.98); }
item:nth-child(even):not(:empty) { background: #f5f5f5; }
Динамические эффекты
Пример: анимированный список при наведении
/* Уменьшаем неподсвеченные элементы */
.list-item:hover ~ .list-item {
opacity: 0.6;
transform: scale(0.95);
}
Формы с валидацией
Стилизация полей в зависимости от их состояния:
/* Поле с ошибкой */
.input:invalid {
border-color: #ff6b6b;
}
/* Плейсхолдер для невалидного поля */
.input:invalid::placeholder {
color: #ff6b6b;
}
4.2. Анимация состояний
Псевдоклассы отлично работают с transition и animation.
Пример: плавное появление подсказки
.tooltip {
opacity: 0;
transition: opacity 0.3s ease;
}
.button:hover .tooltip {
opacity: 1;
}
Лайфхак:
Используйте will-change для оптимизации:
.button {
will-change: transform; /* Готовит браузер к анимации */
transition: transform 0.2s ease;
}
.button:hover {
transform: translateY(-3px);
}
4.3. Чеклист по доступности
Псевдоклассы — не только про красоту, но и про инклюзивность:
Все интерактивные элементы имеют :focus
Состояния :hover и :active не обязательны для понимания интерфейса
Формы используют :invalid и :required
Тестируйте в режиме высокой контрастности
4.4. Итог: как применять псевдоклассы в работе
Заключение
Псевдоклассы — это мост между дизайном и разработкой. Освоив их, вы сможете:
- Точно передавать интерактивность в макетах,
- Создавать динамические интерфейсы без лишнего кода,
- Гарантировать доступность своих продуктов.
БОНУС!
Есть еще ::selection — это псевдоэлемент (а не псевдокласс!), который позволяет стилизовать выделенный пользователем текст на странице.
Разница между псевдоклассами и псевдоэлементами
- Псевдоклассы (
:hover,:focus) — выбирают элементы в определённом состоянии. - Псевдоэлементы (
::before,::selection) — создают новые виртуальные элементы (например, декоративные линии или стили для части контента).
Как использовать ::selection?
Позволяет изменить цвет фона и текста при выделении:
::selection {
background-color: #3a7bd5; /* Цвет фона */
color: white; /* Цвет текста */
text-shadow: none; /* Можно добавить тень */
}
/* Для отдельных элементов */
p::selection {
background-color: #8e44ad;
}
- Работают только свойства:
color,background-color,text-shadow,background(не все браузеры поддерживают градиенты). - Нельзя изменить
font-size,padding,borderи др.
Примеры применения
::selection { background: #ff6b6b; color: #fff; }
::selection { background: #f1c40f; color: #111; }
::selection { background: #2c3e50; color: #e74c3c; }
Почему это важно для дизайнеров?
- Детализация — выделение текста тоже часть UX.
- Консистентность — цвет выделения может соответствовать гайдлайнам бренда.
- Доступность — контрастный цвет помогает визуально выделять текст.
Совет: Проверяйте макеты, выделяя текст — убедитесь, что сочетание цветов удобочитаемо!
Другие полезные псевдоэлементы
::first-letter— стилизация первой буквы (например, в абзацах).::placeholder— изменение стиля плейсхолдера в input.::before/::after— декоративные элементы (иконки, разделители).
Что ещё бывает?
1. Менее популярные, но полезные псевдоклассы
:focus-visible— стили только при фокусе клавиатурой (игнорирует клик мышью).:focus-within— родительский элемент, если в нём что-то в фокусе (удобно для форм).:indeterminate— состояние «неопределённо» (например, чекбокс-группа).:disabled,:read-only— стилизация неактивных полей формы.