如今,这确实是一个令人担忧的问题。我从很多很多开发者那里听说了这个问题。他们的项目一年又一年地进行着,而他们似乎一直在做的事情就是向他们的 CSS 中添加内容,从未删除。这不仅仅是一种感觉,我之前也与跟踪此类硬数据的公司谈过。在跟踪他们样式表大小的五年时间里,它的大小一直在不断增加。
这可能因几个原因被认为是有问题的
- 文件越大,性能越差
- 开发者害怕 CSS
在我看来,#2 比 #1 重要得多。如今,CSS 的整体文件大小可能相当小,与图像资产甚至 JavaScript 负载相比。花哨的工具和互联网速度不断加快,可能会使 #1 变得不那么重要。
但害怕自己的样式是一个更大的问题。
“害怕”通常不是用来描述这个问题的,但我认为这就是问题的本质。人们经常谈论 CSS 的全局特性如何成为问题,或者说“CSS”中的中间“S”是唯一值得保留的。
“未使用的 CSS”
这个故事的一部分当然可以是关于删除项目中被确定为“未使用”的 CSS。我知道人们对这种工具的需求非常强烈。我觉得有些开发者几乎是急切地想要将他们的 CSS 通过某种高级工具进行处理,以去除任何不需要的东西。
这让我有点担心。这感觉就像在说:“是的,我害怕我们的样式表。我不想理解它们,我只是想要一些东西来帮我修复它们。”
以下是听说的一家公司是如何做的
- 他们向页面上的一小部分用户注入了一个脚本。
- 该脚本会查看 CSSOM 并找到该页面 CSS 中的每个选择器。
- 它还会运行一个 querySelectorAll(“*”) 并找到该页面上的每个 DOM 节点。
- 它会比较这两个集合,并找到所有似乎未使用的选择器。
- 为了获得最佳结果,它会在随机时间段后,针对随机用户集,在随机条件下触发此脚本。即使这样,它也需要在很长一段时间内收集大量数据。
- 在运行足够长的时间后,就会有一组似乎未使用的 CSS 选择器。
- 为了确保,会将唯一的背景图像应用于所有这些选择器。
- 应用这些图像并等待一段时间后,检查服务器日志以确保从未访问过这些图像。如果访问过,则表示该选择器被使用,必须保留。
最终,可以安全地从 CSS 中删除未使用的选择器。
哇!删除一些 CSS 需要花费大量工作。
但正如你所想象的那样,这相当安全。想象一下只检查**一个页面**的 CSS 覆盖率。你肯定会发现很多未使用的 CSS。一个页面,在一个特定的状态下,并不能代表你的整个网站。
网站有多个页面。JavaScript 在上面运行,影响 HTML。用户可能会登录,以不同的状态显示内容。网站上会发生动态的事情。为了真正了解哪些 CSS 被使用,你必须测试每个可能的页面,以及每个可能的交互排列,这是一个非常大的工作量。我相信你可以想象一些 CSS,它只适用于已登录用户在订阅过期后登录更新信用卡的特定选择菜单,而更新操作发生在一个模态窗口中,其中包含一个表单,由于卡是美国运通卡,因此以某种方式显示。
尽管如此,还是有一些工具声称可以帮助你找到未使用的 CSS
Chrome 拥有一个“覆盖率”面板(在我编写本文时,它在 Canary 版本中),可以告诉你哪些 CSS 被使用

它非常棒,你可以点击录制按钮,四处点击并执行大量操作(甚至更改页面),它会继续分析使用了多少 CSS。然后你可以看到 CSS 旁边红色或绿色的条形,了解哪些被使用或未被使用。
它存在与我之前描述的相同问题,即你只是四处点击不足以保证覆盖率。你很可能会错过一些边缘情况,如果你根据不完整的测试做出删除 CSS 的决定,你将给自己带来麻烦。
还有其他工具试图帮助删除未使用的 CSS,UnCSS可能是最受欢迎的。
UnCSS 做了一些聪明的事情,例如允许你列出一系列要一起测试的 URL,提供要应用的媒体查询,并运行 JavaScript。以下是他们的示例配置
var uncss = require('uncss');
var files = ['my', 'array', 'of', 'HTML', 'files', 'or', 'http://urls.com'],
options = {
ignore : ['#added_at_runtime', /test\-[0-9]+/],
media : ['(min-width: 700px) handheld and (orientation: landscape)'],
csspath : '../public/css/',
raw : 'h1 { color: green }',
stylesheets : ['lib/bootstrap/dist/css/bootstrap.css', 'src/public/css/main.css'],
ignoreSheets : [/fonts.googleapis/],
timeout : 1000,
htmlroot : 'public',
report : false,
uncssrc : '.uncssrc'
};
uncss(files, options, function (error, output) {
console.log(output);
});
我仍然担心这将难以配置(并保持配置),以至于它能提供 100% 的测试覆盖率。每次你编写一个新的 CSS 规则时,都需要确保它不会在这里触发误报。也就是说,假设你实际上使用此工具来删除 CSS。
更不用说,虽然它确实执行 JavaScript,但它没有模拟交互。
另一种方法:框架
想象一下,你使用了一个 CSS 框架,它提供了你想要应用的每个实用的样式。与其编写 CSS,不如应用框架应用的类来完成你需要做的事情。你现在将你的 HTML 类与这个框架紧密地绑定在一起,但你解决了不断增长的 CSS 问题。多年来,你的 CSS 将保持不变。
我不是 Tachyons 的专家,但对我来说似乎就是这样。在你习惯使用它之后,你会很快地编写出你需要的内容,并且还有一个好处,那就是这个几乎不会改变的静态 CSS 文件,没有人会害怕它。

这属于一个被称为 原子 CSS 的类别,其中有 许多参与者。原子 CSS 的一个版本是“程序化”的,你使用特殊的类和一个处理步骤来生成最终的 CSS。这样做的目的是,你现在不需要发送一个静态的 CSS 框架,而只需要发送你真正需要的少量 CSS。
John Polacek 最近 写到了这一点。他发现自己既遭受了 CSS 增长问题的困扰,也发现原子 CSS 不仅停止了这种趋势,而且还逆转了它。

即使是像 Bootstrap、Foundation、Materialize 或 Bulma 这样的框架也适合这里。关键是,如果你坚持使用框架,你就永远不会陷入害怕自己 CSS 的那种不理想的状态。
JS 中的 CSS
在 JavaScript 中管理样式(推荐阅读)也可以帮助解决这个问题。完全作用域于特定模块的样式,本质上易于删除。不需要模块,就不需要样式。
别太担心
我发现所有这些东西都很有趣,值得观察和思考。正如人们常说的:网络是一个很大的地方。我们每个人都有自己独特的情况。这个问题会影响我们中的一部分人,而且我敢说,可能只是一小部分人。
如果你不特别担心 CSS 的大小,也不特别害怕它,那就太好了!我大多数项目也是这样。
我只是有一种感觉(实际上是一个 预测),CSS 的未来是模块化的
当我们编写样式时,我们总是会做出选择。这是全局样式吗?我是否故意将此样式泄漏到整个网站?或者,我是否正在编写特定于此组件的 CSS?CSS 将在这两者之间一分为二。特定于组件的样式将被作用域化并与组件捆绑在一起,并在需要时使用。
我还不确定这方面的主要工具是什么,即使有的话。
这篇文章解释了我为什么不使用某些非常流行的框架(如 Bootstrap)的原因。我发现,当我在使用 Bootstrap 的网站上运行测试时,可能会发现高达 90% 的 CSS 未被使用。Bootstrap 带来了大量的 CSS,而对于大多数项目来说,这些 CSS 根本没有必要,而且对 SEO 也没有任何好处。
我个人更喜欢使用更小的框架并在此基础上构建,例如 Getskeleton。
Bootstrap 被拆分为更小的组件。您可以使用它的 SASS 版本省略不需要的组件。不应将 Bootstrap 的问题归咎于懒惰的开发者。
问题在于开发人员不知道何时使用 Bootstrap,而不是工具包本身的问题。
当您获得设计和/或正在处理可扩展项目时,Bootstrap 不应该是您的选择。首先,因为它会干扰您的 CSS 架构和约定,并且当您需要覆盖样式时会非常令人不知所措。
我个人(而且我认为大多数前端开发人员)如果给定一个设计,可以比实现 Bootstrap 并花费时间覆盖其类更快地为我的组件设置样式。
在我看来,Bootstrap 适用于一些快速的演示项目、博客或演示网站,在这些网站上您没有设计,并且不必过多考虑设计。除此之外,它都不值得。最好从头开始构建一个具有良好约定的可靠架构。
我最新的方法是
仅为全局元素创建主样式表。
为每个页面动态添加一个包含该页面 CSS 的样式表。
好的,所以我最终会拥有很多文件,并且访问者访问的每个页面都将有一个他们需要下载的文件,该文件不在其缓存中,但它是一个小文件,从长远来看更容易管理。
理论上,您可以将这两个文件合并为一个文件,方法是将全局样式导入页面样式表。
好吧,通常我在 WordPress 中这样做,因此在渲染时所有 CSS 都会被压缩和合并。
因此,服务器上有很多文件,我需要知道哪些文件属于哪个位置,但我会在每个文件的顶部添加一个注释,以便知道哪些页面/正在使用它。
通过这种方式,CSS 不会被浏览器缓存,我的意思是它会被缓存,但每个页面都有不同的 CSS,因此即使全局 CSS 也需要在每个新页面查看时下载,但这意味着每个页面的 CSS 都很小,而且更容易管理。目前,这对我来说是最佳策略,但未来可能会发生变化 :)
很棒的话题和文章。根据我的经验,这也是一个令人头痛的问题。我认为主要问题是我们不能只删除旧的 CSS。我们需要更好的工具来测试 CSS 和样式。
JavaScript 组件包含测试,这让我有信心重构它们。对于样式,我们还没有很好的测试方法。
有一些半自动测试实用程序(主要是屏幕截图差异),但这些仍然需要人工检查,有时很难说更改是故意的还是错误。
很乐意听听是否有其他人对如何测试样式有更多想法。 :)
从自由职业者的角度来看,没有什么比面对一大堆 CSS 更令人不知所措的了——追加比修改更容易。我认为这是样式表不断扩展的根本原因。
也许我们需要从根本上彻底改革我们如何_管理_ CSS——保持不变且神圣不可侵犯的核心样式(仅在经过正式审查后修改),然后在顶部添加模块化样式。
我在这里想到的是 Harry Roberts 的倒置 CSS 三角形,类似于https://www.groundwork.rocks/organisation/
我的策略是,每个标记文件一个 SASS 文件(在静态站点中,这可能是一个用于每个页面模板的文件,在 React 站点中,它将是一个用于每个组件文件的文件)。在每个文件中,嵌套选择器直接反映标记结构,并尽可能使用直接子选择器(>)。我确保组件的根类名称使用强大的命名约定是严格唯一的,或者在每个模板代表一个页面的情况下,我实际上会为每个页面使用 ID。使用嵌套选择器和直接子选择器都可以大大减少溢出效应,并将内容分解成模块化文件使整个过程不那么令人恐惧。
我也更喜欢这种方法。主要是在 WordPress 中工作,我倾向于将 Sass 分解为全局、页面和插件文件夹;全局包括用于标题、导航、页脚和排版的 Sass 文件,页面文件从 archive 和 single 等简单文件开始,插件根据需要创建 Sass 表以支持自定义样式——根据需要扩展。在 Magento 开发中,我喜欢以类似的方式处理它,使用全局文件和与模块匹配的组件文件,而不是 WordPress 中的页面/模板。当插件/模块从项目中移除时,只需删除 Sass 表,或者当另一个开发人员需要调整 archive 视图时,很明显应该去哪里,因此人们不必担心意外删除不应该删除的内容。
嗨,Chris,
我不敢苟同。CSS 是一种渲染阻塞资源——**与图像和脚本不同**——它直接与_感知速度_(用户体验)相关。而且不要让我开始谈论“世界上互联网的速度”…… :)
不,我会让你开始使用“将 CSS 关键路径注入到
<head>
中的<style>
元素中并延迟加载其余部分”。回复 @MaxArt
实际上,当你说这句话时,看起来你是在同意我的观点。
您是否建议这样做是为了加快页面渲染速度(因为 CSS 是阻塞资源),或者您是否建议_这足够了_,无需进一步提高性能?我有点困惑……
这就是我尝试将我的类分成功能和样式的原因之一。例如,当我想为元素添加一个 onclick 事件时,我会向其添加一个描述性类,例如
js-toggle-menu
,并在 JavaScript 中挂钩到该类,而不是直接挂钩到我用来设置其样式的类名。我参与过太多项目,在其中修改 CSS 类会意外地破坏某些功能——当然,这更多是标记问题而不是样式表问题!
一种对我帮助很大的方法,让我不那么害怕回顾旧的 css,就是为我的样式采用一种模式:BEM。
所有内容都会获得一个类,以及描述修改状态的类。它允许我创建独特设计的组件和通用组件,这有助于减少向我的项目添加 css。
使用 SASS 进行媒体冒泡也有很大帮助。将您的媒体查询放在每个类的旁边对于媒体查询的可维护性来说是一个福音。
如果您计划并以模块化的方式构建 CSS,那么可维护性就会内置其中。
当 css 失控时,这可能是前端开发中最令人沮丧和灰心丧气的问题之一……尤其是在您加入项目并看到一堵由大量嵌套选择器构成的墙时。
完全同意。使用 BEM 或类似的命名约定带来了始终将范围限制在您正在处理的 CSS 块中的优势,因此不会发生 CSS 覆盖。结合用于 CSS 块(BEM 块)的单独文件,您可以通过创建重复文件来清楚地知道 CSS 覆盖。
在某些情况下,它可能会导致 CSS 不必要地增长,例如多次重写网格功能,但这可以通过创建某种“实用程序”类前缀(例如 u-)来解决,该前缀将用于处理通用内容的类。
BEM 有助于增强删除未使用 CSS 的信心,但样式表通常会随着时间的推移而不断增长。我更喜欢使用原子 CSS,然后使用组合这些原子类的 CSS 模块的做法。因此,模块的样式在其 CSS 中是可访问的,但样式表永远不会增长太多。
与 UnCSS 处于光谱另一端的是 PurifyCSS。它可以接收一堆 html、js 文件(通过你喜欢的打包器/任务运行器的插件),它会解析类名、标签等,然后修剪你的样式,只留下用到的规则。
我使用这种技术已经很多年了。绑定到特定组件的 CSS 由该组件的唯一 ID 进行样式设置,而为全局使用编写的 CSS 直接针对类或元素。我发现用这种方式很容易保持我的 CSS 整洁。
不错的文章,我甚至遇到过一些网站,我们不得不拆分 CSS 文件,因为 IE 无法完全读取它们(由于旧版本中的选择器数量限制)。
我不同意你在 JS 中使用样式的解决方案:根据你的使用方法,嵌入的样式可能会应用于整个网站,而不仅仅是你的组件,因此,当你创建另一个组件时,你可能会继承之前组件的样式:你甚至都不知道自己在使用它们,并且在你删除初始组件的那一天,你将丢失也应用于其他组件的样式。
我认为,命名空间是解决方案。
我绝对会使用 BEM。
对于大多数 CSS in JS 解决方案,样式的范围限定在组件内,因此它们不会泄漏到另一个组件中。所以我不确定你从哪里得到这个想法。
谢谢,感谢这篇文章。它帮助我区分了核心 CMS 系统与框架以及它们之间的交互方式。它指导我更好地理解编码背后的逻辑。
这就是为什么我最近开始对我的 CSS 进行范围限定。所有将在每个页面上使用的 CSS,例如按钮、链接、标题,都将放在主 CSS 文件中。任何特定于页面的额外 CSS 都将放在仅在该页面加载的单独文件中。任何将由某些模块使用的 CSS,这些模块通过 PHP include 函数或使用 Ajax 插入到代码中,例如标题、页脚、通用弹出对话框,都将有一个单独的文件加载到该 Ajax 或 include 中。
这样每个页面只加载它需要的内容!
原子 CSS。不用多说。
作为前端开发人员,我们过去常常创建这些基于内容的令人惊叹的 CSS 组件,并根据其领域为它们命名,有时根据它们的功能使用通用名称……这很漂亮。
然后,有一天你参加会议,有人要求你更改组件的外观,只针对几个案例。没什么大不了的,只需为该案例添加额外的样式……等等。我是不是说添加额外的样式……它开始了。膨胀的 CSS 文件正在路上。最终,你做了太多更改,甚至不确定它还能做什么。所以,你只是创建一组新的样式。但是,你不能删除旧的样式,因为不知何故,某个完全无关的组件现在依赖于弗兰肯斯坦的某些部分。
这些组件也永远无法重用。这和硬编码一样糟糕。
原子 CSS,我使用 Tachyons 作为参考,提供了创建几乎任何样式所需的全部构建块。没有覆盖,没有 !important,只需边写边设置样式。首先,感觉有点像重复自己,但是,当你第一次需要更改某些内容时,你只需更改即可。没有副作用。这就是关键。如果你仍然需要组件化,只需将原子样式包装在一个类中并应用它即可。我个人更喜欢全力以赴,将这些类链接在一起。
这意味着你的 HTML 实际上解释了样式……你甚至不需要打开 CSS 文件就能看到应用了什么样式。
Tachyons 也是一个数学系统,这意味着你获得了一致性。不再有任意填充、边距、宽度和高度取决于开发人员。
无论如何,我完全感受到了 CSS 生长季节带来的痛苦,并且我同意原子 CSS 解决了我大部分的担忧。
好文章!
我非常不喜欢原子 CSS:它不仅将站点紧密耦合到使用的框架,而且完全破坏了 HTML 中类的语义值。
如果我们将表现形式的值放入 HTML 中,我们会犯错误,因为该值在某些情况下可能会被不同地解释:对于屏幕阅读器来说,像
p10
或helvetica
这样的类意味着什么?电子墨水显示屏上的bg-gold
又意味着什么?我们正在欺骗自己认为它们总是按照我们的预期工作,并且在从页面中删除语义值的同时,我们也使我们的元素更难以理解和调试(那个
<div class="p5 mh10 bodoni fl">
的目的是什么?)。更不用说媒体查询变得很尴尬了。是的,样式表变得最小或不存在(它们可以生成),但我们的 HTML 也被大量名称只有内部人员才能理解的小类填充。无论如何,CSS 很少带来性能问题……如果确实如此,是时候重构了!
我认为最好的方法是模块化方法:小型模板使用小型样式表,既易于维护,又具有隔离的范围。我们可以通过多种方式实现它,包括转换器、CSS in JS,以及如果我们无法使用更现代的工具,还可以使用像 BEM 这样的命名约定。
对不起,但“类的语义值”这种说法不存在,至少不是你推断的那样;据我所知,屏幕阅读器并不关心类属性。你可以为“微格式”等提出论据,但这与讨论无关,因为它们的目的超出了样式设置。关于这方面的更多信息,请参阅我撰写的这篇文章。
CSS 是性能的关键因素(CSS 是渲染阻塞资源)。我们有提取和内联“关键 CSS”的工具是有原因的。
无论如何,“是时候重构了”是你希望永远不必说的话;而“原子 CSS”最棒的一点是,根本不存在“重构”这种事。
最好的方法是解决问题的方法,因为并非所有开发人员都有相同的问题,因此不存在最佳方法……
Thierry,对不起,你误解了我所说的很多内容。
当然存在。当然,它不是针对最终用户的:它是针对开发人员的。因为代码不仅需要被使用,还需要被维护。我之前评论中说的是关于开发,这一点不清楚吗?
有一句老话:“永远要像维护你代码的人是一个知道你住在哪里的暴力精神病患者一样编写代码。”(John Woods,1991)。还有:“程序必须为人们阅读而编写,而只是顺便为机器执行。”(Harold Abelson,1984)。
绝对不是重点。只要页面第一次加载,它就是一个阻塞资源;通过延迟加载,问题基本上得到了解决。
这适用于任何对使页面尽快具有响应性至关重要的资源,包括脚本。重点是,你可以拥有相当大的样式表,重量达到兆字节,并且浏览器仍然可以很好地处理它们。相反,解析和编译 JavaScript 的成本可能会高得多(移动设备上每 kb 1-10 毫秒),并且这始终会阻塞主线程,即使是延迟加载也是如此。更不用说执行了。
CSS 的主要性能影响是关于绘制和重新布局内容。这就是 CSS 的“执行”,这可能会使页面变得迟缓,并且不会通过原子 CSS 解决。
无论如何,这仍然必须作为一项好的措施应用于原子 CSS。
说得对。糟糕的是,原子 CSS 不适合选择的理由有很多。
另一方面,模块化和范围限定的样式表基本上也消除了重构问题(如果需要重构模块化样式表,则很可能是需要重构整个组件——反之则不成立)。
这也可以作为意大利面条代码和猴子补丁的理由。即技术债务。
我为各种各样的网站和应用程序编写了样式表,从简单的登录页面到大型 CMS,我也测试了原子 CSS,但它似乎从来都不是我的正确选择,因为缺点远远超过了任何可能的收益。
最佳用例确实是无需维护的简单登录页面——但更常见的是,它们甚至不需要原子框架;以及出于相同原因的简单模型页面——这些页面通常可以通过设计工具导出,所有演示文稿都位于
style
属性中或 CSS 中,其中类反映了设计过程中使用的图层和组。对于其他情况,我很少看到比原子 CSS 更丑陋和不自然的现代 Web 开发解决方案。即使像 JavaScript 中的 CSS 和 HTML 这样的东西,相比之下看起来也更漂亮。
@MaxArt
我长话短说
我们在雅虎创建了原子 CSS,以将我们的样式表减少 50% 以上(大大提高了感知速度),促进团队之间组件的共享,促进更好的缓存,加快从原型到生产的时间,帮助新员工入职等等。所有这些都是重大胜利。“丑陋和不自然”可能是你不愿意使用它的原因,但我认为这不是反对使用它的有效论据。
嗨,我明白你的意思。但我就是不同意。
我想了解更多关于你所说的语义化的内容……因为这正是导致一些问题的原因。
对于新手来说,你的单个类可能比我的 8 个小类更难理解发生了什么。你在一个样式中放置了多个声明,对吧?所以现在,我必须打开样式表并查看该类中有什么内容。然后,该类可能有一个影响它的父类。所以我必须去那里查看,以此类推。你优秀的样式级联对你来说很有意义,而且只适用于今天。通常,你也会使用你的 HTML 结构来定义样式。div > ul > li.fun 完美无缺,对吧……但你实际上做的是引入了一种依赖关系。你不能只更改样式或标记。事情变得脆弱了。
业务领域也会随着时间的推移而发生变化,所以你可能认为用这种方式称呼它是有意义的,但你错了。创建 .order 类可能没问题,但同样,你放在其中的任何内容都不能在其他任何地方使用。如果你的老板过来告诉你,现在我们需要制作这个新东西,它与订单完全相同,但有一些差异,你会怎么做?复制粘贴订单模块并将所有内容重命名为新名称?你会尝试使共同的部分变得通用并对差异进行子类化吗?最终,你忘记了 CSS 只用于设置标记的样式。它不打算在之外提供含义,这个样式让标记看起来如何?这就是 CSS 应该传达的。而不是语义。
随着时间的推移,原子 CSS 更易于更改、更易于发现和更易于维护。至少在我的经验中是这样的。
感谢你的推荐!我完全同意 CSS 有一个模块化的未来。非常高兴能够参与这些工作。
我不禁觉得这个行业方向错了,在不了解真正问题的情况下创造了创新的方法。
无论使用哪种 CSS 方法,如果设计和增长的方式是自发的,那么 CSS 都会增长并最终变得难以管理,老实说,这种情况经常发生。
问题在于自发设计沟通不畅,例如,因为不存在参考手册。
对于大型项目来说,这尤其成问题。假设有 1 或 2 名设计师,通常要对太多利益相关者负责。通常,其他人会编写 CSS——这是一项技术工作,不可避免地会出现设计模糊不清且无法获得澄清的领域。
诸如“如果我们在此处显示的数据换行很多会怎样?”之类的问题经常被延迟或忽略,并为未来的自发性埋下种子。
反过来,CSS 作者未能与 HTML 作者沟通,而 HTML 作者需要准确理解满足设计所需的 HTML。
如果 CSS 作者假设 HTML 作者只需要非结构化的通用规则集,并且能够通过自己解决所有问题来拼凑出他们需要的东西,那就更糟糕了。
将未经文档记录的 CSS 提供给多个团队,每个团队都会生成类似但不同的 HTML 结构,并且碰巧 CSS 会在今天对所有工作进行理想的样式化——但未来的样式更改将暴露出这些结构的不同之处。
设计师请求对页面进行微调可能会导致 HTML 作者通过找到一个“足够好”的规则集来满足需求,但该规则集最终用于其他用途。一个未来的维护错误。
同样,CSS 作者会零星地创建新的相同但不同的规则集,以应对缺陷,例如当组件 A 包含小部件 B 时,对齐方式略有偏差。这将导致 HTML 作者发现多个可行的规则集,而不理解哪个是最合适的。
通常缺少的不是 CSS 方法,而是沟通,某种形式的 HTML 作者参考,例如网站的综合样式指南或模式库。
我有一种预感,许多创新的 CSS 方法收到的积极反馈被错误地归因。功劳实际上属于采用新方法所需的重写过程。旧的 CSS 比它需要新方法更需要重构,但新方法却获得了荣誉。
这是一个新的开始,所以我们当然对新版本感到满意,它满足了当今网站的需求,就像我们对之前满足当时需求的版本感到满意一样。但在我们这样做的时候,请让我们创建一些文档。
不要错过,如果做得正确,文档也将充当全面的测试套件。所有 CSS 规则集都可以演示,并在受支持的浏览器中进行测试,测试可访问性、设计一致性,所有这些都在一个地方。
如果我们有多个开发团队使用我们的 CSS,我们需要这样做,我们不想在开始解决布局问题之前学习如何导航不熟悉或难以访问的页面(例如数据设置、访问权限),这很耗时。
谢谢。
我同意你关于拥有文档的观点,但我们的文档路径可能有所不同。
任何 UI 的设计都必须支持自发性的能力。用户无法从模型或演示中告诉你他们对某件事的感觉。只有当他们真正使用该事物时,他们才会感觉到他们是否喜欢它。管理人员只是根据他们认为看起来很酷的东西来行动,开发人员只能猜测直到他们获得反馈。
你从反馈会议中出来后被告知要进行大量 UI/布局更改的情况有多少次……我们是否希望设计团队在开发人员开始实施概念之前更新样式指南?
如何让设计师和开发人员坐在一起,更新 UI,而不是生活在功能孤岛中?如果开发人员能够自由地更改 CSS/HTML 的任何部分,添加他们喜欢的任何内容,更改结构和样式,并且知道他们没有造成任何副作用,那将会是多么棒的事情?
所以……让我们找到一种快速迭代的方法,而无需大量的类和结构,然后,当最终用户对特定组件达成普遍共识时,让我们在那里将其包装起来并将其放入一些文档和样式指南中以供将来参考。
我完全同意文档很有价值,但要在弄清楚什么有效之后再进行。
当我说大型项目时,我指的是跨国公司或政府,它们通常有数十到数百个遵循相同企业主题和指南的服务。
在这些组织中,没有足够的 CSS 作者可以与每个 HTML 作者一起工作,并且大部分 HTML 创作都分布在全球各地,甚至外包给其他公司。
HTML 作者的技能和角色各不相同,从应用程序开发人员到所见即所得的内容作者。对于 HTML 作者来说,进行 CSS 编辑根本不会令人惊奇,即使他们确实拥有对此的写入权限,那也是混乱。
在不产生副作用的情况下进行此类编辑的能力恰恰是朝着相反方向的混乱。创建满足当今企业主题和可访问性要求的内容可能微不足道,但当主题发生变化时(例如公司合并或其他品牌重塑活动、浏览器兼容性缺陷、可访问性缺陷),任何偏离、覆盖或分叉 CSS 的服务都需要认真关注。简单的更改可能会产生巨大的财务开支。
我同意你需要先弄清楚什么有效,然后再向你的整个 HTML 作者群传达做什么以及如何做。希望最有经验的资源创建和维护示例文档,并且原型设计和现场证明的数量可以限制在可管理的范围内。
文档确实是迭代的,永远不会一成不变,项目团队应该充分了解报告机制,以便在他们预计遇到未知领域时能够及时获得他们需要的东西。他们的服务可以成为此类新组件的“测试版”,以在发布到更广泛的使用中之前获得信心。
然而,在这些组织中,大多数项目并没有做任何突破性的工作,只需要确切地知道该怎么做。通常,当此类项目表明他们需要一些新的东西时,他们忽略或忽略了现有的模式,尤其是在他们从他们正在重写的遗留系统驱动设计时。
我理解设计通常是不完美的,并在完全理解之前投入生产。但是,我不知道这是否证明能够自发响应是合理的。
企业主题的利益相关者肯定会对了解其设计的局限性感兴趣,以便他们可以更新其组件和指南,并将吸取的教训传达给更广泛的受众。它绝对应该是迭代的。
是的,在这种特定情况下,你可能是对的。
尽管如此,我在分布式团队中工作,并且可以让人们聚在一起。我不认为跨国因素在这里有任何影响,更多的是你描述的是功能孤岛,以及请求更改的报告机制。在这种情况下,一切都会变得缓慢而艰难。不仅仅是 CSS 创作。
尽管有这种情况,但你对整个行业做出了一个声明,即在不了解问题的情况下创建解决方案。所以当然,这种 CSS 创作方式并不总是适用于所有项目和所有团队……解决方案的作用是什么?这并不意味着该行业在创建它时方向错了。
尽管我确实认为大型跨国公司将更多地受益于这种方法。
是的,我已经说过,大多数情况下,缺少的是文档,无论 CSS 方法是什么,HTML 作者都需要了解要生成哪些 HTML 才能符合设计。
CSS 创作仅在早期迭代中缓慢,此时一切都是新的。可以理解的是,由于正在为无数 HTML 作者创建企业主题,因此有效地设置和传达每个投入的资金都是值得的。
诸如 GitHub 之类的公共或企业代码存储库已经拥有促进反馈、报告的工具,如果 HTML 作者拥有足够的 CSS 创作经验,我们甚至可以邀请拉取请求。
我预计一个能够大规模开发的严肃组织会有一小部分 CSS 作者和一个无限的 HTML 作者池(尤其是在一段时间内,企业主题通常具有持久性)。
因此,我认为让 HTML 作者编写过于繁琐的 HTML 并没有意义,仅仅因为这使得 CSS 作者的生活更容易。许多 HTML 作者更喜欢使用 HTML 元素的谨慎使用来编写降价。CSS 作者需要明白,为所有嵌套列表项元素提供 BEM 样式的类名并强制 HTML 作者编写不必要的 HTML 确实是一个坏主意。
许多 CSS 方法通过这种方式过度复杂化 HTML 来解决 CSS 作者的难题。CSS 基础知识被设计剔除;避免特异性,避免级联/嵌套,避免全局作用域——就好像那是一件真实的事情一样。它们都归结为“避免冲突”。
将冲突归咎于特异性、级联、嵌套或全局作用域,是在找替罪羊,而不是认识到冲突发生在 CSS 未被充分理解、缺乏适当文档、在没有预先考虑的情况下自发编辑以及设计人员在决定为组件设置样式之前没有花时间考虑最合理、语义丰富的 HTML 结构时。
许多 CSS 方法如此强烈地反对 CSS 的基础知识,以至于它们根本不是 CSS,而是 CSS 规避方案。
例如,BEM 和 Atomic CSS 在 HTML 中散布了不可避免且难以预测的类名(命名事物本身就很困难)。
尤其令人恼火的是,根据必要的 HTML 结构选择元素更为合适。例如,如果 CSS 根据 aria 属性值选择元素,则 HTML 作者只有在编写可访问的 HTML 时才能看到正确样式化的元素。如果 CSS 作者决定只通过类名选择元素,则 HTML 作者可能会逃脱编写不合格 HTML 的行为。
我读到很多人为他们创建许多小的 css 文件进行辩护,在某些情况下每个 html 文件一个。
这可能适用于某些 cms 或框架,或者 php,服务器只提供必要的样式。但是,如果您谈论的是带有 css 和 js 的标准 html,则存在缺点。尽管文件非常小,但获取大量文件可能比获取一个较大的文件花费更长时间:对于每个文件,都需要一个 get (a) 命令来往返于服务器。
这对于移动连接尤其重要,因为与有线/dsl/光纤连接相比,延迟要高得多。
(a) 我可能对最新的改进和当前标准是否可以获取每个 get 请求的多个文件有些不太确定。
仅供参考
似乎,每当我们开发人员遇到问题时,都会有人指向某个框架。我同意框架可能非常宝贵,但这确实取决于具体情况。
如果您像我一样非常控制自己的代码
框架有三个问题
您不仅必须在文档中搜索样式名称,而且还必须使用诸如 .helvetica 之类的类名遍布您的 HTML,无论您在哪里想要该字体,而不是像这样在您的 CSS 中写入
更重要的是,我认为开发人员需要共同制定一个编写和维护 CSS 代码的流程,而不是使用框架。
多年来,我偶然发现了许多我希望几年前就发现的事情,现在我可以编写比去年更易于维护的代码了。
我编码前的指导理念是:“如何为这个应用程序编写最少的代码?”,以便它快速且易于维护。
比如现在
我总是先编写移动端样式,并将平板电脑和桌面端所需的类调整放在媒体查询中,放在其自己的部分中。例如
…页面下方…
这样,如果我进行更改,就不会影响所有设备上每个断点的类。我知道顶部的代码将始终是移动端的,并且适用于所有设备。
我还将网站中经常使用的属性放在它们自己的部分中,并简单地继续附加需要该属性的类名,而不是在每个类的所有地方重复该属性,例如(例如)
如果我们能互相分享这些东西,我会很高兴。
框架很好,我认为它们可以作为补充,但如果您真的在为生产环境设计网站和应用程序,则不适合作为核心 CSS。
我相信有很多开发人员有很棒的方法来做事。我们只需要一种方法来互相分享我们的流程。
您在这里完全抓住了要点。您看过函数式 CSS 吗?它不是框架,而是一种编写 CSS 的过程的概念模型。更像是一种范式,而不是框架。它与您目前正在做的事情有一些相似之处。不过,也有一些框架是使用函数式 CSS 样式构建的。
二十年后,唯一编写网络代码的东西将是人工智能。我们(人类)甚至无法理解它。我们只需告诉人工智能我们想要什么,它就会完成剩下的工作。