CSS选择器优先级的计算

一、什么是选择器的优先级

既然是深入了解,那么我们肯定先要知道什么是选择器的优先级,这里我就直接引用MDN Web Docs的解释。

浏览器通过优先级来判断哪些属性值与一个元素最为相关,从而在该元素上应用这些属性值。优先级是基于不同种类选择器组成的匹配规则。

看概念总是抽象的,最直观的感受就是: 你为页面上的同一个元素设置多个属性,有时候设置的一个样式死活没有生效,这时候您遇到的很可能就是CSS选择器的优先级问题了。


* {
margin: 0;
padding: 0;
}
body .box1{
width: 300px;
height: 300px;
background-color: orange;
}
.box1{
/*样式将无法生效*/
/*因为这个选择器的优先级不够body .box1高*/
background-color: red;
} <div class="box1">
我的样式涉及到了选择器优先级问题
</div>

二、优先级的计算与比较(一)

那首先我们就必须知道CSS各选择器(这里还一些特殊声明)之间的基础优先级是如何的

!important > 内联样式 > id选择器 > 类/伪类选择器 > 标签/伪元素选择器 > 通配选择器 > 继承的样式

我们可以量化上面说到的选择器基础优先级
!important 9999
内联样式 1000
id选择器 100
类/伪类选择器 10
标签/伪元素选择器 1
通配选择器 0
继承的样式 不存在优先级 那么就能计算出最开始里例子中个个选择器的优先级,从而判断出最终应用的样式 /*优先级为: 1 + 10 = 11*/
body .box1{
width: 300px;
height: 300px;
background-color: orange;
} /*优先级为: 10*/
.box1{
background-color: red;
}

优先级的计算还具有以下条件:

  1. 优先级具有可加性
  2. 选择器优先级不会超过自身最大数量级
  3. 同等优先级情况下,后写的覆盖前写的
  4. 并集选择器之间的优先级是独立的

我来为大家一个个解释:

优先级具有可加性
这个很简单就能知道
/*优先级都是能够简单相加的: 11*/
p.box1{
width: 100px;
}
选择器优先级不会超过自身最大数量级

上面我们解释了优先级的可加性,那么有些丧心病狂的人可能就会想,既然优先级能够简单相加,那我直接用多个低优先级的选择器相加不就能够突破优先级的问题? 我想说:too young, too simple!

/*优先级: 100*/
#box1{
background-color: red;
} 优先级不能超过自身最大量级: 99 /*全是类选择器,优先级为: 90 */
.a1.a2.a3.a4.a5.a6.a7.a8.a9.a10.a11{
background-color: blue;
} <div id="box1" class="a1 a2 a3 a4 a5 a6 a7">
我是红色的
</div>
同等优先级情况下,后写的覆盖前写的
#box1{
width: 100px;
} #box1{
width: 200px;
} <div id="box1">
宽度为200px
</div>
并集选择器之间的优先级是独立的
/*优先级有两个*/
/* 标签选择器:1 */
/* id选择器: 100 */
p,
#box1{
background-color: orange;
}

优先级的计算与比较(二)

刚刚已经介绍完了第一种选择器优先级的计算方式,不得不说还是比较复杂的。现在就为大家介绍第二种优先级的计算方式,也是我个人比较推荐的一种。

我们假定优先级的计算由A、B、C、D四个项的值来决定
1. 判断是否存在内联样式,存在A=1, 否则A=0
2. B的值是id选择器出现的次数
3. C的值是类选择器出现的次数
4. D的值是标签选择器出现的次数

简单来看两个例子:

#box1 ul > li > a.myClass{
width: 100px;
} 没有内联样式:A=0
一个id选择器:B=1
一个类选择器:C=1
三个标签选择器: D=3 综上,优先级为: 0 1 1 3
#box1 ul > li > a.myClass{
width: 100px;
}
<div id="box1" style="height:100px;"></div> 有内联样式:A=1
一个id选择器:B=1
一个类选择器:C=1
三个标签选择器: D=3 综上,优先级为: 1 1 1 3

优先级已经计算出来了,那么接下来就是如何去比较的问题了:

  1. 从左到右比较
  2. 有一个值大于另一个值则比较完毕
    1. 上面例子中0113与1113比较,第一位的0小于1所以1113的优先级较大
  3. 如果从左到右全部值相等,则后写的样式覆盖前面写的

写在最后

这是我的第一篇博客,我是一名正在学习前端的小白,有错误的地方希望大家能够多多谅解与指出,一起努力、加油吧!

看完就懂--CSS选择器优先级的计算的更多相关文章

  1. 深入理解CSS选择器优先级的计算

    选择器的优先级关系到元素应用哪个样式.在CSS2.1的规范(http://www.w3.org/TR/2009/CR-CSS2-20090908/cascade.html#specificity)中是 ...

  2. css 选择器优先级的计算过程

    以下转自互联网 下面看看官方对选择器的定义:一个选择器的优先级由四个数字a,b,c,d确定.当比较两个选择器时,先比较a,a值大的优先级高,如果a相等则比较b,b值大的优先级高,以此类推.因此,无论b ...

  3. 深入理解CSS选择器优先级

    题外话 今天把 <CSS REFACTORING>(中文名叫<CSS重构:样式表性能调优>)电子书粗略的浏览了一遍,这本书很薄,150页左右,首先是介绍了什么是重构并举了两个简 ...

  4. 关于Css选择器优先级

    今天练习css的时候,重叠后的style发现不起作用,原来css选择器优先级大有文章. 声明: yi下内容选自 51cto.com  --加以自己的理解 以备日后参照使用,毕竟自己理解的才是自己的. ...

  5. 深度剖析HashMap的数据存储实现原理(看完必懂篇)

    深度剖析HashMap的数据存储实现原理(看完必懂篇) 具体的原理分析可以参考一下两篇文章,有透彻的分析! 参考资料: 1. https://www.jianshu.com/p/17177c12f84 ...

  6. CSS选择器优先级(转)

    原文:http://www.cnblogs.com/wangfupeng1988/p/4285251.html 另外,w3c有文章介绍了CSS选择器的特定性,见https://www.w3.org/T ...

  7. [转帖]Linux shell中2>&1的含义解释 (全网最全,看完就懂)

    Linux shell中2>&1的含义解释 (全网最全,看完就懂) https://blog.csdn.net/zhaominpro/article/details/82630528   ...

  8. 2018前端面试总结,看完弄懂,工资少说加3K | 掘金技术征文

    2018前端面试总结,看完弄懂,工资少说加3K | 掘金技术征文:https://juejin.im/post/5b94d8965188255c5a0cdc02

  9. day44:CSS选择器优先级&JS基础

      目录 1.CSS选择器优先级 2.补充:margin是可以设置百分比的 3.JS 3.1 js代码的引入方式 3.2 变量 3.3 数据类型 3.4 数组(类似于python中的列表) 3.5 自 ...

随机推荐

  1. 三维CAD——基于B_rep的建模操作

    内容来自高老师的<三维CAD建模>课,本文就主要介绍半边结构和欧拉操作以及代码实现. 1. 边界表示法及其数据结构 · 拓扑结构 a.拓扑元素:面.边.点.体 b.拓扑关系:9种.V{V} ...

  2. 「LYOI2018 Summer」Hzy's Rabbit Candy----拓扑排序问题

    「LYOI2018 Summer」Hzy's Rabbit Candy 题目描述 Hzy 和她的 m 只兔兔在一个 n 个点 m 条边的有向无环图上玩. 为了让兔兔们开心,Hzy 带了一些糖.Hzy ...

  3. 【bzoj 2467】[中山市选2010]生成树(数论--排列组合)

    题目:有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈.在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形.这些五角形只在五角形圈的中心的圈上有 ...

  4. Codeforces Round #345 (Div. 1) C. Table Compression (并查集)

    Little Petya is now fond of data compression algorithms. He has already studied gz, bz, zip algorith ...

  5. ZeptoLab Code Rush 2015 B. Om Nom and Dark Park

    Om Nom is the main character of a game "Cut the Rope". He is a bright little monster who l ...

  6. hdu4770 Lights Against Dudely

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  7. 洛谷 P6851 onu (贪心,模拟)

    题意:C和D打牌,每张牌有花色和点数,小D刚开始的分数为\(v\),不管输还是赢,只要小D出了牌(花色必须相同),就能得到那张牌点数的分数,若是赢了(点数不小于D的牌),他可以另外加\(c\)分,输了 ...

  8. solidity的函数修改器(modifier)

    内容:modifier的定义.modifier对函数参数的操作.modifier执行的顺序 modifier的定义 官方文档:modifier可以改变函数的行为.可以被继承和重写. 其实modifie ...

  9. Python+Appium实现自动抢微信红包

    前言 过年的时候总是少不了红包,不知从何时开始微信红包横空出世,对于网速和手速慢的人只能在一旁观望,做为python的学习者就是要运用编程解决生活和工作上的事情. 于是我用python解决我们的手速问 ...

  10. Chapter Zero 0.2.1 执行运算与判断的CPU

    目录 执行运算与判断的CPU CPU效能比较的指标 CPU的工作频率:外频与倍频 32位与64位的CPU与总线[宽度] CPU的等级 超线程(Hyper-Threading,HT) 网上摘下几张主板图 ...