如果我们要批评实用类框架,那么让我们公平地对待它。

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 200 美元的免费积分!

我并不是要举起盾牌来保护 CSS 实用类框架。 我自己甚至不太喜欢这种方法,任何东西都不应该凌驾于公平的批评之上。 但“公平”是一个关键词。 我不知道自己见过多少次将实用类样式与内联样式进行比较。 Sarah Dayan 对此感到厌倦了

[...] 尽管多次尝试揭穿常见的谬误,但实用优先的爱好者们不得不不断地回复大量错误的观念。 而且,**最陈旧、最常用的老生常谈是,实用类仅仅是内联样式。**

我认为这个比较会让它变得清晰。

<div style="color: #3ea8ca;"></div>

<div class="color-blue"></div>

第一个 div 在 HTML 中直接设置了color,这是一个非常具体的蓝色颜色值。 第二个的color是在 HTML 外部设置的,使用类名,您可以在 CSS 中使用它来配置蓝色的色调。 当然,第二个类名相当有限,顾名思义,它只做一项工作,但它仍然提供了一些抽象,因为蓝色可以更改而无需更改标记。 使用大小实用类(例如size-xl)也是同样的道理。 这也是一种抽象,我们可以使用它来定义使用该类名作为选择器的 CSS 中元素的填充。 但是,如果我们要直接在 HTML 中的元素上使用style="padding: 10px;",那将是一个绝对值,需要在标记中更改该值。

不过,公平地说(这就是我们追求的目标),实用类框架中有很多类的命名方式非常接近于内联样式的行为。 例如,Tailwind 中的top-0表示top: 0,并且没有关于它的配置或抽象。 这不像该类将在 CSS 中使用除零以外的任何值进行更新,因为该值在名称中。“实用”是对此的一个很好的描述。 它非常类似于内联样式。

所有这些可通过智能默认值进行配置的内容将基于实用类的框架置于不同的类别中。 内联样式对您如何设置样式没有任何限制(除了硬性限制,例如没有伪选择器或媒体查询),而有限的实用类集提供了很多样式限制。 这些约束通常是理想的,因为它们会导致设计看起来一致且美观,而不是不一致且凌乱。

借用我曾经在稍微不同的上下文中听到的一个隐喻:**基于实用类的框架就像保龄球的护栏一样。** 使用这些类,它就会正常工作。 您可能不会获得全中,但也不会得到沟球。

我在关于实用类框架的对话中听到的另一个不公平的批评是,**您会随它们一起发送更多 CSS。** 如果是这样,那么您肯定搞砸了。 在我看来,这种方法的主要目的是发送更少的 CSS(仅您使用的类)。 我第一个告诉您,一个能够准确且完美地做到这一点的构建过程很棘手,并且可能导致不健康的技术债务,但我将承认,如果您做对了,发送更少的 CSS 对性能有利。 Tailwind 特别鼓励并帮助您做到这一点。

所以,综上所述,我认为这种方法有很多东西可以批评。 例如,我个人不喜欢查看所有这些类。 我真的不喜欢。 我不是关于完美抽象类的绝对主义者,但是在一个 div 之后又一个 div 上看到 10 到 20 个类会妨碍我进行 HTML 模板化时想要做的事情。 它感觉更难重构。 它感觉更难看出语义上发生了什么。 更难解析该列表以查找我需要执行非样式操作的其他类。 我从实用程序中获得的一些优势(例如将样式范围限定到我需要的确切位置)通常可以通过其他工具获得。

我还认为,实用类框架在您拥有热模块替换的 JavaScript 组件设置中效果最佳。 否则,HTML 更改往往会触发整个页面刷新。 例如,像Browsersync这样的工具非常好。 当您的 CSS 更改时,它会执行 CSS 注入。 但它无法执行新的 HTML 注入;它只是刷新页面。 因此,如果没有热模块替换(通常不适用于您的通用 HTML 站点或静态站点生成器),您在创作时会获得更糟糕的DX