CSS 设计中的错误(2013)

围绕 CSS 长期以来的怪癖——从级联与特异性规则,到 margin 折叠、`z-index` 以及默认的 `box-sizing` 模型——的抱怨再次浮现,开发者反思这些选择为何在几十年后仍持续制造困惑和 bug。许多人认为,CSS 以继承为中心的设计,以及缺乏更强的抽象和组合工具,推动了生态转向预处理器和像 Tailwind 这样的实用类框架,而这些做法又削弱了语义化样式。也有人为 Web 栈的向后兼容性和无处不在辩护,但仍有不少声音设想更清晰、更可预测的替代布局系统(约束式、默认 flex,或自定义渲染器),只是受限于既有标准和采用门槛。

范围:CSS 与整个前端栈

  • 有人认为“整个前端 Web 栈”本身就像一个设计错误,被锁定在旧技术里,不像后端那样灵活。
  • 也有人反驳说,现代 JS/HTML/CSS 可以构建极其复杂的应用并在各处运行,这是一个重大优势。
  • 对“前端”究竟算什么存在分歧(例如,服务端渲染组件和 React Server Components 让边界变得模糊)。

Web/CSS 栈的替代方案

  • 提出的替代方案包括原生跨平台 UI 工具包、类似 Electron 的运行时、Flutter/Dart、WASM + WebGL/canvas,甚至完全新的渲染器和格式。
  • 批评者指出,canvas/WebGL UI 存在深层次、可能无法修复的问题(可访问性、隐私、与浏览器功能的集成)。
  • 许多人指出采用门槛:你仍然需要浏览器支持它,或者它必须编译到 CSS/HTML,这限制了它真正能有多大不同。

级联、!important 和继承

  • 不少人认为级联和继承是核心设计错误:特异性规则很难推理,排查覆盖问题也很痛苦。
  • 也有人认为级联在合理使用时很优雅,并指出它最初是在浏览器、用户和作者样式之间做平衡。
  • !important 经常被误解;一条评论解释说,它是把规则移到更高的来源层级,目的是让用户可以覆盖网站,而不是作为一个通用的“覆盖一切”开关。

布局、盒模型和具体痛点

  • 常被提到的失误包括:box-sizing 默认是 content-box、坐标顺序不一致(垂直与水平先后顺序不同)、margin 折叠语义,以及 z-index 的别扭。
  • 有人认为 margin 概念上应该属于容器而不是元素,而且布局从一开始就应该是一个约束系统。
  • Flexbox 和 Grid 受到称赞,但也被认为来得太晚;早期那些用 float/table 绕行的做法被视为早期布局设计不佳的证据。

实用类、Tailwind 与语义

  • 很多人批评 Bootstrap/Tailwind 和实用类方法会侵蚀语义化 CSS,并且看起来像内联样式。
  • 也有人说自己最终成了不情愿的 Tailwind 信徒,认为隔离性和组件局部样式比全局抽象更重要。
  • 围绕 Tailwind 的 @apply、组合与重复,以及真正的问题是 CSS 本身还是现代以应用为中心的开发实践,存在争论。