为什么 CSS 那么难写?如何解决?
时间:2025-12-27 00:42 作者:独元殇 分类: 前端技术
[toc]
你觉得难,是因为你默认使用的「关注点混合」思想,在 html 里想设计的事。你需要看一下 亚当·瓦森 的故事,我觉得他是目前从根本上解决 CSS 难写的最完美的人:
Tailwind CSS 大家都认识吧?这是目前世界上做的最火的 CSS 框架!因为它就是好用嘛。
它的作者亚当·瓦森,多年来一直提倡「关注点分离」,虽然现在 AI 生成前端很厉害了,但 CSS 依然是很难去调的部分,很多时候还是需要我们手动去改、微调,不出意外,这情况仍会持续很久。
我们可以向成功者学习,学学 CSS 大佬 亚当·瓦森 的思想,肯定会对我们写小项目时,用处不菲。首先,我们从 HTML 的 class 说起,讲讲第一个概念,语义化分离。
语义化分离
简单说,就是在 HTML 里的 class 属性中,不要写那种「设计层面」的决策,比如说 文本颜色红色、文本加粗。就像这种:
<p style="color: red;">
错误信息
</p>
<div class="font-bold">
加粗标题
</div>
<span class="mt-10 mb-5">
间距元素
</span>
<table class="border-2 rounded-lg">
表格
</table>
他的这个理想情况下的意思就是,在 html 里,我们只考虑语义,而不是最终结果的效果。HTML 本身就是一个标记语言,就是标记,硬塞 设计 的话,会混乱!
这个在 bootstrop 里就用的太多了。这也是 bootstrop 为什么维护很费脑。
亚当·瓦森 的意思是,【根据元素内容赋予类名】!
就像这种:
<header class="site-header">
<div class="brand-container">
<h1 class="site-title">Infographics AI</h1>
<p class="site-tagline">Convert complex text into professional infographics instantly.</p>
</div>
<nav class="main-navigation">
<ul class="nav-list">
<li class="nav-item"><a href="#features">Features</a></li>
<li class="nav-item"><a href="#pricing">Pricing</a></li>
<li class="nav-item"><a href="#gallery">Gallery</a></li>
</ul>
</nav>
</header>
这个也是 CSS 禅意花园的思想(大家肯定认识这个站)。
只要分离关注点,那么可以实现,换个 CSS ,就能换套样式!乃至看起来是个新网站!
...
可,仅仅这样就可以了吗?渐渐你会觉得不对劲儿!
你会发现 HTML 和 CSS 依然有大量耦合,所谓 CSS ,只不过是在以 CSS 的写法镜像我们的 HTML ,维护起来依然费劲儿。
换句话,HTML 里你不关注设计了,但在 CSS 里,你既得关注设计,又得关注结构,好家伙。
怎么解决呢?
样式与结构解耦
如何能在样式设计时,不考虑结构?那就是【保持选择器特异性较低】!
可以看一下这个著名的参考站: https://getbem.com/introduction/ !
这是 大名鼎鼎的 BEM 结构。
下面是一个使用示例:
<style>
.author-card {
background-color: white;
border: 1px solid hsl(0, 0%, 85%);
border-radius: 4px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
overflow: hidden;
font-family: system-ui, -apple-system, sans-serif;
}
.author-card__image {
display: block;
width: 100%;
height: auto;
object-fit: cover;
}
.author-card__content {
padding: 1.5rem;
}
.author-card__name {
font-size: 1.5rem;
font-weight: 700;
color: rgba(0, 0, 0, 0.9);
margin: 0 0 0.75rem 0;
}
.author-card__bio {
font-size: 1rem;
color: rgba(0, 0, 0, 0.75);
line-height: 1.6;
margin: 0;
}
.author-card__bio--highlight {
font-weight: 600;
color: rgba(0, 0, 0, 0.85);
}
</style>
<div class="author-card">
<img class="author-card__image" src="URL" alt="A thoughtful professional in a modern workspace" >
<div class="author-card__content">
<h2 class="author-card__name">Alex Morgan</h2>
<p class="author-card__bio">
Alex is a passionate software engineer specializing in modern frontend architectures.
When not advocating for <span class="author-card__bio--highlight">BEM methodology</span>
or building accessible web components, you can find them experimenting with new CSS features
or hiking with their golden retriever. They believe clean code and clean mountains
both contribute to a better world.
</p>
</div>
</div>
BEM 的解决方案是这样的:
- 能复用的叫做【块儿】,比如 .author
- 不能复用的叫【元素, 比如 bio,写成 .card__bio
- 都不是的叫【修饰符】比如 highlight,写成 .card__bio--highlight
这个方式,被用的很多。
也完美解决了这个在 设计时 过度关注结构的问题。
如何处理设计得长得差不多的组件?
如果有俩组件,一个是 作者信息卡片,一个是文章预览卡片。结构几乎一模一样,CSS 基本能套用。那语义问题怎么解决,怎么命名?
解决方法一:直接复制「作者信息卡片」的 CSS 过来,改改名字。
解决方法二:用 Sass 的 @extend。
但两个都不行,前者代码重复、后者还是没解决「关注点分离」的问题。
解决方案三来了。直接分析 「作者信息卡片」和「文章预览卡片」的相同类别,建立第三个 CSS 类名,就叫 .media 。这样两个都能用对吧?!
但还是不完美。
我们现在解决了 CSS 的「重复问题」,但关注点分离依然不行。
思考关注点分离的本质
其实「关注点分离」,有可能并不是 CSS 和 HTML 的解决方案。
现在,坐下来,静下心,思考一下,问题是什么?
「关注点分离」的对立点,是「关注点混合」。
我们过去一直是后者,渐渐觉得不好用。所以思考前者,那前者就好用吗?
1. 关注点分离
优点:HTML 无法复用。
缺点:CSS 可以复用!
2. 关注点混合
优点:CSS 无法复用。
缺点:HTML 可以复用!
CSS 禅意花园采用第一种方法,而像 Bootstrap 或 Bulma 这样的 UI 框架则采用第二种方法。
其实是各有优劣哈哈!
好,那怎么才能中庸?其实做不到。
那,难道是想一下,站点的 HTML 更重要,还是 CSS 更重要吗?最后只能二选一。经过深思熟虑,CSS 显然更难写一点,那就选择 2 吧。
因为程序员肯定更喜欢写 HTML 吧。
高度可复用的类名
既然选择了走「关注点混合」的路,那就要创造一系列可复用的类名!
.card
.btn, .btn--primary, .btn--secondary
.badge
.card-list, .card-list-item
.img--round
.modal-form, .modal-form-section
在设计时,我们会发现:我们的需求越具体,那么类名越难设计。
比如在设计类名,有很多关键字是很难将其避免有「设计思想」的,就像 left right 了,元素添加间距 了。作者原文是这样说的:
这是 text-sm 还是 text-xs ? 我应该使用 py-3 还是 py-4 ? 我是想要 text-dark-soft 还是 text-dark-faint ? 你不能随意选择任何数值;必须从精心筛选的列表中进行选择。 最终你得到的是 10 或 12 种文本颜色,而不是 380 种。
就这样,又无穷无尽了!
那怎么解决呢?
实用主义优先
其实,就像工厂流水线一样,从经验、从市场调研里,获取到一个最中庸的解法。
然后以实用主义优先,提取出最常用最好用的。
否则模块岂不是无穷无尽了?
根据我的经验,采用实用工具优先的方式构建设计,相比组件优先的方式,能带来更一致的外观效果,尽管这听起来可能有些反直觉。
然后 亚当·瓦森 就完善、解决模块多的问题,最后开发了一个最通用且简单的解法,并封装成了一个项目,---- Tailwind CSS !
反正怎么说,你可以说这种办法是懒惰,套模板,但这种犀利的思维,就是解决了 CSS 难写难维护的痛点,而且是完美解决。
Tailwind CSS 现在就是世界上最火的 CSS 框架,为作者带来了 数百万,近千万美刀的财富。
这个经历,我觉得可以回答你的问题。