01|1998 年,CSS 突然开始“想要一切”

如果说 CSS1 还像个刚学会走路的小孩,先把字体、颜色、间距这些最基本的体面撑起来;那到 1998 年,它的野心已经肉眼可见地膨胀了。

1998 年 5 月 12 日CSS2 成为 W3C Recommendation。

你去看它的摘要,会发现那股气势几乎扑面而来:媒体适配、定位、可下载字体、表格布局、国际化、自动编号、用户界面相关属性,连 aural cues 都想收进来。

这不像一次小修小补,这更像一句豪言壮语:

“既然样式表已经活下来了,那就干脆把整个网页排版世界都接过来。”

站在 1998 年,这个想法其实很合理。毕竟 CSS1 已经证明了一件事:作者确实需要一套独立于 HTML 的样式系统。那下一步自然就是继续加。布局要不要?要。打印要不要?要。不同设备要不要?也要。

问题在于,规范可以一口气写很大,引擎却不能一口气全吃下去。

这就是第三篇的开头。

不是“CSS2 增加了哪些特性”,而是:当一门标准突然开始什么都想管,它会不会把自己先拖垮。


02|纸面上是一整座城,浏览器手里只有半包砖

CSS2 发出来的时候,纸面世界看上去非常美。

可你一旦把视线从规范正文挪到浏览器身上,画风就马上变了。

第二篇里我们已经见过那个场面:标准刚出,浏览器就先跑;浏览器一跑,细节就开始歪。 到了 CSS2,这个矛盾不但没消失,反而被放大了。

原因很简单。

CSS2 比 CSS1 大太多了。

大到什么程度?大到它不再只是“给文字穿衣服”,而是开始碰网页最容易出事故的地方:布局、定位、盒模型、打印、多设备、国际化。 这些东西,每往前推一步,都不是改几行渲染代码那么简单。它们会互相打架,会把旧页面拖下水,会把浏览器里原本就不太整齐的实现再撕开一层。

于是开发者很快发现:规范里写着“有”,并不等于浏览器里“真能用”;浏览器里“能用一点”,也不等于“别家跟它一样用”。

很多 90 年代末、2000 年代初写页面的人,对 CSS 的第一印象其实不是优雅,而是别扭

同一段样式,在这个浏览器里像样,在那个浏览器里走形。

一个属性,你刚写下去,心里先问的不是“它能不能表达我的设计”,而是:

“它到底会在哪几个浏览器里出事?”

这也是后来 hackquirks、条件注释、各种“为某某浏览器单独补一刀”的土办法,会长得那么茂盛的原因。它们不是前端爱耍花活,是现实先把人逼成了泥瓦匠。


03|于是 W3C 干了一件很不浪漫的事:回来还债

很多人第一次听到 CSS 2.1,会以为这只是个“修修补补的小版本”。

其实不是。

它更像一支被派回来收拾残局的清账队。

W3C 对 CSS 2.1 的定义很坦白。你去看 2004 年那份 Candidate Recommendation 的摘要,它直接写:CSS 2.1 是 CSS2 的修订版,它要修错、删掉那些支持得不好或根本没法互操作的部分,并把当时已经能稳定实现的东西,整理成一个“快照”。

这里最关键的词,不是 revision,也不是 correction。

snapshot

翻成大白话就是:

“别再许愿了,我们先把这个世界上已经能同时跑起来的那部分,老老实实记下来。”

这句话其实挺伤感的。

因为它等于承认了一件事:CSS2 当年的梦想,浏览器世界接不住。

所以 2.1 的气质,和 2.0 完全相反。

2.0 像一张宏伟蓝图。

2.1 像工程复盘报告。

前者在说“我们应该拥有一个怎样的未来”。

后者在说“别做梦了,先把地上的坑填平”。


04|最狠的一刀:实现不了,就删

到了 2004 年 2 月 25 日,CSS 2.1 进了 Candidate Recommendation

如果你去看那一版文档的 “Candidate Recommendation Exit Criteria”,会发现 W3C 这次把门槛立得异常硬。

几句话,几乎像军令状:

  • 每个特性,至少要有 两个可互操作实现
  • 这些实现必须是公开可获得、正在出货、非实验性质
  • 测试不够,不行
  • 实现太慢,继续等
  • 不是 CSS1 里本来就有的特性,如果到期还拿不出两个可互操作实现,就直接删

最后这一条,尤其狠。

它等于在公开宣布:

“浏览器做不到的功能,哪怕写进过 CSS2,也别赖在标准里占位置。”

这是 W3C 在 2005 年前后流程收紧时最有代表性的一面。以前大家还愿意先把理想写上去,盼着实现慢慢补;现在不行了,得反过来:你先证明这东西真能落地,再谈它是不是标准。

听上去很理性,对吧?

可一旦放到现实里,就很磨人。

因为这意味着 CSS 2.1 的命运,不只取决于编辑怎么写文档,还取决于浏览器团队有没有时间、有没有动力、有没有资源把同一件事做对两遍以上。

标准突然从“写得对”变成了“别人也得真做”。

它一下就慢下来了。


05|这份债单,来回退了很多次

接下来这几年,CSS 2.1 的履历表看起来简直像一份反复不过的考试记录。

W3C 的出版历史摆在那里:

  • 2004-02-25:Candidate Recommendation
  • 2005-06-13:又回到更早阶段,继续审
  • 2007-07-19:再进 Candidate Recommendation
  • 2009:又出快照
  • 2010-12-07:再次回到 Last Call Working Draft
  • 2011-04-12:Proposed Recommendation
  • 2011-06-07:终于成为 Recommendation

CSS2 在 1998 年 5 月成为 Recommendation,到 CSS 2.1 在 2011 年 6 月成为 Recommendation,中间整整拉了十三年。

十三年是什么概念?

够一个刚上小学的孩子读到初中毕业。

够互联网从“拨号上网还挺新鲜”一路走到智能手机时代都来了。

而 CSS 这边,还在慢慢把一份旧账本算清楚。

所以你现在再回头看,会发现“CSS 2.1 为什么这么久”这个问题,答案根本不神秘。

不是因为 W3C 突然懒了。

也不是因为编辑们闲得没事爱改稿。

而是因为大家终于意识到:如果标准继续只负责做梦,不负责和实现对账,那最后吃苦的还是开发者。


06|2.1 其实救了 CSS 一次

这里最容易误解的一点是:CSS 2.1 的保守,不是失败;它反而是 CSS 活下去的关键。

因为如果没有这次漫长、啰嗦、让人抓狂的回炉,CSS 很可能会一直背着一份谁都说支持、谁都支持不全的规范前进。那样的世界,写页面会比后来更痛苦。

2.1 干的事,说白了就是两步:

第一步,承认现实

第二步,把现实整理成新的底线

你可以嫌它慢,可以嫌它土,可以嫌它像在给青春期的 CSS 擦屁股。

但正因为它这么干了,后来的 CSS3 模块化才有了一个相对稳的地基。否则,大家会一直抱着一栋没封顶、没验收、每层还都漏水的大楼往上加层。

从这个角度看,CSS 2.1 很像一个倒霉的中间人。

前面接着 CSS2 的豪情万丈。

后面托着 CSS3 的持续扩张。

它自己最出名的事,却不是“带来了什么伟大新特性”,而是:

把前任吹过的牛,尽量收拾成还能住人的房子。


如果你只记一句,那就记这句:

CSS2 负责做梦,CSS 2.1 负责还债。


编者注(事实核对)CSS2 Recommendation 为 1998-05-12,以 W3C REC-CSS2-19980512 为准;其摘要明确写有媒体适配、定位、可下载字体、表格布局、国际化、自动编号、UI 等扩展能力。CSS 2.1 的“修错、删除支持不佳特性、以互操作实现为快照”表述,见 2004-02-25 Candidate Recommendation 摘要与状态说明。两份可互操作实现、公开可获得、非实验、否则删除特性 的要求,见同版文档的 Candidate Recommendation Exit CriteriaCSS 2.1 长期往返于 CR / WD / Last Call / PR,最终 2011-06-07 成为 Recommendation,以 W3C CSS21 publication history 互证。文中将 2.1 叙述为“还债”,属写作性概括,不是规范原文措辞。


关键人物速览

  • Bert Bos:CSS 共同奠基者之一,也是 CSS 2.1 时代长期参与修订的人。第三篇里很多“回炉重做”的叙事,都离不开他留下的历史总结。
  • Håkon Wium Lie:CSS 的早期共同推动者。到了 CSS2 阶段,他已经不只是提案人,更是这门语言“越长越大”那股原始野心的一部分。
  • Ian Hickson:CSS 2.1 CR 文档的编辑之一,后面也会在 Acid 系列里反复出现。这个名字适合从第三篇开始让读者熟悉。
  • Tantek Çelik:CSS 2.1 后期编辑之一,后来在前缀危机篇还会再次出场。读者提前记住他,会更容易串起后面的故事。

参考与延伸阅读

  1. CSS2 Recommendation(1998-05-12)
    https://www.w3.org/TR/1998/REC-CSS2-19980512

  2. CSS 2.1 Recommendation(2011-06-07)
    https://www.w3.org/TR/2011/REC-CSS2-20110607/

  3. CSS 2.1 Candidate Recommendation(2004-02-25,含退出条件)
    http://www.w3.org/TR/2004/CR-CSS21-20040225/

  4. CSS 2.1 出版历史(各阶段往返时间线)
    https://www.w3.org/standards/history/CSS21/

  5. Bert Bos《A brief history of CSS until 2016》
    https://www.w3.org/Style/CSS20/history.html

  6. Lie & Bert Bos 合著第 20 章 The CSS saga
    https://www.w3.org/Style/LieBos2e/history/Overview.html


下篇预告:一张笑脸,逼得浏览器厂商连夜补课。