提高 CSS 特异性的最高效的方式是啥?

Posted

技术标签:

【中文标题】提高 CSS 特异性的最高效的方式是啥?【英文标题】:What is the most character-efficient way to increase CSS specificity?提高 CSS 特异性的最高效的方式是什么? 【发布时间】:2013-10-24 08:14:55 【问题描述】:

如果我想增加规则的 CSS 特异性,我倾向于使用html 作为前缀,但我想知道是否有更简洁的方法可以做到这一点?

(这似乎是一个微不足道的问题,但在我的样式表定义响应式网格的过程中,将特异性前缀减少一个字符将节省几百字节)

【问题讨论】:

你为什么要打扰html ?样式是否被覆盖?如果他们使用相同的选择器,为什么不在其他样式表之后包含该样式表 定义“字符效率”。然后告诉我们为什么它很重要。 @EJP 所说的字符效率是指使用尽可能少的字符,我已经解释了好处是什么 @Smokeyphp 好电话 - 我在发布后不久意识到 2 个样式表的顺序很愚蠢,现在它可以工作而不必担心具体性。虽然我仍然很想知道html 是否可以改进 【参考方案1】:

这实际上取决于您要达到的目标。一种增加特异性的廉价方法是简单地重复选择器。例如,如果这是您的标记:

<figure id="myId" class="myClass"></figure>

这是你的 CSS:

#myId.myClass  color:red; font-weight:bold;       /* Specificity: 110 */

您可以简单地重复 classid 选择器而无需修改您的标记:

#myId.myClass.myClass  color:green;               /* Specificity: 120 */
#myId#myId  font-weight:normal;                   /* Specificity: 200 */

JSFiddle demo.

这是完全有效的,正如 W3C 选择器级别 3 建议在其Calculating Specificity section 中所述:

注意:允许重复出现相同的简单选择器并且确实会增加特异性。

【讨论】:

+1 - 在大多数情况下,文件大小会比前缀 html 更大,但同样是一个巧妙的小技巧 不确定该链接是否以任何方式相关。这里每条规则只有一个选择器,所以从右到左没有什么可读取的。此外,如果您要链接到另一个 Stack Overflow 答案,just link directly to the answer。 我从研究中找到了这个链接,但没有参考任何 SO 答案。如果我能建立一个答案,我肯定会把答案联系起来。 @Nathan Lee:我是说那篇文章本身链接到 SO,所以不是链接到文章,而是链接到该文章链接到的答案,让每个人都毫无意义额外的点击。 是的@BoltClock。事实上,我在 SO 中读到了同样的内容,但回去看看他们是否有任何其他信息,然后继续从我获得链接的地方链接它。如果下次遇到任何此类类似情况,应直接链接到 SO。谢谢。值得一提。【参考方案2】:

最少字节,但具体多少?

在我看来,对于选择器,在大多数情况下,你不能得到任何短于两个字符加上空格的字符,特别是如果我们正在谈论添加特异性的“全局”使用(这似乎是因为你使用html)。因此,为了节省 CSS,您需要在 html 上使用单个字符 id。我会说一个 id (而不是一个类),因为你想保持它的唯一性。所以你在 html 中像这样实现:

<html id="A">

这允许在 CSS 中添加尽可能短的选择器:

#A .whateverYour [OriginalSelector] string .was 

然后使用 James Donnelly 所说的(顺便说一下,我从来不知道相同选择器的重复),您可以使用最少的字符不断添加越来越多的特异性,如下所示:

#A#A#A .whateverYour [OriginalSelector] string .was 

免责声明

按照我的回答,我不建议这一定是做 CSS 的好方法,也不是处理特殊性问题的好方法。但我确实相信,将短的一个字符 id 添加到 html 元素是可以用来增加任何选择器的特异性的最少字节数,这回答了这里的问题。

【讨论】:

+1 很好的答案,但这也让我意识到我真正想要回答的问题是如何少量增加特异性。使用类而不是 id 会有所帮助(但也会更容易受到其他地方使用的类的影响)。尽管这确实回答了最初的问题,但我不会纯粹将其标记为答案,因为正如您所说,实际使用它是一个坏主意,我根本不想推广它。 @wheresrhys:也许你应该改变你的问题。另外,我不想将其标记为答案有点困惑,因为“实际使用它是一个坏主意,我根本不想推广它”,而我的答案是 完全相同的事情 (除了特异性差异之外)您已经在使用 html 加法,只少了两个字符(这是您要解决的原始问题)。因此,对于您提出的有关如何做的问题,不想宣传您已经在做的事情似乎很奇怪。 简单地说,如果它旁边有一个绿色的勾号,人们可能不会阅读所有的警告,而是继续使用你自己说的,不是你推荐的东西。 @wheresrhys:我明白这一点。那么这让我想知道,你是否应该删除整个问题,因为整个前提是错误的? 我认为不是,因为这是一个有效的问题,可以确定是否可以更有效地提高特异性,并且您的答案和另一个答案都可能有有效的用例。还有一些人为这个问题加注了星标,所以我会听从人群【参考方案3】:

我见过一个 postcss 库使用 :not(#\9),它很短,增加了 1 的特异性,并且基本上适用于所有东西。不适用于 ie8 或更低版本,但来吧,这是 2020 年

【讨论】:

谢谢!这是一个很好的答案,因为它不需要额外的设置。 +1! \9 是什么意思? 不知道 ? ASCII 9? 实际上是ascii 9,它是一个,所以整个选择器是“任何id不是制表符的元素”

以上是关于提高 CSS 特异性的最高效的方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将 CSS 库集成到 WordPress 中的最简单方法是啥

显卡特效中的各向异性过滤是啥

CSS选择器级联/特异性未按预期工作

UITableView:创建索引的最高效方式?

逻辑组合布尔值列表的最“pythonic”方式是啥?

以块为单位迭代列表的最“pythonic”方式是啥?