即使您认为自己是 CSS 专家,在大型项目中也可能遇到过难以处理的复杂、迷宫般的样式表,而且它不断增长。 有些样式表就像一个混乱的、纠缠在一起的继承网络。

级联非常强大。 微小的变化会产生巨大的影响,这使得难以了解直接的后果。 重构、更改和删除 CSS 被认为是冒险的,并且以恐惧的态度进行,因为很难知道它在所有地方都被使用。
在使用新工具时,一件事通常很难说明,即 **何时,确切地说** 您开始使用它? 答案很少(如果有的话)是 *立即* 并且 *在所有情况下*。
在我的有限经验中,其中一种情况是在具有大型代码库的大型团队中。 **感觉是 CSS 会变得过大,团队成员开始害怕它,CSS 也就变成了一个“只追加”的工具,尽管这有点调侃,但却很准确。**
这时候就出现了这样一种工具,它承诺交付更少的 CSS 代码,并且通过一种方式(在经过学习曲线后)让每个人不再害怕它……我能理解这种吸引力。
原子 CSS 让一切变得简单
我不再需要考虑如何组织我的 CSS。 我不必考虑如何命名我的“组件”,在哪里划定一个组件与另一个组件之间的界限,什么应该放在哪里,最重要的是,当新的需求出现时如何重构这些东西。
原子 CSS 提供了一种简单、直观、易懂的方法。 类是不可变的——它们不会改变。 这使得 CSS 的应用可预测且可靠,因为类将始终执行*完全*相同的事情。 在 HTML 文件中添加或删除实用程序类的范围是明确的,让您确信不会破坏其他内容。 这可以减少认知负荷和心理负担。
命名组件是出了名的困难。 确定既有意义又足够模糊以便重复使用的类名既费时又费脑。
计算机科学中只有两件难事:缓存失效和命名事物。
– Phil Karlton
找到合适的抽象很难。 相比之下,命名实用程序类非常简单。
/* naming utility classes */
.relative {
position: relative;
}
.mt10 {
margin-top: 10px;
}
.pb10 {
padding-bottom: 10px;
}
原子类不言自明。 它们的意图和效果是显而易见的。 虽然用无数个类来填充 HTML 看起来很杂乱,但 HTML 比一道深不可测、庞大无比、难以理解的交织在一起的样式墙更容易理解。
在一个能力混合的团队中,可能包括对 CSS 兴趣和知识有限的后端开发人员,人们不太可能搞乱样式表。

处理风格变化
实用程序类 非常适合处理小的风格变化。 虽然设计系统和模式库如今很流行,但这种方法所认识到的是,会不断出现新的需求和变化。 关于组件可重用性的所有讨论通常在传递给您的设计模拟中没有得到体现。 虽然视觉和品牌一致性很好,但大型网站上的各种上下文环境使得某种程度的变化是不可避免且合理的。

如果我们想要一个组件在只有一个小的方面与另一个组件不同,该怎么办? 如果您采用了 BEM 命名约定,修饰符类可能就会失控——无数个修饰符,通常只做一件事情。 以边距为例。 组件的边距不太可能在一个组件中保持一致。 所需的间距不仅取决于组件,还取决于它在页面上的位置以及它与其周围元素的关系。 很多时候,设计会包含相似但*不完全相同*的 UI 元素,而使用传统的 CSS 处理起来非常麻烦。
很多人不喜欢它



原子 CSS 与内联样式有何不同?
这是原子 CSS 的批评者经常问的问题。 内联样式长期以来被认为是一种不好的做法,自从 Web 的早期以来就很少使用。 *批评者将原子 CSS 等同于内联样式并不完全错误,因为它们都存在相同的重大痛点。* 以下是一个例子:如果我们想将所有带有 .black
类的元素改为海军蓝,该怎么办? 我们可以这样做
.black {
color: navy;
}
这显然是一个*糟糕*的主意。
现在的文本编辑器非常复杂。 这样做感觉有点危险,但使用查找和替换将所有 .black
类更改为新的 .navy
类将非常简单。 真正的问题是当您只想将.black
类的*某些实例*更改为.navy
类时。
在传统的 CSS 方法中,调整组件的样式就像更新 CSS 文件中单个类中的单个值一样简单。 使用原子 CSS,这将变成一项繁琐的任务,需要搜索每个 HTML 文件,更新该组件的每个实例。 无论代码编辑器变得多么先进,都无法避免这种情况。 即使您将标记分离到可重复使用的模板中,这也是一个主要的缺点。 **也许这种手动劳动对于这种方法的简单性是值得的。 使用不同的类更新 HTML 文件可能很繁琐,但并不难。**(虽然有时我会在手动更新时遗漏某些组件的相关实例,从而暂时引入风格不一致。)如果设计发生变化,您很可能会需要手动编辑整个 HTML 中的类。
虽然原子 CSS 与内联样式具有相同的重大缺点,但它们并不是向过去倒退。 实用程序类在很多方面都比内联样式更好。
原子 CSS 与内联样式
原子类允许抽象,内联样式则不允许
使用原子类,可以创建内联样式无法实现的抽象。
<p style="font-family: helvetica; color: rgb(20, 20, 20)">
Inline styles suck.
</p>
<p class="helvetica rgb202020">
Badly written CSS isn't very different.
</p>
<p class="sans-serif color-dark">
Utility classes allow for abstraction.
</p>
上面显示的前两个示例,如果设计发生变化,将需要手动查找和替换才能更新样式。 第三个示例中的样式可以在样式表中的一个地方进行调整。
工具
Sass、Less、PostCSS、Autoprefixer……CSS 社区创建了许多内联样式所不具备的有用工具。
简洁
与编写冗长的内联样式相比,原子类可以是声明的简洁缩写。它减少了输入量:mt0
vs margin-top: 0
, flex
vs display: flex
,等等。
特异性
这是一个有争议的观点。如果一个类或内联样式只做一件事情,很可能你想要它做那件事。有些人甚至提倡对所有实用类使用!important
来确保它们覆盖其他所有内容。同样,内联样式的支持者将其无法被覆盖(除!important
外)视为一个卖点——这意味着你可以确定该样式将被应用。然而,一个类本身就足够具体,可以覆盖任何基本样式。原子类相对于内联样式的较低特异性是一件好事。它允许更多的灵活性。我们都习惯在 JavaScript 中更改类以更改样式。内联样式使这变得更加困难。
样式表中的类可以做内联样式不能做的事情
内联样式不支持媒体查询、伪选择器、@supports 或 CSS 动画。也许你想要对不同的元素而不是只对一个组件应用一个悬停效果。
.circle {
border-radius: 50%;
}
.hover-radius0:hover {
border-radius: 0;
}
简单的可重用媒体查询规则也可以变成一个实用类。常见的是对小、中、大屏幕尺寸使用类名前缀。以下是一个仅在中、大屏幕尺寸上应用的 flexbox 类示例
@media (min-width: 600px) {
.md-flex {
display: flex;
}
}
这在内联样式中是不可能的。
也许你想要一个可重用的伪内容图标或标签?
.with-icon::after {
content: 'some icon goes here!';
}
限制选择可能是一件好事
内联样式可以是任何东西。这种自由很容易导致设计混乱和不一致。通过预定义所有内容的类,原子 CSS 可以确保一定程度的样式一致性。原子 CSS 提供了一组经过精心策划的预定义选项,而不是从无限数量的选项中即兴发挥颜色和值。开发人员从这组有限的单用途实用类中进行选择。这种限制既可以消除不断增长的样式表的问题,又能保持视觉一致性。
以box-shadow
为例。内联样式对于偏移量、扩散、颜色、不透明度和模糊半径将有几乎无限的选项。
<div style="box-shadow: 2px 2px 2px rgba(10, 10, 250, .4)">stuff</div>
使用原子方法,CSS 作者可以定义首选样式,然后简单地应用它,而无需考虑样式不一致的可能性。
<div class="box-shadow">stuff</div>
原子 CSS 不是非此即彼
毫无疑问,像 Tachyons 这样的实用类框架越来越受欢迎。但是,CSS 方法并不是相互排斥的。在很多情况下,实用类并不是最佳选择
- 如果你需要在媒体查询中更改特定组件的许多样式。
- 如果你想用 JavaScript 更改多个样式,将其抽象成一个类更容易。
实用类可以与其他方法共存。最好是在全局定义基本样式和合理的默认值。如果你不断重复相同的长字符串实用类,很可能这些样式应该抽象成一个类。你可以混合使用组件类,但只有在你知道它们会被重用时才这样做。
采用组件优先的 CSS 方法意味着你即使没有重复使用也会为事物创建组件。这种过早的抽象是样式表中许多膨胀和复杂性的根源。
单位越小,可重用性越高。
看看 Bootstrap 的最新版本,现在提供了一整套实用类,同时仍然包含其传统的组件。越来越多的流行框架正在采用这种混合方法。
原子类不言自明。它们的意图和效果是立即显而易见的。
我不确定我是否同意这种断言。我认为原子 CSS(就像大多数命名约定一样)有一个学习曲线。原子 CSS 使用的缩写倾向于将声明缩减到尽可能少的字母;如果你不熟悉命名约定,它可能无法理解。
考虑 Bootstrap 4 及其用于间距的实用类:
.mt-4
,.px-2
,等等。对于熟悉原子 CSS 的人来说,这些都是清晰而连贯的,因为你已经有了可以作为解释基础的上下文。唯一不立即清楚的是“4”或“2”的实际值是什么。
对于那些没有真正接触过这种命名风格的人来说,没有什么是可以立即阅读的。我可以原谅新手完全忽略它们,并假设它们是由某些后端应用程序为辅助目的(例如通过类定位元素)生成的。
同意。你会如何称呼一个用于应用阴影的类?我假设是 bs-… 但然后你如何称呼用于边框样式的类?
这些约定系统归根结底只是约定,在某个时间点,团队必须决定使用它们,而且没有两个团队会做出相同的决定。这种系统或其他系统之间的学习曲线似乎并没有更难或更容易。
我认为实用类在使用上需要非常通用。
.px-2
的想法似乎意味着对 x 的填充为 2 像素,或者其他一些完全微不足道的样式问题。以我的经验,实用类通常最好使用两层。如果它们是框架的一部分,它们只会影响非常通用的东西,比如宽度、位置、布局。而且它们的数量很少,从而限制了学习曲线。
如果它们是网站样式的一部分,那么它们是网站定制的,因此学习曲线很短,因为它们侧重于当前网站的需求。
我认为,试图将通用的框架样式和定制的网站主题都合并到同一批 CSS 中,是 Bootstrap 等框架最大的缺点之一,也是学习曲线最大的增加。
但是,从长远来看,一切都有一条学习曲线,据说是应该在越过这条曲线后让开发变得更快/更流畅。所以,对于任何选择的系统,您的里程可能会有所不同。
@travis
在我的项目中,我倾向于使用更长的 CSS 类名,特别是为了避免这种歧义。以你的
box-shadow
为例,我可能会使用这样的命名约定第一部分(
_ui-effect
)将“容纳”我创建的所有对界面通用的设计增强功能。就我而言,它满足了所有要求:它清楚地表明了它的范围(UI)、它所做的事情(应用阴影),并且可以与其他类组合来增强其应用的任何元素。好吧,这里还有谁记得 CSS1 和(前 x)html 的日子,当时标签是一件事。在过去十年中,为了改进关注点分离和 Web 语言的 DRY 特性,已经做了很多工作。虽然我看到了这种方法的优点,但它感觉像是与所有已经完成的工作背道而驰,并且忽略了现代 Web 标准的全部意义。
我觉得最后一个副标题确实是原子 CSS 的正确用例——不是作为整体框架,而是作为一种工具,在我们遇到不可避免的会使你的 CSS 膨胀的边缘情况时,可以将其纳入我们的工具箱。
IMO 设计模式就是模式,应该谨慎使用和忽略,并根据项目需要进行。
*font 标签是存在的事情的日子。
我应该预览一下那条评论,我忘了我不能在这里使用尖括号。
我记得 font 标签!
感觉好像有两件事正在发生。一个是需要实用类型的类来定位在原始设计规范中没有包含的某些东西。我理解这一点,并承认有时模式可能想要 flex,有时不想要 flex,这取决于其内容。
但是,要完全使用这些类在 html 中构建模式设计……这看起来很笨拙且耗费精力。
今年我实际上在一个项目中使用过这种方法,结果发现自己总是被 pd10 搞得晕头转向。它是 padding x&y 吗,还是只有 y,只有 x,现在每个都要单独设置吗?在那个时候,我认为这是一种非常浪费的方法。
直到,我开始使用它们作为纯粹的设计工具来改变独特模式的形状。问题是,它的独特性质让我质疑应该使用 ID 还是使用类。
如果有人不同意使用原子 CSS 或函数式 CSS,请看一下,你可能没有意识到它已经存在于所有地方,并且是 Bootstrap 的一部分。Kickstarter 也使用它。
除非必要,否则请减少命名。
不,它不值得。
现在可能会很老套地归咎于千禧一代,但任何头脑清醒、拥有二十年前端经验的人(当时被称为网站管理员),都不会把 font 标签复活为实用程序类,并将其称为一种方法。为什么要牺牲设计一致性和语义来遵循一直以来都是不良做法的做法?我们不需要回到那些糟糕的地方,现代 Web 标准已经带我们远离了那里。这就像有人渴望黑暗时代卷土重来一样。
我会给原子 CSS 支持者大约 5 年的时间来意识到他们犯了一个多么严重的错误。然后他们会想出一个花哨的名字和幻灯片,用来解释如何按照本该使用的方式使用 Web 标准。
语义?什么语义?http://cssmojo.com/opinions_of_leaders_considered_harmful/
雅虎大约在 5 年前就开始使用这种方法,据我所知,他们没有计划回到过去,不得不依赖超过 100Kb 的 CSS 来为页面设置样式。
—— 前 网站管理员
我认为这类文章最大的问题是,它们似乎暗示 CSS 世界发生了巨大的变化,而实际上,它们只是在描述一种已经存在多年的现象。
我有一些“原子”类,它们只设置定义的宽度,将元素设置为内联块,以及其他一些类,仅此而已。它们在应用程序环境中非常有用,我已经使用它们很多年了。但我不会把所有样式都迁移到这种方法。
此外,我不使用原子样式类进行实际的视觉样式设置,我认为这可能是你真正关心的问题,成熟的 CSS 开发人员无论“趋势”如何都不会把自己逼入死角。
所以,请谨慎对待所有信息。这些作者必须考虑如何在分享信息的同时,既要宣扬它的优点,又要避免对行业造成过大的影响。但我认为你的评论是他们的甜味中的酸味,对于平衡的观点来说是必要的。
“实用程序类可以与其他方法共存。”
我一直使用这种方法。通常我会遵循 BEM 命名方案,但是总会有少量实用程序类用于元素的临时修改,例如,.mt-0 用于 margin-top: 0 !important;
我只是想提一下我最近一直在尝试的几个框架,看看其他人对它们的体验如何。
https://www.iotacss.com : 基于 SASS 的 OOCSS 框架
还有
https://tailwind.org.cn : 基于 PostCSS 的实用程序类框架
我越来越倾向于在项目中使用 PostCSS,但 iotaCSS 的命名空间实用程序类名称和响应式配置给了我很大启发。还有其他人使用它吗?
我还想说,过去一两年,我几乎所有项目都是按照 https://sass-guidelin.es/#the-7-1-pattern 结构和使用 BEM。这让你可以创建离散的组件,但也有一个文件夹用于页面特定的样式。特别是考虑到上面提到的边距问题,我不相信页面范围内的样式不是一个不错的解决方案,可以在不同的上下文中稍微修改组件。
请继续发表评论!
我很高兴我可以独自工作。我可以使用我喜欢的命名约定,比如将类命名为 pluto 或 martha。
请不要这样做。作为接过另一个开发者使用这种方法的代码的人……求你了……
抱歉,我不喜欢 bootstrap 和这种原子方法……代码很糟糕
我会继续以我的方式编写 css 代码。
我最近一直在使用 https://tailwind.org.cn/,并且很喜欢它(由你在这里引用的 Adam Wathan 共同创建)。我不再讨厌 CSS 了。
我认为,如果你习惯使用 bootstrap,那么你可以编写原子 CSS。但是,如果你希望类解释内容而不是样式,那么不要同时使用原子 CSS 和 bootstrap。
就是这样!这就是 SASS、LESS、PostCSS 等工具发挥作用的地方。
我最初开始使用 Tachyons,然后编写了一个 mixin,它输出相同的模式。现在我在创建组件时看到了可重复的模式,我正在扩展 mixin 以允许使用多个属性。这需要自律,不要偏离这种方法太远,但仍然可以让我享受到相同的灵活性以及编码速度,最后 CSS 文件的输出大小仍然很小。
你可以采用概念,但不要将其视为规则,就好像语言函数一样。
还有一件事。CSS 中的 !important,由于内联或其他原因,即使只有内联……也是一个巨大的倒退。令我困扰的是,这两种情况仍然会发生。
我的猜测是,如果你编写了很多 css,你已经至少做了一点这种事情。我一直没有给它起名字,但我一直有一小部分实用程序类在使用。
这里只是我个人的经验(不是科学的,只是轶事):我使用原子 css 技术(我自己开发:https://github.com/internetErik/atomic-scss),我已经使用它们大约五年了。我还使用 BEM 名称来表达一些语义,但除了在断点处的一些东西之外,这些类几乎没有实际的样式。语义名称更便于阅读,并易于选择代码。
根据我个人的经验,使用这些技术,我还没有遇到过 css 的任何传统陷阱。此外,团队成员,即使最初持怀疑态度,也会尝试使用它,并在自己的项目中开始使用它。
我在原子方面的一个重要经验是,有些人非常讨厌它,并且似乎会不遗余力地让使用原子的人感觉自己没有经验,并且过去已经吸取了教训,现在没有经验的开发者又犯了同样的错误。我经常认为,对于新开发者来说,这种说法没有那么敏感,而且我认为这种说法也不正确。我使用原子 css,并且在 CSS 出现之前(bgcolor= 等)就开始制作网站,我相信许多使用原子 css(或样式化组件等等)的人也是如此。我相信有一些新的开发者正在尝试使用原子 css,我不认为他们需要被贬低。
对于框架来说,当然有效,但对于网站来说,这简直是一团糟。
Chris:“对于框架来说,当然有效,但对于网站来说,这简直是一团糟。”
对于使用自己的 Shed CSS(基于原子)库的 TED 网站来说,并非如此。你肯定听说过 TED 演讲吧?
你把一个老笑话搞砸了:计算机科学中只有两个难题:何时清理缓存、命名事物以及计算动态列表中的项目数量。
过去 3 年,我一直在轻松地使用 basscss。
不,不,不!
这篇文章的唯一优点是它清楚地说明了原子 CSS 的缺点。
为页面设置样式就是试图将设计转换为代码。当然,你会在某个地方应用一定的边距,在另一个地方应用内边距,在另一个地方应用字体大小等等。但是如果你真的想转换这个设计,你可能会给一个“框”赋予一个类,并在这个类中应用许多不同的属性:边距、内边距、边框、字体样式等等。这让你明白设计不仅仅是一个边距,而是一组事物的集合。
有些人说BEM很丑,因为它有冗长的名称和重复,但如果你只使用原子类,它会更糟!当你阅读原子类的集合时,你必须阅读每一个类才能弄清楚最后应用了什么,并且可能需要了解网站才能意识到,哦,在这个特定的块上,我们没有应用我们在任何地方都应用的这个边距。
而使用BEM,你可能只有一个类,以及一个表示“特定情况”的修饰符来处理这种差异。
但我同意“实用程序类”在某些情况下实际上很有用,并且可以肯定地使用“!important”。但你几乎总是可以不用。至少你应该尝试一下;-)
原子CSS不一定意味着拥有有限的类/规则集。有一些静态解决方案(页面上提到了几个),但也有一些动态解决方案(例如ACSS[1])。
静态解决方案比需要的字节更多;有些还可能在不同的项目中强制使用相同的样式(例如,当它们的任意值不打算更改时)。
另一方面,动态库不会限制作者可以使用的样式,并且在性能方面没有成本,因为它自动创建/删除CSS规则“按需”。
就像所有与CSS相关的东西一样,这两种方法都有其优缺点。
[1] https://acss.io
我期待着看到原子CSS作者如何处理Grid规范。我无法想象它能正常工作。也许可以用浮动和Flex-faux-float-grid以及col-xs-whatever,但不能用Grid,除非限制它的功能。
所以,我坚信“适用的工具,适用的工作”。我诚实地不能说狂热者是否正在破坏被错误使用的好的想法,但我认为大多数CSS技术都重叠并且有特殊的用途或一般的用例,但很少(或从未)两者兼而有之。
这是一个我非常喜欢的Grid通用方法。但我并没有在所有地方使用它,我是在很多表单布局的受控环境中使用它,这些布局从这种方法中获益。
Grid的实用程序类。
在Codepen中使用示例
它主要用于表单构建。我没有将其用于其他用途。但我不能说这是否符合“原子CSS”的定义,但似乎如此。而且我肯定想不出使用任何其他方法更容易做到这一点。
从你的角度来看,有什么理由不适用它吗?
我想象Grid可以从不同的角度来看待,与之前的不同。描述实用程序的方法,例如col-2fr,注定会失败,例如,当需要在隐式网格上的特定坐标上使用行/列组合的实用程序时会发生什么?
Grid具有巨大的潜力,但它将受到其用户的想象力的限制。
如果你感兴趣,我在这里写了很多关于它的内容。
然后你就创建一个符合要求的东西。但这并不自动意味着所有通过实用程序快速轻松解决的情况都被否定了。
你似乎陷入了常见的陷阱,即每个解决方案都必须是通用的和完美的,这就是我们如何产生圣战的。
使用适合工作的工具。实用程序类对于大多数常见的需求案例非常有效,而不是自定义需求。基于边缘用例反对实用程序类的论点违反了对问题解决的常识方法。
我认为随着我们更多地尝试使用网格本身,这个问题会随着时间的推移而得到解决。即使没有100%解决,也不会阻止使用原子和一些其他方法的组合来充分利用网格。也许原子能够处理所有事情,但我怀疑我会将原子用于常见情况,并在事情变得更复杂时(或者如果原子CSS的API太难学)回退到我的BEM类。
恕我直言,原子CSS的概念被严重误解了。当我第一次看到语法时,我被吓坏了……直到我意识到记住实用程序类的名称很容易……大多数原子CSS的反对者忽略了一个事实,即你不会使用原子CSS来使用20个类来为每个元素设置样式。我发现定义整个项目中使用的通用基本样式(排版、颜色等)非常有效……在某些特定情况下,你可以应用实用程序类……说实话,最多使用2-3个类就能得到所需的状态……所以你的HTML不会增长太多……
这就像制表符与空格之争。我个人在我的CSS中做了很多这样的事情,比如red-text、blue-text类等等。如果你有3-4种字体大小,也是一样的,所以对我来说,
<h2 class="red-txt alt-font-a ft-sz32">
是一种更简单的方式来查看CSS。客户也喜欢它,如果他们需要在CMS的HTML编辑器中查看CSS,它几乎就是英文。我大学里有个同学会在类中写奇怪的东西来保持理智。像sideshow-bob这样的类,我认为没有正确答案,假设你没有写糟糕的代码。
我过去尝试过这种方法,主要使用Bootstrap的框架类。我放弃的原因是样式泄漏。
也就是说,我的类相互冲突。一个会无意中影响另一个子元素,并破坏布局。最终,我不得不阅读HTML才能弄清楚类是如何组合起来产生错误的布局的。
我目前首选的解决方案是基于Jareware的CSS架构规则的范围严格的CSS。
最近的相关文章
在使用原子CSS构建网站后,我得出结论,它很难维护也很混乱。每次查看HTML时,你都要构建一个模型来描述每个元素应该做什么。移动端的覆盖令人沮丧,导致CSS和HTML都膨胀。
经过一番折腾,我得出结论,混合方法是可能的。例如,将某个元素垂直居中在一个div中。以下是经典的做法
混合方法是抽象出执行函数的部分,并在需要的地方在HTML中重复使用它。
问题是哪些应该以原子方式处理,哪些应该以经典方式处理。
我愿意尝试这种方法,但我几乎所有工作,都一直是在构建我控制标记但我控制不了样式的Web应用程序。换句话说,是单一代码库,由许多公司使用,每个公司都有自己的主题(有时由第三方开发)。
为每个客户创建单独的HTML模板文件,仅仅为了更改原子类,这将是一场噩梦。基本模板中通常有很多逻辑、可访问性标记或元数据;如果你需要更改方法或更改数据模型,去每个客户的主题文件夹更新模板将是一个维护噩梦。
令我惊讶的是,没有人谈论主题。对于这种情况,CSS禅意花园推广的方法不仅是唯一可行的方法,而且是唯一可能的方法。
感谢你提出这个问题。我认为一个人所做的工作类型以及公司类型,是决定原子CSS是否适合的重要因素。
如果我不是在实现网站的外观,那么使用原子CSS基本上是不可能的。这包括我正在实现一些东西,然后需要重新主题化。
几年前,我听到一些人争论,我们应该专注于可重复使用的CSS,它可以应用于各种标记并使所有内容看起来一致,还是专注于可重复使用的标记,它可以轻松地重新设计。我从未理解为什么他们选择了他们选择的路径,因为没有人描述过他们正在从事的项目的实际情况。我怀疑他们都是Web开发训练营的学生,他们还没有构建任何真正复杂的东西。
原子CSS什么时候会被丢弃,因为它是什么?一个糟糕透顶的想法!
几年后,每个人都会被这种非常糟糕的方法追捕。
我是一名设计师,与很多后端开发者合作。这些可怜的人不必忍受这些CSS类混乱在他们的HTML标记内部。
他们需要添加简单的CSS类,然后我可以通过CSS定位它们。关注分离?你会说吗?
原子CSS唯一好的地方就是它的名字。
虽然你所说的情况可能是真的(也可能不是真的,取决于那些可怜的后端开发者喜欢做什么),但并不是每个人都有一个不同的团队(甚至是一个人)来实现CSS和HTML。我使用原子CSS,并且我自己编写了项目中使用的CSS和HTML。也许如果你正在进行你更喜欢使用其他方法的项目,但我不知道这如何意味着原子CSS是一个糟糕的想法。愿意解释更多吗?
一旦你想要实现一个与正常方案平行的夜间方案,class=’color-dark’ 就会失效。
我认为这种技术很容易错过 CSS 提供的适应性可能性,比如媒体查询。(但也存在 CSS 的怪癖——它将设计转移到组件/HTML 的编写者身上,这可能是一件好事,也可能不是。)
在某些情况下,这可能有一些好处,但我认为它并不能带来最佳、最具适应性或最易维护的设计。
作为原子 CSS 的用户,我对这个问题的可维护性很感兴趣。因为我切换到原子 CSS(大概 5 年前)是为了避免可维护性问题,而且再也没有回头。
似乎存在不同类型(以及项目不同部分)的可维护性。
然后还会出现一些问题,比如:客户有一个组件,现在他们想要在其他地方使用这个组件——哦,但在这种情况下,我们希望它在这些细微方面有所不同。
没有原子 CSS,你可能需要更新 CSS 和 HTML,而使用原子 CSS,你只需要更新 HTML。对于这两种方法,你都需要在添加条件逻辑和复制代码(或两者兼而有之)之间做出选择。复制 CSS(全部进入级联)我认为会带来更大的错误风险,而且级联不利于进行条件逻辑(与使用 HTML 模板库或 React 等 JS 框架相比),而且你用 CSS“读取”条件的方式对未来的维护者来说并不明显(你基本上需要依赖命名约定)。
我总是根据项目的需要使用混合方法。如果项目要求网站能够进行主题化,那么还需要确定主题化的范围。如果主题化必须像 CSS 花园那样广泛(基本上除了标记之外,所有内容都可能发生变化),那么我会完全使用 BEM(或类似方法)来命名类。另一方面,如果只需要更改颜色和字体(包括字体大小),那么我会使用 BEM 以及原子 CSS。再举一个例子,如果一个项目实际上没有主题化(这对我来说很常见),那么我会出于语义原因创建 BEM 类名,但实际上大部分工作都会通过原子 CSS 完成。
虽然这些是我会采取的方法,但我认为最后一种方法可能在我的特定团队中拥有最低的维护成本。
你怎么看?哪些上下文差异可能会改变你对这些问题的回答?
为什么不在 SASS/SCSS 中使用 @extend %placeholders 呢?
它们可以是原子的。它们可以重复使用。
最佳部分:它们不会污染你的 HTML,因此你可以继续将样式和结构分开!
是的。将它们分开。在跨多个(>2)断点的 HTML 中使用原子 CSS。祝你好运。绝对的噩梦。使用带 includemedia 的 SASS 怎么样?你还可以使用 includemediaexport 在 JS 中访问断点。
我想知道 CSS 中是否只有两种风格:为了满足产品的(样式)需求专门设计语法和语言,而不考虑这种表达方式是否可以翻译成其他产品,或者,试图满足不止一个人的/公司的需求。
原子 CSS 很适合第一种情况。
也许我不确定你所说的第一种情况是什么意思。
对我来说,原子 CSS 听起来像(实际上也一直是)一种我可以毫无区别地应用于我参与的任何项目(无论是网站还是应用程序)的方法,它使用原子 CSS(CSS 是可移植的)。
像 BEM 这样的东西——作为设计系统——也适用于每个项目。但是,无论何时我转到一个新项目,我都会最终编写一套新的 BEM 类(特定的 CSS 不可移植)。
在实践中,我发现这两种方法同时使用都很有效(一些可移植的 CSS 和一些不可移植的 CSS)。
如果我正在构建一个一次性的应用程序,它只需要对我的本地团队有意义,而且我们在品牌、产品设计和视觉风格方面非常小心,并且对所有需要呈现的视觉术语(以及因此的样式)有一个清晰的认识,那么它们是如何分组以及相互关联的可以使用我们只需要理解的语法进行规划,原子 CSS 很可能在那里有意义,因为避免了“对于任何设计任何东西的人”的风格策略的冗余/泛化,它具有简单性和精简性。
原子 CSS 会使你的 HTML 膨胀,这几乎就像编写内联样式……
我没什么可说的了。
Web 组件的方法更具可读性——即使你不使用 Web 组件。自定义标签(不升级到自定义元素)会像浏览器一样显示,并且甚至可以追溯到 IE8。
示例
CSS
另一种方法是使用 [role=”side-menu”]。
这样,链式角色使你的 CSS 既可读,又使你的 HTML 即使在移动元素时也准备好进行自动化测试。
我在 HTML 标签汤膨胀的时代磨练了我的技能。我非常抵触 Sullivan 对 OOCSS 的提议,因为杂乱被重新引入到我的标记中。后来我意识到标记永远不会保持原始状态。重新设计通常需要更改和调整标记,因此我同意在标记中应用样式的众多类并不是一件坏事。
现在我看到我们的一些 React 开发人员只是为了使用 Tachyons 创建一个盒子所做的工作,我忍不住再次抗议。使用 16 个类名设置像边距、填充、尺寸、定位、边框、边框半径、盒子阴影等东西,与使用一个类名设置相同的样式相比,有什么好处吗?
也许我们的开发人员把事情做过头了,但我预见到在不久的将来,当新的重新设计出现时,将需要修改数百个组件来适应新设计,这将带来很多痛苦。
我的意思是标记不会永远保持原始状态。
这很有趣,我看到有人为原子 CSS 辩护,因为“我注意到我在 CSS 中写了很多 ‘margin’ ,因此将其变成一个类很有意义!”——然后他们最终在 HTML 中有了同样数量的 ‘m-0’ 类。
我喜欢阅读每个人对原子 CSS 的想法和意见,何时使用它或何时不使用它,等等,我甚至不确定自己是否能够从头到尾地在一个项目中完全使用它,我必须尝试一下,看看效果如何。我确实看到了快速编辑一个元素的优点,但随后全局更改可能是一场噩梦,除非你基于组件进行了设置,这将是最有意义的。
我希望有更多关于它的文章和讨论,来自在雅虎团队中使用它的人,以及为什么它是在这样一个大型网站和团队中完成的。
我认为这就是原子样式类使用不当的地方。我认为用这种方式对内容进行样式化没有任何价值。
我认为原子类非常适合实用程序,而不是设计。这将解决大规模样式更改影响网站随机部分的问题。但可以考虑使用原子类来创建简单的列、不透明度悬停效果、图标系统等……
我没有看到 TED 网站和雅虎网站有什么痛苦,它们已经使用了好几年了。
TED (https://www.ted.com) 创建了自己的 Shed CSS,它在他们的设计中看起来很棒。
James,你真的在指明 TED 的 Shed CSS (https://pa.tedcdn.com/stylesheets/shed.css),他们的庞大、不可读的代码中有超过 7,750 个
!important
语句……作为 CSS 的示例吗?对于想要学习或改进他们的 CSS 以及如何优化可维护性的人来说,这些根本不是好的例子。我不知道原子 CSS 如何认为自己是初学者友好的,因为我不会在我的培训材料中使用这种糟糕的结果。
如果 HTML 的类名实际上是内联样式的快捷方式,那么它就是错误的,我不在乎它变得多么流行。
原子 CSS 还自称是精简的,因为它只包含项目中实际使用的样式。我不能写
class="js-stream-ad-noview js-stream-ad Wow(bw) Pos(r) Mx(a) Mt(-1px) Bxz(bb) Bgc(#fff)"
并认为“是的,我现在开始有感觉了,这太精简了!”。看看现实世界中“成功”的实施。它并不精简,而是庞大的,HTML 也是如此,说原子 CSS “没有膨胀”是彻头彻尾的谎言!我在 15 年的全职网页开发生涯中从未见过如此荒谬地膨胀的 HTML 或 CSS。
我还担心,所有这些基于其受欢迎程度的架构和框架的推广……
今年早些时候,我做了很多招聘工作,为我自己的开发中心以及其他人。我们正在寻找技术娴熟的前端开发人员,能够帮助跨国咨询公司中的任何项目,无论框架或架构如何,因此对 HTML、CSS 和 JavaScript 的核心技能有着很高的要求,在这三方面的熟练程度至关重要。
偏爱 CSS 架构的前端开发人员在面试中表现糟糕(更糟糕的是,他们更偏爱 Angular 或 React 等应用程序框架),即使在基础知识方面,他们的知识深度也不足,因此缺乏我们为客户所在地安排他们所需的通用性。
你可能会认为“流行”框架、库或架构的经验在你的简历上看起来不错,但经过几个月的观察,我们发现事实并非如此。对于这类候选人,我们可以预测他们的知识差距,并在技术面试中首先询问这些问题,从而节省时间。
制作网页最重要的东西是什么?HTML。
HTML 将决定你的网站的成败。保持简单,使用适合任务的元素。为避免大多数可访问性问题而感到自豪。
你的网站在没有 JavaScript 的情况下还能正常工作吗?它在没有 CSS 的情况下看起来如何?如果这两种情况都无法实现,那么你设计的网站就是为了取悦错误的人:你自己。
回到 HTML,最重要的是。你是否曾经验证过它?验证是否是你开发周期的一部分?为什么不呢?W3C 验证器可以下载为可执行的 JAR 文件,它比以往任何时候都更容易。
假设你想可靠地生成有效的 HTML。即使是大批量生成,你如何才能可靠地生成有效的 HTML?嗯,你肯定不应该手工编码它。我不会。
目前,我使用 markdown 来编写大部分网站内容,对于更复杂的组件(如表单),我使用组件以一致的方式过程化地生成 HTML。整个开发过程被有意限制为生成一致的 HTML,我故意将控制权降到最低。
CSS 的强大之处在于你可以将样式一致地应用到你的网页中,你可以拥有多种视觉设计,而无需对 HTML 进行任何修改。重新设计和重新品牌化变得微不足道。因此,原子 CSS 没有用处(BEM 也一样,或者任何其他形式的分类症)。
CSS 拥有强大的力量,然而,许多人却毫不负责任地使用它。
原子 CSS 并不简单。它使得精心制作的 HTML 变得不可能。保持简单。
你能给我展示一个比这更简单的制作两页布局的方法吗?
然后我可以在任何想要两列的地方使用这个类。这怎么不简单?它会让应用它的 HTML 变得不可能吗?
雅虎和其他一些人似乎在过度使用原子样式类,很明显,这会使事情复杂化。
但当“简单”地使用时,它怎么不简单?
你应该避免像
grid
这样的类名。你把视觉设计决策放到了 HTML 中,那里不应该放。如果明天你不想使用网格怎么办?如果它只在最大化桌面或横向模式下才是网格呢?这是一个糟糕的类名。
class 属性用于对 HTML 元素进行作者分类,其中元素或属性本身的语义不足。 https://css-tricks.cn/semantic-class-names/
我正在减少使用的新的类名的数量,尤其是因为新的 HTML5 元素和 ARIA 角色提供了更通用的语义。
对于页面布局。我的 HTML 设计会是这样的
如果我想让那个页面变成两列,CSS 会是一样的,但没有类选择器
我试着想一想,在哪些情况下我会肯定知道网站的其他区域需要变成两列。也许是定义列表,那么我会希望所有的定义列表都是两列,因为一致性可能是可取的。嗯。
我更有可能拥有一个可重复使用的显示花哨列表的方式,其中每个项目都有一个带阴影的边框,或者一些时尚的东西,而且我希望产品列表、用户列表、预约列表等具有类似的样式。我通常会做一些类似的事情
可重复使用的列表样式将使用
.listing
选择器应用,而产品列表特有的任何样式将使用.products
选择器应用。当然,
class="grid"
看起来很诱人,因为它可以重复使用,但实际上它是一种反模式,因为你将当前所需的视觉设计嵌入到 HTML 中。这非常糟糕,因为视觉设计往往不存在永久的或最终的版本。我参与过一些大型的企业重新品牌项目,这些公司更换了所有权、与其他公司合并,或者只是将旧系统迁移到新的现代外观和感觉。这些客户需要对他们的网站和 Web 应用程序进行全面的外观和感觉更改,同时将实际功能中断的风险降到最低。
具有最语义化标记的系统是最容易的。我记得一个特殊的项目,其中 HTML 与视觉设计耦合在一起,我们认为在不彻底修改实际应用程序的情况下,不可能实现重新设计,而这会导致不可接受的风险和成本。
假设你使用
class="grid"
的一些情况不再需要使用网格?如果 HTML 没有语义化编写,你将如何识别所有需要更改的class="grid"
实例以及那些需要保持不变的实例?你可能很幸运,在你的整个代码库中只有 20 个
class="grid"
实例。这可能是一个可以管理的分析量。但是如果存在 200 个、2000 个或 20000 个呢?将你的视觉设计嵌入到 HTML 中从来都不是一件简单的事情。
我喜欢这样。你如何才能做到这一点?
Vanderson,你的网格示例只有 5 行代码。我宁愿在 CSS 中只使用一个地方的多个选择器,甚至是在 HTML 中的多个地方重复这些相同的行(通过 mixin),而不是在 HTML 中的多个地方使用 .grid。但这仅仅是我根据过去十几年中参与的 70 多个项目而做出的偏好,因为大多数项目都需要快速完成,而对我们来说最快的解决方案是重复使用现有的 HTML 并且只是重新设置样式。
我并不是说我的工作方式比其他方式更好。
这就是所有类似这样的文章的问题所在。有人做了一份非常困难的工作,并且使用了对那种情况非常有效的技术,然后宣称每个人都应该在每个项目中都按照自己的方式做事。他们忽略了每个人所处的现实情况不同。对雅虎来说最好的可能不是对 Facebook 最好的。对谷歌来说最好的可能不是对推特最好的。对推特.com(没有使用 Bootstrap)来说最好的可能不是对推特内部企业应用程序来说最好的(使用了 Bootstrap)。
我希望这些文章能够做到的是说:“如果你的情况是这种情况、这种情况和这种情况,那么我有一个非常棒的建议给你……”
嘿,Rob,
嗯,它都是定制编写的,它可以是 PHP、Java+Spring+JSP、Scala+Play+Twirl、Node.js+Express+Mustache,任何东西!
举个简单的例子,要向页面添加一个表单,我只需要编写
它有点受限于
标签:[字段类型](验证规则)
[提交按钮文本]
在我看来,在为你的网页创建表单时,你应该只编写一个简单、最少的表单规范。这个规范如何转换为 HTML 是一个开发问题,因为它应该是自动的,而不是手动的。
实际上没有机会将数十个自定义类引入从该规范生成的 HTML 中。但这就是我喜欢的方式,网站中的每个表单都故意具有统一的布局和样式,因为我们认为一致性是一件好事,我们的用户也是这样认为的。
如果有一个充分的理由让网站上的一个表单看起来与其他表单不同,那么包含该表单的元素将是一个很好的用于区分的东西,在 CSS 规则中。例如
所以,我用后代选择器解决这个问题,作为例子,但我认为这很好,因为我正在使用 CSS! - 不像 CSS “架构”(或者我更喜欢称之为 CSS 规避方案)。
我完全同意你不应该在 HTML 中放置“视觉设计”。它是一个类名,而不是内联样式。你在这里反对的是内联样式。(例如,React)
我会重复一句古老的智慧,使用合适的工具来完成工作。仅仅因为你看不到它的良好用途并不意味着它不存在。
我已经做了很多年了,我已经多次看到曾经是铁律的“永远不要这样做”后来被废除了。所以我不再听这些教条,现在我会使用合适的工具来完成工作。
你上次看到 Windows 或 MacOS 应用程序中的菜单需要完全改变其下拉菜单的布局是什么时候?你看,有一个叫做“菜单”的类的地方,因为确实有一些通用的东西可以从这个长期的设计过程中获益。
另外,我没有将该类命名为“grid”,我只是为了示例的简单性才这样做的,也许它在这里引发了一场神圣的命名战争。
如果我把它叫做“2-colum-thingmabob”会有什么区别吗?想想 CSS禅意花园,并非每个项目都有预算或长期目标来实现完美的主题,这甚至不在规格中。
有时,这类讨论会演变成如何编写完美的 CSS,而任何实用方法都会因为潜在的盲目狂热或仅仅是你“个人经验”认为它很糟糕而被斥责。
内联样式不久前还被认为是“邪恶”的,而这个网站,互联网上关于 CSS 知识的堡垒,现在似乎完全支持它。
所以,我说,忽略教条、狂热分子和意识形态,使用合适的工具来完成工作。
查找和替换。这从来不是问题。我参与过处理数十万行代码的项目。数百个网站共享库。包含内容的数据。这真的不算什么大问题。
如果有预算,它就会被改变,无论如何。如果没有,就只能接受。轻而易举。
另外,几年前,我从一位为军用卫星制作软件的公司老板那里学到了一课,他们做的是大型项目,他说,每隔几年,他们就必须丢弃大量的代码并重建系统。
你只能对一个系统进行调整、修复和管理一段时间,然后就必须重新开始。如果你曾经参与过足够大的项目,并且持续足够长的时间,你就会发现,没有任何策略是完美的。所有的一切都需要重新做。
当然可以。这一切都取决于项目的规格。你肯定不会声称 “.grid” 是一个为我哥哥的狗制作的单页网站的糟糕类名吧?这太荒谬了,谁在乎那里使用什么类名?所以你的批评只能被归类为仅与你的经验、你的工作方式或你合作的客户类型相关的项目,等等。
对命名规范(原子 CSS 的全部内容)过于绝对会让你对适合特定工作的正确工具视而不见。
我会尊重你的判断,看看它是否适合你在你的项目中使用。但这并不意味着它不是对其他人来说的最佳和完美的解决方案。
@Vanderson,我认为我们讨论的是完全不同的东西。
我谈论的是精心设计的 HTML 的价值以及它与现代“避免使用 CSS 的方案”的冲突。我认为编写不合适的 HTML 并不实用,并且我已经概述了其中的主要原因。
如果你认为在某些情况下,不实用 HTML 的成本是可以承受的,那就太好了!如果你认为这些方案实际上是实用和可取的,那么我们就永远不会达成一致。如果它们是合适的工具,那么某个地方有人正在做错误的工作。
我宁愿使用(而不是设计或开发)一个精心设计的 HTML 网站,例如,一个下拉字段实际上是一个 SELECT 元素,而不是一些半成品的依赖于 JavaScript 的小部件。
为什么这很重要?因为我受够了使用那些因为没有保持简单而崩溃的网站。这种情况发生的频率太高了,通常是在我注册、预订或支付某些东西的时候,也就是在现实生活中真正想要完成某些事情的时候。
顺便说一句,Internet Explorer 在 IE10 中改变了它们的下拉菜单,虽然没有太大变化,但足以让人们注意到……为了触控用户的利益,显然是。所以这种情况发生了,如果你坚持使用合适的 HTML,你的网站将自动获取这些增强功能。
我反对 HTML 中所有与视觉相关的元素,不仅是内联样式,像“grid”或“2-column-whatever”这样的类名同样不合适。“menu”是可以的,它说明了结构是什么,而不说明它将如何被视觉化地表示,所以我担心我对此没有异议,但是你似乎认为我会反对?
我经常在一些不可避免地要使用某种布局标记的项目中工作,我宁愿对此感到尴尬和抱歉,也不愿意说服自己它是完美的,是自切片面包以来最好的东西,否则你永远不会找到更好的方法。
我不关心人们在他们的宠物项目中做什么,事实上,他们可以做他们想做的任何事。但我确实关心人们在流行的教育网站上宣扬什么,无论是在推广导致用户体验糟糕(例如不合适的 HTML)的技术,还是可能导致难以维护的代码,从长远来看。
不,你不能简单地搜索替换
class="grid"
,如果其中一些需要更改而另一些不需要。每个特定的匹配都需要独立分析才能确定是否需要更改。这是一个不必要的认知负担,集合越大,管理起来就越困难。企业从长远来看失败的地方在于,是否有预算来解决并非客户过错的技术债务。如果客户没有预算来进行他们微不足道的设计更改,你就会失去这个客户。
一个竞争对手只需要解释以这种方式构建的东西有多难维护,你就会知道,你已经有了价格过高、没有正确构建东西(偷工减料)或对简单的客户请求反应过慢的声誉。你的竞争对手将是那个进行清理和重建的人,而不是你。
是的,当然,我的批评是基于我自己的经验。碰巧的是,我目前正在进行一个从竞争对手那里接手的重写项目,所以这真的不足为奇!
在过去的 6 年中,关于如何正确使用 CSS 的讨论似乎一直被一小群精英控制着,他们的用例往往是一种单一的设计语言(不断发展),分布在不到 12 个寿命很长的产品中,这些产品拥有大型团队和巨额预算。
我清楚地看到某些技术对 Twitter、Facebook 和 Yahoo 等公司的好处。
但是,来自小型代理机构的 CSS 专家在哪里?他们每周都在进行全新的项目(或者是在现有产品上添加全新的皮肤)。我需要了解他们的工作流程中哪些部分效果很好,因为他们做我做的事情,大多数人做的事情,我们大多数人永远不会在 Twitter 或 Yahoo 等公司工作。
精心设计的 HTML 与任何东西都不冲突。
不存在不合适的 HTML 这种东西。它只是一种标记语言。
如果你的经验迫使你以某种方式编写东西,那么请务必这样做。但是,将你的信念宣称为所有数十亿个已创建或将要创建的 HTML 文档的唯一正确方式,这是一种荒谬的行为。
我赞赏你想要成为一名伟大的工匠的愿望。但并非每个人都能创作出杰作,我们中有些人只是油漆工。做那些不那么光彩和完美的工作也是一种体面的生活。
如果你这样认为,你应该阅读规范。其他所有都是不合适的。
你错得不能再错了。完全错误和完全正确之间的区别只有一个词。删除“just”,就是这样!;-)
@Lee Kowalkowski
类本身与 HTML 没有任何关系。它们是属性中的字符串。无论选择在其中包含什么,都不会创建“不合适的 HTML”。
什么是不实用的?如果它被作者认为是可取的,那么它一定“更实用”——至少对他们来说(请参阅我下面关于用户的观点)。
类不会创建错误的体验,样式会。
“menu”是可以的,但是“grid”不行?为什么?你能给我一些规范/建议/文章来证明使用语义类是**最佳**实践(而不是常见实践)吗?
当涉及到 CSS 时,没有一种万能的方法,没有最好的方法。这一切都取决于项目(其需求、参与的团队等)。
用户体验糟糕?怎么会这样?再说一次,类对用户来说毫无意义;唯一重要的是与它们相关的样式。
如今,有了组件,更改样式并不意味着要跨代码库更改许多类;对于动态原子 CSS 库(如 ACSS)或自定义属性来说,更是如此。
不兼容是双向的,但如果是单向的,那么,不,精心设计的 HTML 与所有东西兼容,这就是我的重点。
绝对存在不合适的 HTML!就在今天,我听到一个开发者询问如何将一个按钮样式化为一个链接,他得到的 CSS 提供了用于执行此操作的类,但他正在与对齐方式作斗争。
这是不可接受的。一个样式化为链接的按钮永远不会具有与真正的链接相同的上下文菜单。你无法右键单击这些假链接并“在新窗口中打开链接”或“复制链接地址”。预期行为缺失。
Opera 有不同的键盘快捷键用于导航链接而不是按钮,假链接会被意外跳过。
屏幕阅读器能够生成页面上找到的链接列表,以便快速导航,假链接不存在。
CSS 提供了一种方法将按钮样式化为链接,这是一个很好的例子,说明了如何为错误的工作选择正确的工具,以及为什么“视觉”类名与内联样式一样不合适,并且由于 HTML 中的类名仅由 CSS 引用,所以是 HTML 不合适。
CSS 具有过度使用方便的特性,可以根据类名选择元素。类名与样式同义的误解是问题的根源。由于通过 ID 选择早已不受欢迎,所以类是新的 ID,在特异性方面,除了类比 ID 更通用。
因此,我们发现自己以更多种方式得到了难以管理的 HTML/CSS。这些“创新”解决方案似乎忽略了这样一个事实:我们是过度使用类选择器的受害者,所以它们实际上并没有解决任何问题,只是转移了问题。
没有人应该认为,我建议使用 HTML 的方式不会以意想不到的方式阻碍用户体验,这是一种荒谬的行为。我强烈认为,那些做“不那么光彩”工作,从无视任何流行或时尚的东西,保持简单,坚持使用有效的方法中获益最多的正是开发者。
@Thierry Koblentz
…那么你就不理解“类”这个词。我已经介绍了类的用途:class 属性用于对 HTML 元素进行作者分类,在这种情况下,元素或属性本身的语义不足够。再次:https://css-tricks.cn/semantic-class-names/
如果 HTML 需要修改,因为你想要它看起来不同,那么,不仅在我看来,它是不可取的,因为 HTML 元素的作者分类不应该仅仅因为外观和感觉发生了变化而发生改变。
我说的不是类或样式,而是所有形式的不合适的 HTML。正是无谓的复杂性造成了错误的体验。
菜单并不暗示布局,即使它是弹出式、下拉式、水平式、垂直式或其他任何形式,它仍然是菜单。
网格暗示布局。我敢打赌,在一个良好的响应式布局中,它在某个阈值下将不再是网格。网格不是事物本身,所以它不是元素的类。那么为什么它是一个网格呢?假设它是一个日历或画廊,那么元素的类应该是“calendar” 或“gallery”,而不是“grid”。
最佳实践被称为“关注点分离” https://en.wikipedia.org/wiki/Separation_of_concerns - 有无数的文章和建议说明了为什么它是最佳实践,请使用 Google,而不是我。
如果必须修改 HTML 来改变它的样式,那么你的关注点分离就不够好。
的确如此,但我在不同的网络团队工作了几十年,而那些能够同样自信地使用 HTML 和 CSS 的网络开发者却出奇地少,这也是关注点分离如此重要的另一个原因。
Web 应用程序开发人员是 CSS 的使用者,他们是 CSS 架构的真正消费者。他们需要生成与 CSS 兼容的 HTML。从这个意义上说,如果你认为类可以是无意义的,那么这将是一场灾难。
CSS 开发人员不应将他们工作中的难度转移到 HTML 开发人员身上,并将他们负担上不必要的复杂性。尤其是当 HTML 开发人员在一个项目中的数量往往超过 CSS 开发人员时。让错误的人做艰苦的工作是不可取的。
我目前所在的团队结构包含数十个项目,数百名 Web 应用程序开发人员,分布在全国各地的办公室。我只是一名 Web 应用程序开发人员。
有一个由大约 4 名设计师/开发人员组成的小型虚拟团队负责管理所有团队的前端编码标准,他们维护 CSS,因此,最终决定 HTML 应该如何编写。除了我必须使用他们的输出之外,我很少参与这个团队。
因此,我的论点是在那些不幸的 HTML 作者的背景下,他们将受到糟糕的命名惯例的影响,需要生成无意义的元内容才能使他们的 Web 应用程序看起来可接受。CSS 开发人员会做得疏忽,未能理解他们的真正受众。
在传统的 Web 开发中,CSS 开发人员需要承担使 HTML 作者的工作变得简单的责任。即使他们自己一个人完成;任何可扩展的工作也应该适用于小案例。
有意义的(或语义的)类名更容易理解、代码审查、搜索、记住、沟通、预测、记录,等等。如果你认为这仅仅是一个目光短浅的疯狂 HTML 开发人员的偏见,那么我对我们这一代人的未来感到绝望。
这是荒谬的。更改样式不应该意味着在整个代码库中更改任何类,这种情况已经存在相当长的时间了,不仅仅是现在,甚至在使用组件的情况下也是如此。我并不是说这是可以避免的,但应该始终考虑其发生的风险,并在预见的情况下避免它。
在原子 CSS 中,这一点不太成立,你无法在不更改元素的类的情况下更改任何元素的外观。
@Lee Kowalkowski
假设情况:将画廊从行显示更改为网格显示。
原子 CSS 方法:更改或添加页面上画廊的父 DIV 的“grid”类。
你的建议:更改“gallery”类的样式。
当你有一个网站上有 10 个画廊,它们都需要看起来不一样时会发生什么?我经常遇到这种情况。原子 CSS 可以解决问题。简单易用,更改 1 个类名即可完成。
但是,你建议我们不要修改 HTML 以保持其纯净?也许我遗漏了什么。有时,我快要说大多数时候了,一个网站很小,根本不会出现关注点重叠的问题。
听起来很明显你在大型多人团队中工作,处理大型网站和大型代码库。而我们团队则处理非常小的到中等大小的网站,最多 100 个页面。其中可能只有 10 个页面的 HTML 模板,包含很少的类名,其余的则是来自客户的内容或带有 mustache 模板的模块。
你在处理保时捷和法拉利,而我们在处理通勤汽车。声称我们必须使用最先进的长期方法和最昂贵的构建方法,这显然是错误的。
我们可以使用螺栓而不是铆钉,我们可以焊接,而你可能会使用胶水。我们可以使用铝,而你可能会使用碳纤维。而你有一个团队,在持续数月的项目中分工明确。我们的网站要在 1 周内完成,我们只有 3 个人来构建它。
现在,告诉我我需要雇用专门的 CSS 和 HTML 开发人员,因为有些人可以同时精通这两种技能。你公司在会议时间上的支出很可能比我们构建整个网站的支出还多。
抱歉,你认为你的想法具有普遍性是错误的。在你的世界里,它们可能是伟大而完美的。但对于我们来说,原子 CSS 绝对是许多情况下的最佳解决方案。
即使类是“grid”,并在手机上显示为单列,它仍然是一个网格。只是一个包含 1 列的网格。
还是说你认为不存在 1 列网格?
@Lee Kowalkowski
你链接的那篇文章已经超过 6 年了。我这里有一篇更新的文章,供你阅读:http://cssmojo.com/opinions_of_leaders_considered_harmful/
@Vanderson
我已经说过了!
class="shoes gallery"
class="coats gallery" ...
是一种方法,另一种方法是使用页面特定的 CSS,具体取决于方便性。我不确定满足客户的请求,而这可能会导致美学不一致,是否总是符合客户的利益。
仅仅满足客户的要求有时实际上可能意味着没有解决问题。
如果你能说服你的客户考虑以用户为中心的方法(假设用户更喜欢美学一致性),那就更容易了。永远不要害怕提供建议——客户非常欣赏这一点。
好吧,我曾经遇到过一个真正的客户请求,是在一个个人副项目上(整个网站不到 10K),当用户从合作伙伴网站注册时,他们希望注册流程的外观和感觉与合作伙伴的品牌保持一致。当他们从另一个合作伙伴注册时,它必须与他们的品牌保持一致。今天,它现在支持 12 个不同的合作伙伴,每个合作伙伴都有匹配的品牌——但 HTML 根本没有改变。
保持简单,关注点分离,适用于任何规模,没有项目太小,遵循最佳实践不会出现工作流程问题,因为如果出现了问题,那么它显然就不是最佳实践。
我从相反的角度看。我们正在处理通勤汽车,我的意思是,大规模生产样板服务,按照专业划分劳动。这是一种非熟练工作,因为它会导致许多开发人员只有有限的 HTML 技能,而没有 CSS 技能。HTML 模式由极少数 CSS 开发人员决定。这非常类似于生产线环境。
这些规模经济不允许使用昂贵的构建方法,每个大型全球外包公司都只关注缩短生产时间并提高股东利润,唯一的衡量标准是工时。没有空间使用昂贵的方法,一切都必须精简,否则我们就会错过最后期限,产生罚款,失去对无情竞争对手的业务。
我从来没有说过 CSS 和 HTML 开发人员不能是同一个人。
我也有个人副项目和小型团队,例如,我们定期组织黑客马拉松,同样的想法也同样有效。我没有遇到任何能反驳其普遍性的东西。
我在过去见过许多框架和架构被推销,它们都从解决通常只存在于糟糕实现中的问题的假设出发。
当一个框架或架构中存在任何好的东西时,它往往会在不久之后被纳入标准,并进行本地实现。我在原子 CSS 中没有看到任何可能成为标准化的候选者,我也没有看到在相关标准工作的人员中对原子 CSS 的支持,但我确实看到了相当多的反对意见。
更像是几年,甚至几十年,当你考虑支持合同和维护时。这就是为什么我们不能只发布一些东西然后就忘掉它,也是为什么这种方法很重要。
在这些系统中,将来会有能力范围广泛的人员在可预见的未来重新访问代码。如果在一开始就采用灵活的方法,那么来自维护和支持的收入将比最初的生产更有利可图。
如果你做的是构建、发布、收钱、跑路,那么没有必要公开反对最佳实践,只要继续做就行了。
任何尺寸的网格仍然描述了布局,没有赋予其内部内容任何有意义的实质。
@Thierry Koblentz
那又怎样?好的建议会随着时间的推移而贬值吗?我们是否也需要停止相信勾股定理?它已经很古老了!现在一定有更好的方法!拜托……
要么你没有阅读文章的发布时间之后的內容,要么你没有发现文章中还有其他错误。
我之前已经读过你的文章了,我发现里面没有反驳意见。我不知道你是否注意到,你没有提供任何证据表明语义类名是有害的,是一个糟糕的想法,应该不惜一切代价避免使用。
关于重新设计的部分需要修正,如果你认为重新设计仅仅局限于昨天旧的样式,今天新的样式,那么你忽略了重点。重新设计意味着可以同时支持多种样式。“没有人需要这样”的论点行不通。打印样式表呢?
你还在文章中断言BEM很流行(它并不流行),并以此作为证据!这就是我们这些过于沉浸在自己行业中的人的问题,我们总是受到大部分营销的影响。流行仅仅是营销的证明。所有排行榜第一的歌曲都是永恒的杰作吗?很遗憾,不是,尽管它们当时是最流行的歌曲。
作为一个HTML开发者,我曾经遇到过一个CSS设计师,他决定“尝试使用BEM”,一旦他看到HTML开发者对现在对他们的期望的反应,他就意识到,过度分类HTML是一个多么糟糕的想法。让错误的人感到轻松,也就是他自己。
CSS设计就像设计API。任何编写HTML的人都需要使用CSS设计的“API”。不幸的是,似乎很多CSS开发者也编写配套的HTML,因此他们对这种区别一无所知,永远无法体会到好处。
你为什么要设计这样一个糟糕的API来工作?因为CSS很痛苦吗?为了让CSS保持简洁吗?为了简化特异性吗?这些都不是可怜的HTML作者的责任,就像你不会设计这样一个糟糕的API一样。
@Lee Kowalkowski
一个建议 - 无论它有多好 - 都不等于定理,不是吗?
你可能想了解一下一种叫做“诉诸权威/传统”的谬误。
总之,我在这里停止,因为我相信你认为我在争论说服你Atomic CSS很棒,而SoC原则是有害的,而事实上我并没有。老实说,我真的很不在乎你的想法,我在乎的是那些阅读这些评论的人能够理解你的大部分论据都是没有根据的,他们不应该依靠任何这些论据来形成自己的观点。
@Chris
你可能想看看原子CSS on steroids;简而言之,我们有两个主要目标
限制膨胀
防止破坏
额外福利:这种方法让我们能够共享组件,而无需附加样式表!
五年前,我们从一个静态库开始(就像Tachyons今天所做的)。它显著减少了膨胀并加快了开发速度(两个很大的收获),但开发人员对他们可以使用的东西的局限性感到沮丧(请注意,这种方法非常适合强制执行样式指南 - 当存在样式指南时)。为了解决这个问题,我们提出了ACSS(https://acss.io),这是一个动态库,允许作者使用几乎任何他们想要的样式,包括媒体查询、组合器、伪类等。
额外福利#1:该工具会动态编写/删除CSS - 产生的膨胀甚至比“静态”库更少。完全切换到Atomizer的雅虎网站使用的CSS不到他们以前依赖的CSS的一半。
额外福利#2:它也有助于代码审查!
如果您有任何问题,请随时加入Gitter频道。
Lee Kowalkowski已经说出了所有重要的东西。我不知道为什么分离关注的方法如此不受欢迎。它在小型和大型网站上都运行得很好。
如果你想使用实用程序类,那么使用预处理器,就像我之前提到的那样。
请停止用表现性标记、库和框架来膨胀网页,仅仅因为你习惯了它。它不会让你的工作更快。
我多么希望你们这些“我以最方便我的方式做事”的人能像我一样住在德国,在那里你使用手机时要为6GB流量支付60美元。
除非你不想支付我的电话费并分享我缓慢加载的网页,否则请停止这种“我以最方便我的方式做事”的开发行为。
非常感谢!
@ Marc Haunschild
问题不在于分离关注(SoC)不受欢迎,而是有些人无法接受这样一个事实,即许多开发人员在不遵循SoC的“T”的情况下做得很好。支持原子CSS的人并没有说每个人都应该切换到它,他们只是分享他们的经验,说它对他们有效。相反,那些“崇拜”SoC的人却无法停止批评原子CSS,甚至没有真正了解它是什么或它能做什么。例如,Lee Kowalkowski说
我想他从未意识到原子CSS类可以是
partner-color
、partner-background-color
、partner-fontSize
、partner-whatever
?这种方法解决了Lee描述的“挑战”(不更改HTML)。无论如何,原子CSS的支持者并没有说使用语义类是一种罪过;他们在任何更合理的情况下也依赖SoC原则。关键是使用最适合工作的工具。我认为最好是理解这两种方法,并做出明智的选择,而不是坚持SoC原则,并把其他一切称为胡说八道。
膨胀网页(标记)?你有这方面的数据吗?因为我有,这根本不是真的(取决于库)。不仅如此,与SoC方法相比,使用原子CSS方法会产生更高的字符串重复率(因为前者会促进很多冗余),这会导致更好的压缩率。
最重要的是,由于需要下载的CSS更少,网站加载速度更快,从而转化为更好的用户体验。
这个论点是毫无根据的。雅虎切换到原子CSS,节省了55%的CSS。我不知道人们怎么能忽略这种幅度的带宽收益带来的原子CSS的好处。
总之,如果你喜欢SoC原则,并且它对你来说是最好的方法,那么很好,使用它,只使用它,但请不要告诉那些使用原子CSS的开发者他们不知道他们在做什么,因为这只会表明你对这种方法了解得有多少。
我只是不明白,如何在这里回答,所以对于任何不便之处,@Thierry Koblentz,我只是将你的回答复制到我的帖子中
你是否知道,他写下这些内容的原因是,在之前的一篇文章中,@Vanderson说,只有在使用表现性标记的情况下,主题化才是有效的。他只是回答说,这种情况下不需要表现性标记。但我认为Lee可以自己澄清这个问题,他不需要我帮忙。
这正是我想要表达的意思,当我请求停止膨胀网页时。
特别是当你使用微数据时,你实际上拥有比以往任何时候都多的CSS钩子,这已经足够了。
所以继续使用它们吧!我们现在就可以停止讨论了 ;-)
正如我和显然的Lee对HTML5的理解,SoC总是很有意义的。不仅如此,SoC赋予了纯文本文档意义。换句话说(摘自wcag):通过演示传达的信息、结构和关系可以是可编程确定的或在文本中可用。(级别A)
从哪个角度来看?可访问性?用户体验?还是开发人员体验?
你真的想告诉我,最小化、压缩、可缓存的CSS文件比添加到有意义的HTML5文档中的几十个partner-xxx类更糟糕吗?
我担心,我不会停止说,开发者有责任交付适合每个用户需求的HTML5文档。我知道,可以使用Bootstrap(我之前不得不使用的一个框架)来创建可访问的网站。但我很少看到可访问的Bootstrap网站。之前我仅仅怀疑,那些使用原子CSS等系统的开发者只是想让自己的工作更轻松。现在我知道了。至少对于绝大多数开发者来说是如此……
我已经在这个主题中说了两次:继续使用你喜欢的命名约定。但使用预处理器来获得两全其美的效果。你看,我没有告诉你不做这件事。我只是要求你做正确的事……
我并不在乎人们如何进行开发,只要他们想完成工作,他们可以使用Wix,我无所谓。
存在次标准方法,并且人们发现他们可以用这些方法工作,这不是问题,问题是这些方法存在严重问题,正如之前所解释的那样,它们没有兑现承诺,我将在后面解释这一点,但它们仍然在CSS-Tricks等网站上获得关注,人们依赖这些网站来提高他们的知识和技能,并相信这些资源是可靠的权威来源。显然,这让我很困扰。
这几乎没有解决问题。明天,一个新的合作伙伴品牌可能需要一些新的属性,比如边框,而我需要更改 HTML。除非我为现有的每个 CSS 属性添加一个
partner-
类,以防万一,所以不,谢谢。您的意思是抽样了其他 4 个网站并发布了这个 - https://acss.io/frequently-asked-questions.html#isn-t-atomic-css-moving-bloat-from-style-sheets-to-html- ?
这就是衡量 HTML 膨胀的方式吗?以平均类属性长度为准?我认为这有点过于方便地偏向。也许对 CSS 约定导致的 HTML 膨胀的不同看法是所有类属性中的字符总数占所有开始标记中字符总数的百分比。我认为这更能说明 HTML 创作工作量。我编写了一个非常粗略的脚本用于测量这一点:https://jsfiddle.net/bavfqk6d/9/embedded/result/
并生成了一些新的数据(因为旧数据不好,显然)。
Mavo.io (7.4%)
CSS Zen Garden (9.4%)
Codepen.io (9.8%)
Google (10.1%)
Wikipedia (10.1%)
Wordpress (10.8%)
Facebook (11.1%)
The Paciello Group (11.3%)
CSS-Tricks (13.4%)
Ebay (13.8%)
Zeldmann (14.1%)
W3C (14.4%)
Amazon (16.4%)
GitHub (18.9%)
The Guardian (21.6%)
Stackoverflow (16.5%)
BBC (27.8%)
TED (35.5%)
Yahoo (36.3%)
Twitter (36.4%)
ACSS.IO (42.3%)
USA Today (43.2%)
这些百分比是 HTML 作者在编写任何 HTML 开始标记时用于类属性值的字符数量。即由于 CSS 方法导致的 HTML 中的膨胀量。
[...] 最重要的是,由于下载的 CSS 更少,网站加载速度更快,从而转化为更好的用户体验。
如果您仅根据用户首次访问时下载的内容来衡量网站加载速度,那么您就搞错了。CSS 会被浏览器缓存,但现在每个 HTML 页面都更大了,其余的体验速度更慢。
如果您使每个 HTML 文档因此消耗更多带宽,那么 CSS 带宽增益就会被抵消。当雅虎的用户浏览他们的电子邮件或大多数雅虎用户所做的事情时,该流量是额外的 HTML,理想情况下没有额外的 CSS。
所以,使用原子 CSS 来获得更糟糕的用户体验吗?
实际上,这很不礼貌。人们应该考虑有经验人士的想法。我的反对意见没有一个是毫无根据的,否则您就不会跳过它们,而是专注于不相关的事项,比如定理和合理建议之间的区别。
@Lee Kowalkowski
我说过我不会回复您未来的评论,但我忍不住要指出您的 HTML“不合适”。
没有可操作的按钮,事件附加到标签上。所以是的,这是不合适的 HTML,因为它会创造糟糕的用户体验(用户在将代码粘贴到文本区域后不知道该做什么)。最重要的是,它对键盘用户不可访问。
无论如何 - 与您所说以及尝试通过脚本进行演示相反 - 与类相关的“膨胀”仅限于类属性内部的字符。其他一切都不相关,因为与本文讨论的方法无关。
例如,对于此代码段
您的脚本返回
总大小:42
打开标签:38 个字符(90.5%)
类值:7 个字符(18.4%)
但对于这个
我们得到
总大小:23
打开标签:19 个字符(82.6%)
类值:7 个字符(36.8%)
您看到问题了吗?您的脚本表明“原子 CSS”方法(
.a
,.b
,.c
,.d
)产生的膨胀是“语义”方法(.feature
)的两倍,即使在两种情况下class
属性都包含完全相同的字符数量(包括空格)。是的,新数据比旧数据更好,但前提是前者是准确的。
PS
使用组件方法,在您的组件中添加“合作伙伴”类与编辑样式表一样容易。实际上,前者不会使用户缓存失效,因为很有可能它不会强迫您发布一个新的 CSS 文件,所以也有这一点。
TTFB(首字节时间)是至关重要的。如果人们甚至不等待您的登录页面加载,他们可能就不会访问您的“其他”页面。
雅虎上没有“重新加载其他页面”这样的东西,事情不是那样运作的。
这是一个小提琴,我已经承认它很粗糙。它是我自己的,我只是想分享我的方法。
按钮是个好主意!我确实想过,如果有按钮会更容易使用,但我已经太迟了,因为我已经分享了它。由于 JS Fiddle 会对其 URL 进行版本化,我无能为力,只能思考为什么还有更多网站似乎让我的生活变得如此困难!
它附加到
textarea
上。如果它附加到标签上,它将无法工作。textarea
事件无论有没有按钮都能继续工作。按钮有利于可用性,即使它实际上什么也不做。我有一个不好的习惯,总是只做最基本的事情。很好,至少我们都同意不合适的 HTML 是不好的,很高兴能进行说明。
我可能在它还不完美的时候就发布了它,我们假装这在当今是可以接受的。幸运的是,没有知名文章链接到它并赞美它。
我是一个键盘用户,它可以正常工作,只需从文本区域中跳出即可。我希望我们很快就会讨论一些真实或相关的事情。
我认为这有点目光短浅。这不是膨胀,而是其他东西,我甚至不知道那是什么。
膨胀指的是总共增加了多少额外标记。充分利用 CSS,您可以在 HTML 中谨慎地使用类。CSS 规避方案不幸地过度使用类,这就是膨胀。
无论哪种衡量方法是否完美(我承认两者都不完美),我的结果趋势仍然表明,使用过度设计的样式方法的网站在 HTML 标记中类属性值的比例更大。
谨慎使用类的网站比那些像快过时一样使用类的网站(一厢情愿的想法)膨胀程度更低。就这么简单。
我用来衡量膨胀的方法会惩罚过度使用类,而不管其他 HTML 内容是什么。我认为这会是一个更好的衡量标准。
如果您重写相同的 HTML 以使用不同的样式方法,则测量结果的差异将比平均类属性更好地显示膨胀的差异,而平均类属性不会显示任何有意义的内容。
不幸的是,我没有时间重写其他人的糟糕 HTML 或毁掉自己的 HTML,所以我只是选择了一些网站,直到我厌倦为止,坦白地说。
您的方法忽略了过度使用类,因此它根本没有衡量膨胀。事实上,我不确定它证明了什么。它当然没有解决常见问题解答中关于将膨胀从 CSS 转移到 HTML 的问题。
文章中忽略了这一点,这是评论部分的好处,可以讨论被忽略的事项。
这是使用像 CSS-Tricks 这样的网站的优点之一,通常可以从评论中了解更多内容,考虑其他观点,并可能获得均衡的观点。
是的,这叫做延迟,与 CSS 方法无关。除非我弄错了,否则它没有被讨论过。
我可以想象可能存在其他方法可以将充满类属性的 HTML 放入网页,而无需从服务器获取全部内容,但这听起来像是为了修复本来就不是问题的事情而付出了太多努力。
大多数 Web 开发人员不是雅虎开发人员,也不从事任何如此不必要地复杂的事情。即使可以解决膨胀 HTML 的副作用,这项技术也会超出现有 Web 开发人员的掌握范围。
然而,一般的 Web 开发人员有一个不好的习惯,就是复制他们看到的东西,而不考虑它是否真的符合他们的要求。
所以...保持简单,但不要太简单。:)
实用程序类之所以如此受欢迎,是因为在不用动脑子思考的情况下,它们很容易使用。
我同意,没有一个完美的系统。当然,有时它看起来很荒谬,比如人们展示的像瑞安航空这样的代码。但是,如果您想让 Facebook 按钮恢复其圆角,笑声就会停止。
在这段代码中,我看到,一定存在圆角作为一般的设计理念。而这个理念也有例外。我认为,如果需要如此多的例外,设计理念可能不完整。所以问题可能不在于 CSS 概念。处理像这样的事情总是很困难的。而且,如果您在编码时遇到很多例外,它就会搞砸任何代码及其概念。看看瑞安航空的代码,我认为您移除边框的很多东西都需要 HTML 类。例如,所有社交媒体按钮。这样事情就会变得容易很多。设计师不太可能只想从一个社交媒体按钮中移除圆角,对吧?将这些按钮分组是有意义的。
如果您需要实用程序类,我强烈建议您将它们放入预处理器中,以保持 HTML 代码的整洁。就像这样
我第一次在 Gunnar Bittersmann 的视频中看到这个想法:https://www.youtube.com/watch?v=ot-LoU0MGb0&feature=youtu.be
对我来说,这是将两个世界的精华完美结合的最佳方式:干净、有意义的 HTML 和可读、可重用的 CSS/SASS——事实上,自从有了 CSS 类、网格和 Flex 之后,我已经不需要预处理器来做其他任何事情了。
Marc
抱歉,我的德语自动更正让这段英语评论看起来很糟糕 :-O
就像其他所有“框架”、“库”、“实用程序”一样,这始终是主观的。许多网站/框架之所以使用这种方式,是因为它可以“快速”创建网站。它做的另一件事是让每个网站看起来都差不多。
Bootstrap 和 Tachyons 这样的系统非常适合原型设计,但我认为对于自定义网站来说,这不是一个好主意。主要原因是大多数系统都非常固执己见,强迫你遵循它们的样式或覆盖它们,这可能是一个非常痛苦的过程,会导致代码膨胀、特异性问题等。
例如,使用基于组件的系统,你在样式表中进行更改,它就会更新所有地方的组件。如果你是一个“初学者”,或者没有使用任何构建系统,并且你想改变一个出现在多个地方的元素,你必须在多个地方改变类。对于大型网站来说,我认为这不可维护。
最终,这取决于谁能够以最快的速度和最低的成本将想法推向市场,这就是这些东西存在的原因。这一切都是短期的,并没有真正考虑到长期的解决方案,我理解,因为网页变化太快了,但如果你需要,你可以站在这条线上,选择任何一边。
当然,这仅仅是我的个人观点。
由于很多 CSS 是自动生成的,以及“html 页面”,我不确定可读性(对人类来说)是否真的必要。放弃样式声明必须可读的假设可能会激发新的思考。