前几天我和 Eric Meyer 聊天,我想起了我成长过程中的一件关于 Eric Meyer 的事。 我写了一篇关于 CSS 特异性的博客文章,Eric 花时间 指出了它的误导性(我还记得我匆匆忙忙地去更新它)。 为什么会误导? 因为我将特异性描述为一个十进制系统。
假设你用 ul.nav
选择一个元素。 在那篇文章中,我暗示该选择器的特异性是 0011(本质上是十一),这是一个十进制系统中的数字。 所以我说标签 = 0,类 = 10,ID = 100,样式属性 = 1000。 如果特异性是像那样在十进制系统中计算的,那么像 ul.nav.nav.nav.nav.nav.nav.nav.nav.nav.nav.nav
(11 个类名)这样的选择器将具有 0111 的特异性,这将与 ul#nav.top
相同。 这不正确。 现实情况是它将是 (0, 0, 11, 1) 与 (0, 1, 0, 1) 相比,后者明显获胜。
我刚刚使用的这种逗号分隔的语法解决了两个问题
- 它不会暗示十进制系统(或任何数字系统)
- 它具有独特且易读的外观
我喜欢 (X, X, X, X) 的外观。 我能看到将其限制为 (X, X, X),因为样式属性并不完全是选择器,通常不会在同类对话中讨论。 圆括号对我来说更清楚,但我也可以看到一个 X-X-X(以连字符分隔)语法,它不需要它们,或者一个 (X / X / X) 语法,它可能需要圆括号。
选择器级别 3 短暂地使用连字符。 级别 2 在不同的地方 使用连字符和逗号。
无论如何,看来我每隔五年左右就会 提到这件事。
所以就像 semver 一样,它不会溢出到更有意义的部分,这绝对有道理
你可以使用点符号,然后更大的数字更具体的思想就成立了。
1.0.1 与 0.11.1
同意。 与版本号类似。
酷炫的回忆之旅,感谢 CSS 特异性带来的乐趣! 我确实建议交换 这对于一般地权衡给定选择器的特异性来说是一个非常有用的工具。 就像你指出的那样,如果我们使用固定的 10 而不是 CSS 特异性算法中的“广义”基数进行计算,那么该模型将失败。 我认为除了广义算法的概念之外,另一个让人们更加困惑的因素是 !important 声明如何影响权重计算。 这导致人们过度依赖该声明来解决特异性冲突,而当在 CSS 中使用更具体的选择器解决这些冲突时,!important 声明可以用于它所打算的用途:确保我的用户样式表规则确实会覆盖作者提供的规则,通常是因为我有一个 #A11Y 问题,并且出于需要应用我的个人样式。 否则,级联的优雅将被打破。 一些用户仍然希望采用内置的干净 CSS 缩放方法。 感谢你让我再次对特异性充满热情,出于某种原因,这是一种长寿的魅力,源于我自己在过去的日子里犯下的愚蠢错误!
很棒的文章。 我一直认为在没有分隔符的情况下写特异性是模棱两可的,可能会造成麻烦。 感谢你提出这一点。
我也同意我们可以从计算中删除内联样式 - 为了简洁 - 就像我们对 !important 关键字所做的那样,因为两者都否定了其他所有内容。 而且大多数时候它们都没有(阅读:不应该)使用。 此外,(X, X, X) 比 (X, X, X, X, X) 更易读。
顺便说一句 -
ul#nav.top
的特异性是 (0, 1, 1, 1),而不是“(0, 1, 0, 1)”。