Псевдоклассы в CSS — магия интерактивности для дизайнеров
Представьте: пользователь наводит курсор на кнопку — она плавно меняет цвет. Нажимает на неё — слегка «утапливается». Выбирает пункт в списке — и он выделяется. Всё это не 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. Итог: как применять псевдоклассы в работе
- Прототипирование
- В Figma используйте Interactive Components для
:hover
и:active
. - Добавьте состояния
:focus
в дизайн-систему. - Разработка
- Проверяйте вёрстку, убедитесь, что все интерактивные элементы имеют состояния.
- Оптимизируйте анимации через
transition
иwill-change
. - Тестирование
Заключение
Псевдоклассы — это мост между дизайном и разработкой. Освоив их, вы сможете:
- Точно передавать интерактивность в макетах,
- Создавать динамические интерфейсы без лишнего кода,
- Гарантировать доступность своих продуктов.
БОНУС!
Есть еще ::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
— стилизация неактивных полей формы.