CSS权重以及特殊值计算方法

css优先级计算规则

首先了解下什么是特殊性?
css继承是从一个元素向其后代元素传递属性值所采用的机制。确定应当向一个元素应用哪些值时,浏览器不仅要考虑继承,还要考虑声明的特殊性,另外需要考虑声明本身的来源。这个过程就称为层叠。——《css权威指南》

上面这句话有两个词需要稍作解释,“声明”和“特殊性”。如下图,css规则由选择器和声明块组成,写在选择器后面大括号里的就叫声明。
在这里插入图片描述

1. 选择器的权重顺序

  实际上,同一个元素可以使用多个规则来指定它的字体颜色,每个规则都有自己的选择器。显然最终只有一个规则起作用(不可能一个字既是红色又是绿色),那么该规则的特殊性最高,特殊性即css优先级。很多同学仅仅知道选择器CSS 优先规则优先级关系:!important>内联样式 > ID 选择器 > 类选择器 = 属性选择器 = 伪类选择器 > 标签选择器 = 伪元素选择器。同等条件下,就近优先级越高。

2. 复杂的特殊值计算方法和注意事项

  而不知道ID的优先级为什么大于class的优先级。那么css优先级到底是怎么计算的呢?
选择器的特殊性值表述为4个部分,用0,0,0,0表示.

  • ID选择器的特殊性值,加0,1,0,0。

  • 类选择器、属性选择器或伪类,加0,0,1,0。

  • 元素和伪元素,加0,0,0,1。

  • 通配选择器*对特殊性没有贡献,即0,0,0,0。

  • 最后比较特殊的一个标志!important(权重),它没有特殊性值,但它的优先级是最高的,为了方便记忆,可以认为它的特殊性值为1,0,0,0,0。

  • 通配选择器定义的规则优先级高于元素继承过来的规则的优先级。

    例如:以下规则中选择器的特殊性分别是:

1 a{color: yellow;} /*特殊性值:0,0,0,1*/
2 div a{color: green;} /*特殊性值:0,0,0,2*/
3 .demo a{color: black;} /*特殊性值:0,0,1,1*/
4 .demo input[type="text"]{color: blue;} /*特殊性值:0,0,2,1*/
5 .demo *[type="text"]{color: grey;} /*特殊性值:0,0,2,0*/
6 #demo a{color: orange;} /*特殊性值:0,1,0,1*/
7 div#demo a{color: red;} /*特殊性值:0,1,0,2*/

   对照下面的demo,来验证上面几组规则的正确与否:

<a href="">第一条应该是黄色</a> <!--适用第1行规则-->
<div class="demo">
    <input type="text" value="第二条应该是蓝色" /><!--适用第4、5行规则,第4行优先级高-->
    <a href="">第三条应该是黑色</a><!--适用第2、3行规则,第3行优先级高-->
</div>
<div id="demo">
    <a href="">第四条应该是红色</a><!--适用第6、7行规则,第7行优先级高-->
</div>

显示效果:
在这里插入图片描述

    分析上面的demo,要注意特殊性是怎么排序的,上面第4行和第5行规则,第4行之所以优先级比第5行高,是因为第四行特殊性值最后面是1,而第5行特殊性值最后面是0。回过头来回答文章最开始的问题,为什么ID选择器的优先级比类选择器的优先级高?实际上是因为选择器特殊性值是从左向右排序的,特殊性值1,0,0,0大于以0开头的所有特殊性值,即便它是0,99,99,99,优先级依然比1,0,0,0要低。

   前面有讲到通配选择器*的特殊性值是0,0,0,0,而元素通过父元素继承过来的样式是没有特殊性值的,所以,通配选择器定义的规则优先级高于元素继承过来的规则的优先级。

    细心的同学应该已经发现了,特殊性值中的4个0中的第一个0是给谁暗箱操作内定了吗?是的!DOM中的行间样式送了点红包,于是它就牛了。行间样式的特殊性是1,0,0,0。行间样式的优先级比ID选择器优先级高。

2.2权重和特殊性的注意事项

  假如特殊性相同的两条规则应用到同一个元素会怎样?css会先查看规则的权重(!important),加了权重的优先级最高,当权重相同的时候,会比较规则的特殊性,根据前面的优先级计算规则决定哪条规则起作用,当特殊性值也一样的时候,css规则会按顺序排序,后声明的规则优先级高,成为人生赢家,当上总经理出任CEO迎娶白富美。

  我们知道a标签有四种状态:链接访问前、链接访问后、鼠标滑过、激活,分别对应四种伪类:link、:visited、:hover、:active,并且这四个伪类如果对同一个元素设置同一个属性,那它们的声明顺序还有一定要求,一般大家都遵循“爱恨原则LVHA”(LoVe HAte),为什么是这个顺序?不能是其它顺序吗?

2.3伪类的注意事项

  根据css优先级计算规则,伪类的特殊性值是0,0,1,0,4个伪类的特殊性值相同,那么后面声明的规则优先级高。当鼠标滑过a链接时,满足:link和:hover两个伪类,要改变a标签的颜色,就必须将:hover伪类在:link伪类后面声明;同理,当鼠标点击激活a链接时,同时满足:link、:hover、:active三种状态,要显示a标签激活时的样式(:active),必须将:active声明放到:link和:hover之后。因此得出LVHA这个顺序。这个顺序能不能变?可以,但也只有:link和:visited可以交换位置,因为一个链接要么访问过要么没访问过,不可能同时满足,也就不存在覆盖的问题。

#########补充############

  有意思的是,如果某个元素class(类选择器)的数量大于255个,不同的浏览器的表现不一致,包括但不限于以下浏览器认为class选择器的优先级会超过id选择器:

Firefox 52.0.2 (64 位)

IE 11

3. 选择标签的特殊方法

2 div a{color: green;} /*特殊性值:0,0,0,2*/
3 .demo a{color: black;} /*特殊性值:0,0,1,1*/
4 .demo input[type="text"]{color: blue;} /*特殊性值:0,0,2,1*/
5 .demo *[type="text"]{color: grey;} /*特殊性值:0,0,2,0*/
6 #demo a{color: orange;} /*特殊性值:0,1,0,1*/
7 div#demo a{color: red;} /*特殊性值:0,1,0,2*/

  注意上面第5和第7条语法的应用!做到精准选择到某一个标签。 对照下面的demo

<div class="demo">
    <input type="text" value="第二条应该是蓝色" /><!--适用第4、5行规则,第4行优先级高-->
   <a href="">第三条应该是黑色</a><!--适用第2、3行规则,第3行优先级高-->
</div>
<div id="demo">
    <a href="">第四条应该是红色</a><!--适用第6、7行规则,第7行优先级高-->
</div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSS选择器权重计算是通过CSS Specificity(特殊性)来确定的。在计算权重时,可以按照以下规则进行计算: 1. 选择器特殊性选择器本身的组成部分决定,包括元素选择器、类选择器、id选择器和内联样式。通常来说,id选择器特殊性最高,其次是类选择器和属性选择器,再次是元素选择器。 2. 对于相同特殊性选择器,后面出现的选择器会覆盖前面出现的选择器。 3. 使用!important声明的样式具有最高的特殊性,将覆盖其他所有的样式。 根据上述规则,可以用以下公式来计算选择器权重: - id选择器权重为1,例如#myId{} - 类选择器、属性选择器或伪类选择器权重为10,例如.class{}、[type="text"]{}、:hover{} - 元素选择器或伪元素选择器权重为100,例如div{}、::before{} - 内联样式:权重为1000,例如<div style="color:red;"> 在计算完各个选择器权重后,具体的权重比较规则是:按照权重从左到右依次比较,权重较大的样式会覆盖权重较小的样式。 需要注意的是,CSS权重计算只适用于冲突的样式规则。如果没有发生冲突,那么所有样式规则都会生效。 总结起来,CSS选择器权重计算是通过特殊性来确定的,特殊性选择器本身的组成部分决定,而权重比较是按照权重从左到右依次比较的原则。这样,在编写CSS样式时,我们可以更好地控制样式的优先级。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [CSS选择器权重计算(详细)](https://blog.csdn.net/weixin_44164982/article/details/107227294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [CSS选择器权重计算](https://blog.csdn.net/u010297791/article/details/58602255)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值