您可以在一个 HTML 元素上使用多个类
<div class="module p-2"></div>
没有任何错误或无效的地方。 它有两个类。 在 CSS 中,这两个类都会被应用
.module { }
.p-2 { }
const div = document.querySelector("div");
console.log(div.classList.contains("module")); // true
console.log(div.classList.contains("p-3")); // false
但是分组它们呢? 我们这里只有一个空格分隔的字符串。 也许这很好。 但也许我们可以让事情更清晰!
几年前,Harry Roberts 谈到了分组它们。 他将类组用方括号括起来
<div class="[ foo foo--bar ] [ baz baz--foo ]">
上面的示例类名完全是抽象的,只是为了演示分组。 想象一下,它们就像主要名称和变体作为一个组,然后是实用程序类作为另一个组
<header class="[ site-header site-header-large ] [ mb-10 p-15 ]">
那些方括号? 毫无意义。 它们只是为了让我们开发人员在视觉上表示这些组。 从技术上讲,它们也是类,所以如果某个虐待狂写了 .[ {}
,它会在你的 CSS 中执行一些操作。 但这种情况不太可能发生,希望组的清晰度胜过它,对我们更有帮助。
上面的例子将主要名称和一个变体分组在一个组中,将一些示例实用程序类分组在另一个组中。
我不一定推荐这种方法。 它们只是你可能拥有的类组。
以下是以不同分组方式进行的相同分组风格
<button class="[ link-button ] [ font-base text-xs color-primary ] [ js-trigger ]" type="button" hidden>
该示例包含一个主要名称,具有不同命名风格的实用程序类,以及一个用于 JavaScript 特定选择器的第三个组。
Harry 在几年前就放弃了这种方法,他说它的外观对于他合作过的各种人和他团队来说太奇怪了。 它引起了足够的混乱,以至于分组类的益处不值得。 他建议使用换行符代替
<div class="media media--large
testimonial testimonial--main">
在我看来这似乎同样清晰。 HTML 中的换行符完全没问题。 此外,浏览器不会有任何问题,而且 JSX 通常在 HTML 中使用大量换行符,因为在元素中添加了大量额外内容,例如事件处理程序和道具。
也许我们可以将换行符作为分隔符和标识组的思想结合起来……使用表情符号!
查看 Pen
分组类 by Chris Coyier (@chriscoyier)
on CodePen.
很奇怪,但很有趣。 表情符号在那里完全有效。 就像方括号一样,如果有人为它们编写了一个类名,它们也可以执行一些操作,但这通常不太可能,而且需要团队讨论。
我见过另一种方法是使用data-*
属性来代替类进行分组,比如……
<div
class="primary-name"
data-js="js-hook-1 js-hook-2"
data-utilities="padding-large"
>
您仍然可以在 CSS 和 JavaScript 中根据属性进行选择和样式化,因此它具有功能性,尽管由于笨拙的选择器(如[data-js="js-hook-1"]
)和缺少像classList
这样的便捷 API,因此略有不方便。
您呢? 您是否还有其他巧妙的类名分组想法?
我一直认为在自己的工作中使用符文作为类会很酷,例如 ᚸ-button。 然后我在一个 codepen 中试了一下。 它起作用了,但我无法找到任何备用代码来轻松地在机器中键入符文。 由于复制粘贴太多,拥有真正“金属”的类名失败了。
人们总是可以为其创建自己的 Emmet 快捷方式
最简单的方法可能是通过 AutoHotkey 或类似软件将键盘上的组合键绑定到这些符号。
我从未想过这一点,但我认为这是一个很巧妙的想法…… :)
大多数方法的问题在于可能对其他开发人员造成混淆,尤其是在大型不断发展的团队中。 他们可能会挠头,需要解释,或者争论组名和表情符号。 你最终可能不会节省任何时间或认知资源!
我认为最简单的方法是在视觉上进行分离,而不会造成太多混淆,那就是对组进行双空格。 即使那样,你也可能会收到关于删除多余空格的评论!
自从 2013 年阅读朋友的一篇文章以来,我一直使用管道符号
|
来分隔 HTML 类名中使用的不同组。 – https://beneverard.co.uk/blog/using-slashes-within-the-html-class-attribute/它对我和我合作过的几个团队来说仍然有效。
这是一个很好的视觉提示,表明“这些类名适用于此,这些类名适用于此”。
实际上,我使用双空格来在视觉上分隔类组。 虽然很微妙,但比什么都没有好,而且应用起来非常容易。
此外,如果您对类进行前缀(例如,将
u-xxx
用于实用程序类),则可以对其进行 lint 检查。竖线:
<div class="stuff | other stuff | more stuff">
方括号是一个有趣的想法,但对我来说,我认为对类进行命名空间就足够了。 我通常有一系列命名空间,例如 u- 用于实用程序、c- 用于组件、l- 用于布局、js- 用于 JavaScript 等。
我过去曾使用数据属性来进行内容变化。 这是一种可以用类来完成的事情,但我发现它有助于澄清问题。 一个例子是包含链接的内容块。 这些链接没有用于样式化的类,而是根据上下文进行样式化(.something > a {})。 每个链接都具有一个 data-target 属性,其中包含其指向的网站的名称。 这带来的好处是,我可以针对单个链接进行样式化(例如,Facebook 链接变为蓝色,Instagram 链接变为粉色),但我也可以在伪元素中使用 data-attribute 值,例如,如果链接文本不是目标的名称,并且我想在悬停时显示带样式的叠加层。 使用这种方法,我可以在不改变标记的情况下尝试不同的样式,甚至根据主题在它们之间切换。
我从未真正考虑过以将某种容器包含在内以对相关项进行分组的方式组织类。 在我看来,BEM 已经做到了这一点……前提是您按顺序声明它们(即
block block__elem block--mod
)话虽如此,我有点喜欢括号的想法……但我可能只会使用竖线(即
container-fluid | bg-primary text-secondary | p-2 m-4
)对我来说,这比括号更简洁……或者至少涉及更少的打字。
如果您按字母顺序排列类,则可以避免整个问题。
$(element).addClass(‘foo’);
这就是让我认为这个“分组系统”毫无用处的原因。 JavaScript 库和框架并非旨在在保持分组意识的同时操作类。 可能的解决方案在于某个 webpack 模块(我尚不清楚)也许(?)
分组仅针对开发人员。 用于快速查看一些标记并了解情况。 DOM 中发生了什么并不重要。
您知道这会如何影响特异性吗?
与这个话题略微相关——我非常喜欢在 JS 中使用的任何类前面加上 js-。 所以你通常会得到类似的东西
这可以让任何熟悉项目或不熟悉项目的开发人员立即知道该类是在 CSS 中使用还是在 Javascript 中使用。 这样你就不会再遇到删除一个看起来无害的类,然后发现一些 Javascript 依赖于该类的情况了。
出于纯粹的样式考虑,我使用 BEM,虽然它不从技术上对选择器进行分组,但这确实很有帮助。