很多人学 CSS,是从选择器、盒模型、定位、Flexbox 开始的。

可如果你把时间往回拨,会发现它的开场根本不像一门“样式语言”的诞生史。

它更像一出很长的连续剧。

1994 年,Web 还更像文档网络,大家先吵的是:网页到底该听作者的,还是听用户的。

1996 年前后,CSS1 刚开始站稳,浏览器大战已经把“标准”变成了跑着追现实的东西。

到了 1998 年,CSS2 野心暴涨,规范越写越厚,浏览器却没法整齐跟上,最后不得不靠 CSS 2.1 回来慢慢还债。

再往后,Acid2 把标准支持变成一场公开考试,CSS3 模块化把规范救了回来,却顺手把前端推进了前缀、旧语法、新语法三代同堂的扫雷时代。

然后你熟悉的那些“现代 CSS 名场面”才陆续登场:

  • Grid 很强,但来得很晚
  • :has() 大家想了二十年
  • container queries 很长时间都像“不可能”
  • 有些规范明明写出来了,最后还是死在主流引擎的现实主义门口

所以如果只用一句话概括这套系列,我会这么说:

CSS 不是一门安安静静长大的语言,它是一路争权、一路补洞、一路被现实拧出来的。


这套系列,想先把哪条时间线讲清楚

这套 《CSS 江湖》,不是教程。

也不是“十分钟读完 CSS 编年史”的百科压缩包。

我更想把它写成一条能看见人物、冲突和后果的时间线:

  1. Web 刚开始流行时,大家为什么先在“网页该听谁的”上吵起来
  2. CSS 为什么刚出场就卷进浏览器大战
  3. 为什么 CSS2 会膨胀,CSS 2.1 又为什么像一次返工还债
  4. 为什么 Acid2、前缀、旧版 Flexbox 会把一代前端折腾得像拆弹
  5. 为什么有些能力拖十几年终于落地,有些却半路就没了

换句话说,这是一套关于 CSS 标准史、浏览器江湖、以及开放 Web 现实逻辑 的系列文章。


先给你看这部戏的大致分幕

如果把整套 CSS 历史压成一条主线,大概会是这样:

第一幕|1994-1996:CSS 不是先从语法开始,而是先从“谁有资格控制网页外观”开始

最早的冲突,不是属性名怎么设计。

而是 Web 到底该更像文档系统,还是更像作者可以自由摆布的视觉媒介。

这一幕里,Håkon Wium Lie、Bert Bos、早期浏览器作者、W3C 这些角色都会陆续登场。CSS 能活下来,不只是因为它能写样式,而是因为它提出了一套比“继续往 HTML 里塞展示标签”更像长久之计的办法。

第二幕|1996-2001:标准刚起步,浏览器厂商已经先打起来了

CSS1 还没来得及成为稳固秩序,微软和网景就已经把 Web 拖进浏览器大战。

从这时候开始,CSS 的命运就不再只是“这门语言好不好设计”,而是:

浏览器愿不愿意实现、怎么实现、实现到什么程度。

这也是为什么 CSS 的历史,从第一天起就带着浓重的现实主义。

第三幕|1998-2007:CSS2 想一次解决太多问题,最后只能靠 CSS 2.1 回来还债

这可能是整条历史里最典型的一次“规范理想主义撞上实现现实”。

CSS2 试图把很多事一起打包收进去,可浏览器并没有那个能力和耐心整齐跟上。于是标准越写越大,现实越跑越偏,最后只好用更务实的方式重新整理战场。

到了 Acid2 那里,故事又突然有了名场面气质:

一张笑脸,逼得整个浏览器江湖开始正视“标准支持”这件事不能再一直糊弄下去。

第四幕|2007-2013:CSS3 越红,前端越像在扫雷

模块化是对的。

可一旦它进入真实世界,开发者就会发现自己面对的是一锅半熟不熟的大杂烩:

  • 新模块陆续冒出来
  • 浏览器支持节奏完全不同
  • 厂商前缀本来是实验标记,后来却变成生产代码常驻人口
  • Flexbox 甚至能留下三代语法同堂的考古现场

这一幕最能解释,为什么很多人一提老 CSS 兼容史,就会本能地皱眉。

第五幕|2013 之后:现代 CSS 开始成熟,但不是所有梦想都能活着上岸

后面的故事,就不只是“新特性来了”那么简单了。

更值得看的其实是命运分叉:

  • 有些能力像 Grid,虽然慢,但属于平台迟早得补的欠账
  • 有些能力像 :has()container queries,需求一直很强,却被性能和实现代价卡了很多年
  • 还有些能力像 CSS Regions,规范写出来了,也试过了,但主流引擎最后觉得这条路不值得长期养

看到这里你就会明白:

CSS 的演化从来不只是“作者想不想要”,而是作者需求、浏览器成本、标准组织节奏、平台方向一起拉扯出来的结果。


推荐阅读顺序

01|CSS 江湖(一):谁有权给网页化妆?

1994 年讲起。CSS 诞生前,争的不是语法,而是 网页到底该听作者的,还是听用户的

02|CSS 江湖(二):标准还没定,微软和网景已经打起来了

CSS1 还没盖章,浏览器大战已经先开了。看懂这篇,就会明白 标准从来不是在真空里长出来的

03|CSS 江湖(三):CSS2 越写越大,浏览器越跑越偏

CSS2 想要一切,CSS 2.1 被迫回来还债。这里讲的是 规范理想主义是怎么被实现现实摁回地面的

04|CSS 江湖(四):一张笑脸,逼得浏览器厂商连夜补课

Acid2 为什么能成名场面?因为它把“标准支持”这件事,第一次变成了 谁都看得懂的公开考试

05|CSS 江湖(五):CSS3 越红火,前端越像在扫雷

模块化、前缀、旧语法、新语法、Flexbox 三代同堂。你会看到 CSS3 为什么越成功,生态越混乱

06|CSS 江湖(六):2012 年前缀危机,差点把开放 Web 拖回 IE6 时代

这是整套系列里最像“事故报告”的一篇。讲的是 -webkit- 为什么差点把开放 Web 又拖回单一引擎时代

07|CSS 江湖(七):标准都写出来了,为什么主流引擎就是不想实现

CSS Regions 这条线很冷,但特别狠。它会让你明白:规范存在,不等于主流实现愿意长期陪你做梦。

08|CSS 江湖(八):为什么有些 CSS 熬成了标准,有些却死在半路上

收束篇。把 Grid:has()container queriesHoudiniRegions 全部放在一起,看清一条总规律:什么样的 CSS 能活下来。

番外篇

09|CSS 江湖(番外一):Grid 为什么不是更早来到 Web

看懂这篇,你会更明白:Grid 不是“迟来的锦上添花”,而是 Web 拖了很多年才终于补上的布局欠账。

10|CSS 江湖(番外二):为什么 :has() 会难产二十年

这篇讲的是一个很多前端都喊了很多年的愿望,为什么会因为 性能恐惧和失效范围问题 拖到 2022 年才真正进入主流。

11|CSS 江湖(番外三):为什么 container queries 曾被说成“不可能”

这篇最适合接在 :has() 后面读。它会把问题从“某个特性为什么慢”推进到更底层的地方:平台为什么会害怕局部响应把布局因果关系搅成死循环。


如果你只想先读三篇

可以先看这三篇:

  1. 第一篇:看 CSS 最初到底在争什么
  2. 第五篇:看 CSS3 为什么把一代前端逼成扫雷兵
  3. 第八篇:看现代 CSS 世界里,什么样的能力能活下来

这三篇能最快把这套系列的时间线和脾气读出来。


为什么想写这套

因为今天很多前端对 CSS 的印象,其实都是结果,不是过程。

大家知道:

  • Grid 很好用
  • :has() 终于来了
  • container queries 总算能上生产了
  • 老代码里那些前缀看着很烦

可不知道这些东西背后,曾经吵过多少轮,拖过多少年,或者死过多少次。

而我一直觉得,如果不把这些过程连成时间线,你就很容易把今天的 CSS 误以为是一套自然长出来的东西。

它不是。

它更像一座修了很多年的城:

  • 有的路,是先修歪了再返工
  • 有的桥,是大家骂着骂着终于修通
  • 有的楼,图纸很漂亮,但最后根本没盖起来

看懂这些,回头再看今天的 CSS,你会更知道哪些能力为什么值得珍惜,哪些混乱为什么会反复重演。


先记住:CSS 的很多毛病,都是历史一层层压出来的

如果你平时把 CSS 当工具,这套系列也许能让你第一次把它当成一段活历史来看。

如果你本来就讨厌 CSS,这套系列也许会让你稍微原谅它一点。

因为你会发现:

它身上那些让人抓狂的毛病,很多并不是凭空长出来的,而是历史一层一层压上去的。