前端刷题系列:CSS 选择器的优先级是如何计算的?

前端刷题系列正在更新:02/100+

原项目回答

浏览器通过优先级规则,判断元素展示哪些样式。优先级通过 4 个维度指标确定,我们假定以a、b、c、d命名,分别代表以下含义:

  1. a表示是否使用内联样式(inline style)。如果使用,a为 1,否则为 0。
  2. b表示 ID 选择器的数量。
  3. c表示类选择器、属性选择器和伪类选择器数量之和。
  4. d表示标签(类型)选择器和伪元素选择器之和。

优先级的结果并非通过以上四个值生成一个得分,而是每个值分开比较。a、b、c、d权重从左到右,依次减小。判断优先级时,从左到右,一一比较,直到比较出最大值,即可停止。所以,如果b的值不同,那么cd不管多大,都不会对结果产生影响。比如0,1,0,0的优先级高于0,0,10,10

当出现优先级相等的情况时,最晚出现的样式规则会被采纳。如果你在样式表里写了相同的规则(无论是在该文件内部还是其它样式文件中),那么最后出现的(在文件底部的)样式优先级更高,因此会被采纳。

在写样式时,我会使用较低的优先级,这样这些样式可以轻易地覆盖掉。尤其对写 UI 组件的时候更为重要,这样使用者就不需要通过非常复杂的优先级规则或使用!important的方式,去覆盖组件的样式了。

我的补充回答

CSS 选择器优先级决定了当多个规则应用于同一元素时,哪条规则的样式会被应用。优先级由选择器的特殊性 (specificity) 决定,特殊性越高,优先级越高。

特殊性计算方法

特殊性由四个部分组成,从左到右,重要性依次递减:

  1. 内联样式 (Inline styles): 元素的 style 属性中定义的样式,特殊性值为 1,0,0,0。例如:<div style="color: red;"></div>
  2. ID 选择器 (ID selectors): 使用 # 符号选择元素,特殊性值为 0,1,0,0。例如:#header
  3. 类选择器、属性选择器和伪类 (Class selectors, attribute selectors, and pseudo-classes): 使用 .[ ],:选择元素,特殊性值为 0,0,1,0。例如:.button[type="text"]:hover
  4. 元素选择器和伪元素 (Type selectors and pseudo-elements): 使用元素名称或 :: 选择元素,特殊性值为 0,0,0,1。例如:div::before

计算规则:

  • 将每个选择器的特殊性值相加,得到一个四位数。
  • 比较四位数,从左到右,数值大的优先级更高。
  • 如果四位数完全相同,则后定义的规则优先级更高。
  • !important 规则具有最高的优先级,它会覆盖任何其他规则。

示例

/* 特殊性值: 0,1,0,0 */
#header {
  color: red;
}

/* 特殊性值: 0,0,1,1 */
div.content p::first-line {
  color: blue;
}

在上面的例子中,#header 的特殊性值更高,因此它的样式会被应用。

注意事项

  • 通配符选择器 (*) 和关系选择器 (例如 +~) 对特殊性没有贡献。
  • 计算特殊性时,不要考虑继承的样式。

原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/49616.html

(0)
速盾高防cdn's avatar速盾高防cdn
上一篇 2024年5月6日 下午7:53
下一篇 2024年5月6日 下午7:54

相关推荐

  • 如何将网站设为浏览器的首页?

    你是否曾经遇到过每次打开浏览器都要手动输入网址的烦恼?或者是想要快速访问某个网站却不知道如何设置?那么,今天就让我们来探讨一下如何将网站设为浏览器的首页吧!通过本文,你将了解到什么…

    问答 2024年4月4日
    0
  • h3cs3600交换机配置指南(详解)

    想要在网络行业有所作为,掌握一款优秀的交换机是必不可少的。而h3cs3600交换机作为一款备受推崇的产品,其配置指南更是备受关注。那么,什么是h3cs3600交换机?它有哪些独特的…

    问答 2024年4月17日
    0
  • 二叉树的前中后序遍历及其应用场景

    二叉树,这个概念在网络行业中经常被提及,但是你真的了解它吗?它到底是什么?如果你还没有弄清楚,那么不妨跟着我一起来探究一下吧。今天我将为大家介绍二叉树的前中后序遍历及其应用场景。通…

    问答 2024年4月5日
    0
  • 什么是gracenote?(详细介绍)

    Gracenote,这个名字听起来似乎有些陌生,但它却是网络行业中备受瞩目的一个技术。它究竟是什么?它的历史发展又是如何的?在网络行业中有着怎样的应用场景?与其他相关技术相比,它又…

    问答 2024年4月12日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注