CSS 的编写速度很慢,逐行进行,并且随着时间的推移,我们限制了设计系统中可能的范围。 以此为例
body {
font-family: 'Proxima-Nova', sans-serif;
color: #333;
}
仅需几行 CSS,我们就为整个代码库设置了默认值。 大多数元素(如段落、列表和普通的 div)将继承这些指令。 但是,我们在编写 CSS 时很少想到的是,从现在开始,如果我们想要另一种字体或颜色,就必须不断覆盖这些规则。 正是这些覆盖在维护和可扩展性方面造成了很多问题。 正是这些问题让我们心碎、浪费时间和金钱。
在上面的示例中,这可能不是问题,但我认为总的来说,我们没有认识到级联的真正优势和危险,以及它对我们设计系统意味着什么; 大多数人认为级联是为了让我们能够覆盖之前的指令,但我对此表示警告。 每次覆盖继承的样式时,我们都会使代码库变得更加复杂。 你花了多少时间检查元素,并滚动浏览每个规则,以了解元素为什么看起来是这样,或者长长的继承链是如何完全搞乱你的样式的?
我认为造成这种情况的原因是我们经常没有为元素设置正确的默认样式。 当我们想要更改元素的样式时,与其花时间质疑和重构这些默认样式,我们只是简单地覆盖它们 - 使情况变得更糟。
因此,我一直思考我们应该如何构建一个代码库,激励我们所有人编写更好的代码,以及如何设计我们的 CSS,使其不会鼓励其他人创建骇客类来覆盖事物。
我最喜欢的关于此主题的帖子之一是本月早些时候由 Brandon Smith 撰写的,他在其中描述了 CSS 如何变得如此复杂(重点是我的)
…永远不要比你需要的更明确。 网页默认情况下是响应式的。 编写良好的 CSS 意味着利用这一事实,而不是覆盖它。 如果可能,使用百分比或视窗单位,而不是媒体查询。 尽可能使用 min-width 而不是 width。 考虑规则,考虑你真正想说的话,而不是仅仅添加属性直到看起来不错。 尝试了解浏览器如何解析布局和大小调整,并谨慎地进行更改和添加。 **与 CSS 合作,而不是反对它。**
Brandon 的建议之一是完全避免使用 width
属性,而是坚持使用 max-width
或 min-width
。 在整篇文章中,他提醒我们,无论我们构建什么,都应该位于两个极端之间的范围内。 以下是一个具有不良默认样式的类的示例
.button {
width: 300px;
}
这个按钮可能总是、在任何地方都保持这种宽度吗? 在移动设备上? 在每个媒体查询中? 在每种状态下? 我高度怀疑,事实上,我相信这个类正是那种渴望被另一个类覆盖的类
.button-thats-just-a-bit-bigger {
width: 310px;
}
这是一个愚蠢的例子,但我曾在许多团队中见过这样的代码 - 这不是因为这个人编写了糟糕的代码,而是因为**系统鼓励他们编写糟糕的代码**。 每个人都有发布产品的截止日期,而且大多数人没有时间或意愿深入研究大型代码库并重构我提到的那些核心默认样式。 继续编写 CSS 更容易,因为它可以立即解决所有问题。
沿这条线,Jeremy Keith 前几天写了关于这个问题的文章
与需要了解循环、变量和其他概念的编程语言不同,CSS 非常容易上手。 也许正是因为如此,它才获得了“简单”的名声。 它在“不复杂”的意义上是简单的,但这并不意味着它很容易。 将“简单”误认为“容易”只会导致痛苦。
我认为,这就是一些第一次接触 CSS 的程序员所遇到的情况。 他们听说它很简单,所以他们认为它很容易。 但是当他们尝试使用它时,它却无法正常工作。 问题一定出在语言上,因为他们知道自己很聪明,而且这应该很容易。 所以他们责怪语言。 他们说它坏了。 因此,他们试图通过使它符合更具程序性的思维方式来“修复”它。
我不禁认为,如果他们接受 CSS 并不容易,他们会不那么沮丧。 简单,是的,但不简单。
CSS 很简单的理由是级联,但它并不像我们最初想象的那样容易,也是因为级联。 正是那些向下过滤到所有内容的默认样式,是这种语言最大的优势和最大的弱点。 我认为基于 JavaScript 的解决方案并不能像每个人争论的那样有效地解决这个问题。
那么解决方案是什么? 我认为,以范围设计,考虑不同状态,并将每一行 CSS 都视为建议,而不是绝对的、不可打破的规则,是向前迈出的第一步。 接下来该怎么做? 容器查询。 容器查询。 容器查询。
在我看来,一个好主意是遵循严格的模式,比如原子设计。 http://bradfrost.com/blog/post/atomic-web-design/
这样,你就可以创建作为模板而不是全局事物(如你的第一个示例)的高级级联类。
我基本同意,但在使用原子设计几个月后,我仍然发现很难确定某些元素属于哪个类别。
这只是提醒我,在开发界面时最难做的事情之一就是命名事物…… 通常非常相似的元素不能具有相同的名称(或类),因为它们不会共享太多特征……
但我确实同意,在范围内设计可能是解决方案。
难道你的第一个声明(即 body {font-family:…})没有覆盖浏览器的默认样式表吗? 这意味着一切都覆盖了某些东西。 我认为这没什么好担心的。
我认为你真正面临的问题是懒惰/缺乏结构技巧,或者更可能的是,生产代码的时间要求胜过代码完美性的个人要求。
当你每周制作几个网站,而且这些网站的价值很低时,这些事情就很琐碎,完全不是问题,“男孩们,覆盖掉!” 如果你在一个网站上工作一年…… 那么随着时间的推移,重新制作 CSS 的大部分内容就可以解决问题。
无论哪种方式,它仍然不是问题,是一个暂时的问题(预计将来会解决),或者仅仅是“对于客户来说,让它可维护并不值得…… 因为我们无论如何都会在一两年内重新制作他们的网站……”
我觉得这是一个很重要的问题,许多人都在努力解决。 CSS 有可能变成无法维护的混乱。 我尽力只改变必要的东西,并在适当的时候进行重构,但当时间紧迫或其他人编辑 CSS 时,事情很快就会失控。
此外,好的类名很难,即使使用 BEM 之类的东西也是如此。 我一直在使用 CSS-in-JS,它为我解决了一些问题,但我不知道这是否适合所有情况。
我想知道你是否主要是一名设计师?
看看一个关于谁难以保持 CSS 清洁 vs 谁没有,基于技术兴趣或设计与编程技能的调查结果将会很有趣。
我非常喜欢用 CSS 编码,作为一名半程序员/半设计师,我从来没有觉得 CSS 变得混乱或难以控制,而且这并非 CSS 独有,查看 http://thedailywtf.com/ 了解非 CSS 代码中的各种混乱。
我怀疑那些难以管理 CSS 的人,可能不是主要程序员? 我没有给事物命名的困难,事实上,我喜欢这个过程,并且根据项目的价值拥有许多命名层级(截止日期 * 生产预算 / 项目大小 + 维护预算 = 使用哪个命名方案)
我为维护要求极低廉价的网站有一个命名方案,而对于跨越多年开发的代码库,则有另一个命名方案。 为什么试图将一种方案强加到每种情况中? 放过自己和那些小项目,这样你就有足够的精力来处理大型项目。 :)
在我之前的评论中,我谈到了项目类型及其对维护的影响(这决定了命名方案),但总的来说,预算、时间、精力和技能可以解决任何编码问题。
我想说我主要是一名开发者。 我想我可能想得太多了,在寻找圣杯。 OOCSS 建议根据视觉语义命名类,我发现这有点难以命名 - 我经常以内容语义或功能为基础命名类,导致类很少被重复使用。
说实话,我最喜欢使用 CSS-in-JS,它非常适合我自己的 React 项目; 当我在工作时,我会与知道一些 CSS 而不懂编码的设计师以及不一定会了解 CSS 细微之处的后端开发人员合作。 当几个人像这样一起工作时,很容易最终获得数千行冗余/过时的 CSS。
这是一篇关于我期待阅读的文章的绝佳引言。
给你几个关键词:BEM 和 变量/常量。最终的包会很臃肿吗?是的,但我们已经开始做了——几乎没有级联,独立的模块等等,等等。