约 9 分钟读完 · 更新于 2026-10-21 · 文中每条都能在下面的配套工具里动手验证
| 要做什么 | Tailwind 类 | 等价 CSS |
|---|---|---|
| 水平垂直居中 | flex items-center justify-center | display:flex; align-items:center; justify-content:center |
| 占满一行 / 一屏高 | w-full / h-screen | width:100% / height:100vh |
| 左右留白并限宽 | mx-auto max-w-3xl px-4 | margin-inline:auto; max-width:48rem; padding-inline:1rem |
| 内部间距 | p-4 / gap-2(配合 flex/grid) | padding:1rem / gap:0.5rem |
| 圆角卡片 | rounded-xl shadow-md bg-white | border-radius:0.75rem; box-shadow:…; background:#fff |
| 文字尺寸与颜色 | text-sm text-slate-500 font-medium | font-size:0.875rem; color:#64748b; font-weight:500 |
| 截断省略 | truncate / line-clamp-2 | white-space:nowrap;… / -webkit-line-clamp:2 |
| 悬停与聚焦态 | hover:bg-slate-100 focus:ring-2 | 对应伪类包一层 |
p-4、gap-2、top-8 里的数字不是像素,是 0.25rem 的倍数:1 = 0.25rem = 4px(基准 16px),4 = 1rem = 16px,8 = 2rem = 32px。把设计稿的 px 换算成刻度:先除以 4 得到刻度号(20px → 5),不在刻度上再用任意值语法。这套刻度是 Tailwind 约束力的来源,也是它与手写 CSS 最大的行为差异。
sm:、md:、lg: 是 min-width 断点(默认 640/768/1024px),含义是「这个断点及以上都生效」——所以移动优先的写法是:基础类写给手机,md: 起逐级覆盖。状态前缀 hover:、focus:、disabled: 直接加在类前面,组合顺序是 状态 + 断点 + 类(如 md:hover:bg-blue-600)。任意值语法 bg-[#1e293b]、w-[37.5rem] 兜底一切刻度外的场景,但用得越多约束越弱——它是有意的逃生门,不是常规武器。
<div class="grid grid-cols-1 gap-4 md:grid-cols-3 md:gap-6"> <!-- 手机一列;768px 起三列 --> </div>
<div class="w-[37.5rem] bg-[#1e293b] top-[117px]">
短组件没问题;长页面靠抽取组件控制长度。真正难读的是「又用 Tailwind 又起一堆语义 class 名」的混合态——二选一并保持一致比纠结哪个更好更重要。
技术上可以,但每用一次就绕过一次设计令牌约束。经验法则:单一特例用任意值,出现第二次就提升为配置里的新令牌。
新组件先用 Tailwind 写;旧页面逐块替换,用类名互转工具把旧样式翻成等价类名再微调;全局重置(Preflight)放到最后开启,或先在隔离路由里启用验证。