我相信 acss.io 是“原子 CSS”的首次使用,其核心在于成为一个编译器。您像这样编写 CSS
<div class="C(#333) P(20px)">
text
</div>
它将生成如下 CSS
.C\(\#333\) {
color: #333;
}
.P\(20px\) {
padding: 20px;
}
(或类似的东西。)
关键在于它只生成您实际需要的 CSS,因为您请求了它,不多也不少。结果的 CSS 比您在普通样式表中看到的要少得多。

这个编译过程被称为“即时” CSS。
流行的 Tailwind 框架 支持它。在我看来,它有点颠覆了 Tailwind 的思维模式。它不是提供一大堆 CSS 实用程序类供使用,然后“清除”未使用的部分,而是从一开始就只创建它需要的东西。

我想说“即时”是一个正在流行的概念。我刚刚看到了 Assembler CSS,它非常重视这一点。您无需使用类,而是执行以下操作
<div x-style="grid; gap:1rem; grid-rows:1; grid-cols:1; sm|grid-cols:3">
<button x-style="^button:red">Submit</button>
</div>

我对这些东西有点犹豫。我的一部分喜欢您无需离开模板即可完成样式设置的方式。我尤其喜欢极简的 CSS 输出,因为 CSS 是一种阻塞资源。但我的一部分不喜欢它对 CSS 本身进行了有限的抽象,因此您需要依靠工具来支持 CSS 本身可以实现的功能。它还会使 HTML 看起来稍微难看一些——尽管我肯定已经习惯了 JSX 内联事件处理程序之类的东西。
是的,但是 Tailwind JIT 可能是两全其美的方法。您可以使用数百(数千?)个有用的预定义类,但它只输出您最终使用的类。JIT 彻底改变了游戏规则,据悉 Tailwind v3.0 将更进一步。
我不是“内联”样式的粉丝,其中 javascript 中的 css 写在 jsx 内部。一开始听起来很棒,但随后您需要处理悬停效果、关键帧、focus-visible 样式、动画等。♂️
Tailwind JIT 的工作原理对我来说更具吸引力。正如您在上一段中提到的,当我们采用 JSX 的理念时,实际上已经越过了关于“HTML 应该是什么样的漂亮语法”的讨论。我只是喜欢这个想法,它更容易管理设计系统,我不需要在不同的文件之间切换以检查我的框是否位于屏幕中央。
我一点也不喜欢 Tailwind 对 CSS 的处理方式。所以我对这一点感觉也差不多。
我相信网站的 CSS 应该是一个强大的引擎。也许它很难编写,而且有很多可能出错的地方,大多数情况下会导致大量不必要的代码或复杂性。但是我们可以通过其他方式成功地构建更少代码的更好系统,例如良好的设计、规划、优化……
我不确定谁会喜欢更改标记中的数百行代码而不是修改编写良好的 CSS 代码库。
还有两个值得一提的工具(部分原因是它们促使 tailwind 添加了 JIT 模式)
WindyCSS https://windicss.org
Twind https://twind.dev
Tailwind 这种抽象是不必要的。
感谢您在此处对 ACSS 的认可。我非常确定 ACSS 在创建之初就领先于时代,CSS 行业在过去几年里才逐渐赶上。
这里需要注意的一点是,ACSS 没有提供任何预定义的类供选择。这意味着您可以使用任意值生成类,例如
P(21px)
、C(#f1f2f3)
,而不限于其他框架提供的那些值。ACSS 不会规定任何样式/值,并且内置了丑化功能以生成更精简的 CSS 文件。
我不明白……为什么在类属性中使用奇怪的缩写来使用转译器,而不是直接编写传统的内联样式?
忽略 DRY 或 SoC 等原则是可以的,但恕我直言,这没有意义。
一些试图不编写传统 CSS 的尝试让我想起了著名的编程语言 Brainfuck 和其他职业治疗方法。
以及您代码库中的另一个故障点……
首先,我必须说我不了解此工具,也许我所说的是显而易见的。我使用 LESS,并从头开始编写所有 CSS 类。我将代码进行模块化作用域划分,并且不担心 CSS 长度。例如:“.mod_featured”。
……它如何理解我想对所有 CSS 类进行作用域划分?此外,我在其中使用通用类,例如:“.com_title_big”加上全局设计类,例如:“.des_gutter”
更重要的是,我认为最好将所有 CSS 放在一个文件中,因为它只会被浏览器读取和缓存一次。我错过了什么吗?对于小型/中型项目是否应该改变我的想法?
附注:我非常喜欢这个网站,感谢它。它有很多技术信息,对我的日常工作帮助很大。
这是由于最近的转变(尤其是在您关注 SEO 的情况下)只包含实际使用的 Css。拥有一个大型 css 文件是常态,但这意味着很多 Css 未被使用。理想情况下,您只想加载页面上使用的 css。这些工具旨在提供这一点。
我是不是错过了什么?这只是内联 CSS 对吧?CSS 类的意义在于它们是可重用的。
我认为情况比这稍微复杂一些。
https://frontstuff.io/no-utility-classes-arent-the-same-as-inline-styles
这正是我在想的……这与内联样式之间没有区别。也许性能有所提升?
我也有同感。
在 HTML 元素中声明每个特定的 CSS 属性而不是只创建一个 CSS 类来封装可重用的内容有什么好处?
我认为 Jon 可能会提到 Assembler 的语法特别像纯 CSS 语法,但添加了一些动态内容,例如命名断点(例如
sm|
)和插入符号(^
),我相信还有很多其他内容。关键是不要有任何可扩展的 CSS,这看起来不错。但是,我也对这种方法持怀疑态度,因为它 1) 使得难以使用连贯的预定义设计系统,以及 2) 您必须学习全新的语法(我太累了!)。
但我认为它仍处于早期阶段,希望这些问题在不久的将来能够得到解决。
我对很多方面都感到犹豫。将实用程序类包含到 HTML 中可能有一些方便的优势,但这打破了我整体的开发流程和思维模式,我认为这可能会真正使实际公司团队的工作划分变得复杂。我经常开发内在样式,例如特殊类和内置 HTML 元素,以便撰稿人可以使用纯 HTML 创建页面,而无需了解任何 CSS,并且仍然可以创建完全品牌的页面,因为 CSS 将简单地应用于使用的元素,而无需任何内联样式或实用程序类。
我是在 Bootstrap 时代成长起来的,在某些方面,Tailwind 似乎更有价值,但我仍然不知道是否会在任何非开发人员可能需要构建页面的生产开发项目中使用它(或 Bootstrap)。否则,我需要确保任何非开发人员在开始工作之前都参加了 HTML、CSS 和 Tailwind(带 JIT)课程。
这是我第一次听说 CSS 的“即时”名称,我真的很喜欢它。一直以来,很难说明 ACSS 不仅仅是原子 CSS。过去,我在个人项目中广泛使用 ACSS,因为我喜欢 CSS 的精简程度。但是,主题设置非常困难,并且需要整个团队改变他们对 CSS 创作的理念,所以我从未在专业领域使用过它。
除了主题设置之外,在我看来,ACSS 的另一个弱点是其开发人员体验。随着 SPA 框架的兴起,CSS-in-JS 工具变得非常易于使用,但我并不总是喜欢它们的输出。
现在我们有了自定义属性来进行主题设置,我真的很想有一个工具,将 CSS-in-JS 的 DX 与 JIT 的输出结合起来,并与 IDE 和普通的 PostCSS 工具链无缝集成。
可以做梦:)
这个空间太酷了。我甚至正在尝试自己的版本:https://particlescss.netlify.app/
它还没有准备好投入生产,但希望我能够找到一个易于使用、支持纯 CSS,并且对于可重用性和其他方面具有良好开发体验的良好交叉部分。
JIT CSS 的最大卖点似乎在于它可以通过仅包含正在使用的实用程序类来减小样式表的尺寸。但是,它仍然没有解决它在 HTML 中添加的额外膨胀问题。如果没有实用程序类,我有一个可以在页面上多个元素上使用的类。使用实用程序类,大多数开发人员最终会对每个元素使用相同的 10 个实用程序类名称。调试设计问题并尝试在大型项目中数百个类名中找到真实的 HTML 内容令人沮丧。
我记得像Zeldman、Dave Shea和Roger Johansson这样的行业领袖最初警告过混合标记和样式并鼓励语义化设计。HTML5 诞生于创建更多语义化元素、删除样式标签以及创造一个 HTML 唯一用于标记内容而 CSS 为该标记添加设计的未来的想法。
我理解时代在变,Web 不仅仅用于简单的 Web 文档,但原则是一样的。为什么我们要重复过去的错误,我们的标记由于存在仅用于附加大量类名的荒谬数量的
<div>
标签而变得几乎不可读。似乎开发人员不再愿意费心计划他们的应用程序,使用可重复的模式转换为单个类名,这些类名充当其样式的挂钩。这是我一直不明白的一个抱怨。使用 jit/atomic/utility CSS 与使用语义类名并不冲突。我通常在所有内容上都使用 BEM 样式的类名,以便我理解上下文,然后是后面的原子名称。(我通常在 BEM 名称后面没有 CSS。)
原子 CSS 对我的情况非常有效,但可能对您无效。我参与许多不同的项目,并且由于我们的团队使用原子 CSS,因此我无需学习/记住任何 CSS 即可立即开始工作,而无需担心破坏任何内容。
我在 2014 年编写了一个用于将 HTML 类属性编译为原子 CSS 的 Gulp 插件。由于它从未流行过,所以我认为它不值得任何历史认可——我只是在这里将其作为一种奇特的东西提供
https://github.com/internetErik/gulp-atomicscss
我使用 Emmet CSS 缩写作为我的语法,以及一些用于悬停、断点以及可选地将某些类分组在一个标签下的语法。我不确定我是否将其保留在工作状态,但很容易修复。
我发现从我用 SCSS 编写的配置文件中生成我自己的原子类以及为此目的而创建的小型库更容易
https://github.com/internetErik/atomic-scss
使用“实用优先”样式和“JIT”编译的最大好处是强制执行样式指南单位大小系统(REM、EM 和像素)。