CSS选择器优先级的计算

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

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

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

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


  1. * {
  2. margin: 0;
  3. padding: 0;
  4. }
  5. body .box1{
  6. width: 300px;
  7. height: 300px;
  8. background-color: orange;
  9. }
  10. .box1{
  11. /*样式将无法生效*/
  12. /*因为这个选择器的优先级不够body .box1高*/
  13. background-color: red;
  14. }
  15. <div class="box1">
  16. 我的样式涉及到了选择器优先级问题
  17. </div>

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

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

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

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

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

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

我来为大家一个个解释:

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

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

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

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

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

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

简单来看两个例子:

  1. #box1 ul > li > a.myClass{
  2. width: 100px;
  3. }
  4. 没有内联样式:A=0
  5. 一个id选择器:B=1
  6. 一个类选择器:C=1
  7. 三个标签选择器: D=3
  8. 综上,优先级为: 0 1 1 3
  1. #box1 ul > li > a.myClass{
  2. width: 100px;
  3. }
  4. <div id="box1" style="height:100px;"></div>
  5. 有内联样式:A=1
  6. 一个id选择器:B=1
  7. 一个类选择器:C=1
  8. 三个标签选择器: D=3
  9. 综上,优先级为: 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. Codeforces Round #684 (Div. 2)【ABC1C2】

    比赛链接:https://codeforces.com/contest/1440 A. Buy the String 题解 枚举字符串中 \(0\) 或 \(1\) 的个数即可. 代码 #includ ...

  2. POJ - 3693 Maximum repetition substring(重复次数最多的连续重复子串)

    传送门:POJ - 3693   题意:给你一个字符串,求重复次数最多的连续重复子串,如果有一样的,取字典序小的字符串. 题解: 比较容易理解的部分就是枚举长度为L,然后看长度为L的字符串最多连续出现 ...

  3. HDU - 2328 Corporate Identity(kmp+暴力)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2328 题意:多组输入,n==0结束.给出n个字符串,求最长公共子串,长度相等则求字典序最小. 题解:(居 ...

  4. hdu3565 Bi-peak Number (有上界和下界的数位dp)

    Problem Description A peak number is defined as continuous digits {D0, D1 - Dn-1} (D0 > 0 and n & ...

  5. C# List.Sort与IComparer接口及Comparison委托应用于集合排序

    C#里List.Sort的用法 using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  6. C# 之 async / await

    直接看一个例子 private async void button1_Click(object sender, EventArgs e) { var t = Task.Run(() => { T ...

  7. Kubernets二进制安装(3)之准备签发证书环境

    1.在mfyxw50机器上分别下载如下几个文件:cfssl.cfssl-json.cfssl-certinfo cfssl下载连接地址: https://pkg.cfssl.org/R1.2/cfss ...

  8. C# Dictionaries

    Dictionaries 字典 在C# 里是用接口 IDictionary来实现的,最常用的字典就是Dicrtionary<tkey,tvalue>,键值对的形式,和index,item ...

  9. Cortex-M3 内核中悬起标志位细节逻辑

    对于外设中断,如果通过NVIC_DisableIRQ(xxx)关闭对应NVIC里面的使能位,会导致对应中断Pend位置起,如果清除Pend位时不清外设的中断标志位将导致对应Pend位立刻再次置起.所以 ...

  10. O&#178; & O₂

    O² & O₂ special symbol O² & O₂ HTML HTML subscript and superscript Tags HTML 下标元素 HTML 上标元素 ...