六维教程

Tailwind CSS 状态与变体

前面讲布局时,元素样式是固定的。本篇讲状态变体,让元素在鼠标悬停、获得焦点、被禁用等状态时自动改变外观,这是做交互的基础。

伪类变体

在工具类前加状态前缀,就能让该样式只在对应状态生效。最常用的几个。

前缀 触发状态
hover: 鼠标悬停
focus: 获得焦点
active: 被按下
disabled: 被禁用
visited: 链接已访问
<button class="bg-blue-500 hover:bg-blue-600 active:bg-blue-700 text-white px-4 py-2 rounded">
  点我
</button>

按钮默认蓝色,悬停变深,按下更深。disabled 状态常用在表单提交时。

<button class="bg-gray-300 text-gray-500 disabled:bg-gray-200 disabled:cursor-not-allowed" disabled>
  不可用
</button>

group 父状态控制子元素

有时想让「父元素被悬停时,里面的某个子元素变化」。给父元素加 group,子元素用 group-hover: 即可。

<div class="group p-4 border rounded hover:bg-gray-50">
  <p class="text-gray-700">标题</p>
  <span class="text-gray-400 group-hover:text-blue-500">悬停我才变蓝</span>
</div>

鼠标移到整张卡片上,里面的小字才会变蓝,而不需要单独悬停那行字。

group 多实例

页面有多个 group 也不冲突,每个 group 只影响自己内部的 group-hover: 后代。

peer 兄弟状态控制

当一个元素需要根据「前面的兄弟元素」状态变化时使用 peer。常见场景是自定义复选框、开关。

<input type="checkbox" class="peer sr-only" id="toggle">
<label for="toggle" class="block w-12 h-6 bg-gray-300 rounded-full peer-checked:bg-green-500">
</label>

这里 <input> 加了 peer,后面的 <label> 用 peer-checked:bg-green-500,在勾选时变绿。sr-only 把原生勾选框隐藏但保留可访问性。

peer 的其他变体

除了 peer-checked:,还有 peer-focus:、peer-disabled:、peer-invalid: 等,按兄弟元素的状态触发。

实战:表单与按钮交互

下面做一个带交互反馈的登录表单。

<form class="max-w-sm mx-auto p-6 space-y-4">
  <input
    type="text"
    placeholder="用户名"
    class="w-full px-3 py-2 border rounded focus:border-blue-500 focus:ring-2 focus:ring-blue-200 outline-none">
  <input
    type="password"
    placeholder="密码"
    class="w-full px-3 py-2 border rounded focus:border-blue-500 focus:ring-2 focus:ring-blue-200 outline-none">
  <button
    class="w-full bg-blue-500 hover:bg-blue-600 active:bg-blue-700 disabled:bg-gray-300 text-white py-2 rounded"
    disabled>
    登录
  </button>
</form>

输入框聚焦时边框和光环变蓝,按钮有悬停和按下反馈,按钮禁用时变灰。把按钮的 disabled 去掉就能点。

小结

状态变体让样式随交互自动切换:伪类变体管自身,group-hover: 管父控子,peer-* 管兄弟控邻。下一篇讲深色模式,利用 dark: 变体切换整套配色。

上一篇
Tailwind CSS 响应式设计
下一篇
Tailwind CSS 深色模式