810 字
4 分钟
Tailwind 4 与 Stylus 共存的边界

第一次看到项目里同时使用 Tailwind 4 和 Stylus 时,我的反应是:为什么不统一成一种?

用了一段时间后,我反而理解了这种组合。它们解决的不是同一类问题。

两种写法,两种职责#

Tailwind 擅长的是页面级、组合式的样式:间距、布局、对齐、响应式断点。这类样式变化频繁,写在模板里最直观。

Stylus 擅长的是组件内部、结构化的样式:伪元素、嵌套选择器、复杂的状态组合、动画关键帧。这类样式需要和组件结构绑定,放在独立的样式块里更好维护。

区域主要工具原因
页面布局与间距Tailwind改动频繁,就地调整
组件内部结构Stylus嵌套和状态组合更清晰
设计令牌CSS 变量跨工具共享
响应式断点Stylus 变量 + Tailwind统一数值来源

工具没有优劣,边界不清才是问题。

断点必须有单一来源#

最容易出错的地方,是同一套断点在两个工具里各写一遍。项目通过一个共享的 breakpoints.styl 把数值集中起来:

styles/breakpoints.styl
bp-sm = 640px
bp-md = 768px
bp-lg = 1024px
bp-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。大多数「改不动」的样式,其实是选择器优先级或者加载顺序的问题,而不是真的需要强制覆盖。

现在再问我为什么不统一,我的答案会是:统一工具很轻松,统一职责才难。后者做到了,前者反而没那么重要。

第 4 篇,共 12 篇本文属于系列

Tailwind 4 与 Stylus 共存的边界
https://www.ycera.cn/posts/tailwind-and-stylus/
作者
初月_Yuechu
发布于
2026-10-23
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取