关于自动生成的原子 CSS

Avatar of Chris Coyier
Chris Coyier 发布

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

Robin Weser 的 “原子 CSS 中的简写-长写问题”,是一段关于棘手问题的有趣旅程。重点是,当您承担将类似 HTML 和 CSS 的东西转换为实际的 HTML 和 CSS 的任务时,您将不得不自行解决一些边缘情况,即使您能解决的话。在本例中,Fela(我们 刚提过)将 CSS 转换为“原子”类,但是当您将简写和长写混合在一起时,生成的类与级联一起使用会导致错误。

我认为这种产生原子 CSS 的 CSS-in-JS 的整体理念非常有趣,所以让我们快速退一步看看它。

原子 CSS 表示 **一个类 = 一个任务**

比如这样

.mb-8 {
  margin-bottom: 2rem;
}

现在想象一下,有 *数千* 个这样的类可以使用,并且几乎可以做任何 CSS 可以做的事情。

为什么要这样做?

以下是一些原因

  • 如果您完全采用这种理念,这意味着您将发布更少的 CSS,因为没有重复的属性/值对,并且没有为作者编写原因而创建的类名。我猜想一个全原子样式表(根据使用情况进行修剪,我们稍后会讨论)的大小是手写样式表的四分之一,甚至更小。发布更少的 CSS 意义重大,因为 CSS 是一个阻塞资源。
  • 您可以避免命名事物。
  • 如果您限制可用的类,您将获得一定程度的“免费”设计一致性。
  • 有些人只是更喜欢它,并说它使他们更快。

如何获取原子 CSS?

没有什么能阻止您自己动手。这就是 GitHub 使用 Primer 和 Facebook 所做的事情(在 FB5 中,*不代表您应该效仿大型企业!*)。他们决定了一组实用程序样式,并将其作为包发布(主要发布给自己)。

也许整个理念的起源是 Tachyons,它只是一堆巨大的、有主见的类,您可以直接获取并使用。

但大多数情况下…

Tailwind 是主要玩家。

Tailwind 有很多不错的默认设置,但它除了是一组原子样式之外,还做了一些非常聪明的事情

  • 它可配置。您可以告诉它您希望所有这些类做什么。
  • 它鼓励您“清除”未使用的类。您确实需要正确地执行这部分,因为如果您不这样做,您将无法真正获得原子 CSS 的好处。
  • 它有一个 UI 库,因此您可以立即开始使用它。

等等,我们不是在讨论自动生成的原子 CSS 吗?

哦,对了。

值得一提的是,雅虎也是 早期参与者。他们的主要想法是,您实际上将使用函数作为类名(例如 class="P(20px)"),并在构建步骤中将其处理为类(在 HTML 和 CSS 中)。我不确定它有多流行,但您可以看到它与 Tailwind + PurgeCSS 并没有太大区别。

**如今,您不必 *编写* 原子 CSS 来 *获取* 原子 CSS。**来自 Robin 的文章

它使我们能够以熟悉的“单片”方式编写样式,但获得原子 CSS。这提高了可重用性,并减小了最终的 CSS 包大小。每个属性-值对只渲染一次,即在第一次出现时。从那时起,每次我们再次使用该特定对时,我们都可以从缓存中重复使用相同的类名。一些执行此操作的库有

Fela
Styletron
React Native Web
Otion
StyleSheet

坦率地说,我认为这是实际使用原子 CSS 的唯一合理方法,因为它不会影响编写样式时的开发体验。我 **不** 建议手动编写原子 CSS。

Johan Holmerin 在 CSS-Tricks 上 写了关于 style9 的文章,它也做同样的事情。

我认为这很酷。我尝试过多次直接编写原子 CSS,但我就是不喜欢它。谁知道为什么。我一生中学习了很多新东西,但这个就是没有引起我的共鸣。**但我绝对喜欢计算机为提高生产环境中的 Web 性能而执行的任何操作。**如果构建步骤将我编写的 CSS 转换为原子 CSS... 那太棒了。上面有五个库可以做到这一点,因此这个概念肯定有其意义。

这些方法基于 CSS-in-JS 是有道理的,因为它们绝对需要处理标记和 CSS - 因此这是最有意义的上下文。

你们怎么看?