Tailwind CSSMiddleCoding
Как применять hover, focus и другие state-варианты в Tailwind?
State-варианты в Tailwind — префиксы перед утилитой: hover:bg-blue-500 добавляет bg-blue-500 при наведении. Поддерживаются hover, focus, active, disabled, group-hover, peer-checked и десятки других.
State-варианты в Tailwind CSS
State-варианты (псевдоклассы и псевдоэлементы) добавляются как префикс перед любой утилитой через двоеточие. Это заменяет написание отдельных CSS-правил с псевдоклассами.
Основные псевдоклассы
<button
class="
bg-blue-500
hover:bg-blue-600
focus:ring-2 focus:ring-blue-300 focus:outline-none
active:bg-blue-700
disabled:opacity-50 disabled:cursor-not-allowed
transition-colors
"
>
Кнопка
</button>
<input
class="
border border-gray-300
focus:border-blue-500 focus:ring-1 focus:ring-blue-500
placeholder:text-gray-400
read-only:bg-gray-50
"
placeholder="Введите значение"
/>
Варианты форм и состояний
<!-- Состояния чекбокса -->
<input
type="checkbox"
class="
checked:bg-blue-500 checked:border-blue-500
indeterminate:bg-gray-300
"
/>
<!-- Валидация формы -->
<input
class="
valid:border-green-500
invalid:border-red-500
required:border-yellow-300
"
required
/>
<!-- Ссылки -->
<a class="visited:text-purple-600 hover:underline">Ссылка</a>
Группировка: group и group-hover
Маркер group на родителе позволяет стилизовать дочерние элементы при hover на родителе.
<div class="group flex items-center gap-3 p-4 rounded hover:bg-gray-100">
<img class="size-10 rounded-full group-hover:ring-2 group-hover:ring-blue-500" />
<div>
<p class="font-medium group-hover:text-blue-600">Имя</p>
<p class="text-sm text-gray-500 group-hover:text-gray-700">email@example.com</p>
</div>
<svg class="ms-auto opacity-0 group-hover:opacity-100 transition-opacity" />
</div>
Именованные группы
<!-- Несколько вложенных групп -->
<div class="group/card hover:shadow-lg">
<div class="group/btn">
<button class="group-hover/btn:bg-blue-500">Кнопка</button>
<span class="group-hover/card:text-blue-500">Реагирует на карточку</span>
</div>
</div>
Peer: стилизация по состоянию соседа
<!-- Показываем подсказку когда input в фокусе -->
<div class="relative">
<input
class="peer border rounded px-3 py-2"
placeholder="Email"
/>
<p class="hidden peer-focus:block text-sm text-blue-500 mt-1">
Введите ваш email
</p>
<p class="hidden peer-invalid:block text-sm text-red-500 mt-1">
Некорректный формат
</p>
</div>
Псевдоэлементы
<blockquote class="
relative
before:content-['“']
before:text-4xl before:text-gray-300
before:absolute before:-top-2 before:-left-4
after:content-['”']
">
Цитата
</blockquote>
<!-- Стилизация выделенного текста -->
<p class="selection:bg-yellow-200 selection:text-black">
Выделите этот текст
</p>
Варианты для data-атрибутов
<div data-state="open" class="data-[state=open]:block hidden">
Видно только когда data-state=open
</div>
Подводные камни
peerработает только между соседними элементами —peer-элемент должен идти в HTML раньше целевого элемента, иначе CSS-селектор~не сработает.groupбез именования не позволяет вложить несколько групп — используйтеgroup/nameсинтаксис (v3.2+) для вложенных групп.- Псевдоэлемент
before:иafter:требуют хотя бы пустогоcontent— безbefore:content-['']элемент не отображается. - Варианты
focus-within:иfocus-visible:часто путают:focus-withinсрабатывает при фокусе на любом потомке,focus-visible— только при навигации с клавиатуры. disabled:не работает на элементах без атрибутаdisabled— для кастомных компонентов используйтеaria-disabledи вариантaria-disabled:opacity-50.- Состояние
visited:ограничено браузером — из соображений приватности можно менять только цвет, а не layout-свойства. - Именованные группы и peer
group/nameпоявились в v3.2 — в более старых версиях недоступны.
Common mistakes
- Смешивать «state-варианты» с похожим механизмом без критерия выбора.
- Игнорировать риск: неверно оценить границы применения темы «state-варианты» и получить хрупкое решение.
- Показывать только синтаксис и не объяснять поведение в runtime или сборке.
What the interviewer is testing
- Объясняет условные utilities для hover, focus, disabled, aria и data-состояний.
- Показывает на примере, как работает: варианты добавляют селекторный контекст к utility; Tailwind поддерживает псевдоклассы, media features, group, peer, aria/data и пользовательские варианты.
- Называет production-нюанс и граничный случай для темы «state-варианты».