第一次看到项目里同时使用 Tailwind 4 和 Stylus 时,我的反应是:为什么不统一成一种?
用了一段时间后,我反而理解了这种组合。它们解决的不是同一类问题。
两种写法,两种职责
Tailwind 擅长的是页面级、组合式的样式:间距、布局、对齐、响应式断点。这类样式变化频繁,写在模板里最直观。
Stylus 擅长的是组件内部、结构化的样式:伪元素、嵌套选择器、复杂的状态组合、动画关键帧。这类样式需要和组件结构绑定,放在独立的样式块里更好维护。
| 区域 | 主要工具 | 原因 |
|---|---|---|
| 页面布局与间距 | Tailwind | 改动频繁,就地调整 |
| 组件内部结构 | Stylus | 嵌套和状态组合更清晰 |
| 设计令牌 | CSS 变量 | 跨工具共享 |
| 响应式断点 | Stylus 变量 + Tailwind | 统一数值来源 |
工具没有优劣,边界不清才是问题。
断点必须有单一来源
最容易出错的地方,是同一套断点在两个工具里各写一遍。项目通过一个共享的 breakpoints.styl 把数值集中起来:
bp-sm = 640pxbp-md = 768pxbp-lg = 1024pxbp-xl = 1280px组件内部使用 Stylus 变量,页面布局使用 Tailwind 的响应式前缀。数值只维护一次,改的时候不会漏掉另一半。
一个具体例子
下面这段样式负责筛选器里的清除按钮。它需要绝对定位、圆形点击区域、悬停背景和图标尺寸,这些都属于组件内部细节,所以放在 Stylus 里:
&__search-clear position absolute right 0.5rem top 50% transform translateY(-50%) display inline-flex border-radius var(--shape-corner-full)
&:hover background var(--surface-container-high)而它在模板里的位置和外部间距,则继续交给 Tailwind:
<div class="relative w-full max-w-lg"> <input class="w-full" /></div>!important 要有主人
样式冲突时,最省事的做法是加 !important,但这也是最容易失控的做法。项目对它有明确约束:只在确实需要覆盖第三方或运行时样式的边界使用,并且要写清原因。
我的经验是:先找层级问题,再考虑 !important。大多数「改不动」的样式,其实是选择器优先级或者加载顺序的问题,而不是真的需要强制覆盖。
现在再问我为什么不统一,我的答案会是:统一工具很轻松,统一职责才难。后者做到了,前者反而没那么重要。
本站技术手记
连载中分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 10 天
部分内容可能已过时