CSS 选择器(Selector)的权重(Specificity)决定了对于同一元素,到底哪一条 CSS 规则会生效。且仅有当多条 CSS 规则都对同一元素声明了相应样式时,才会涉及到权重计算的问题。

选择器的分类

正式计算选择器权重之前,先来看选择器是如何被分类的。

因为 CSS 选择器众多,在计算时,这些选择器被归为了三大类,按其权重由大到小依次为:

  • ID 选择器:比如 #dialog
  • 元素类型选择器(type selector)和伪选择器(pseudo selector):比如 h1::before
  • 类名选择器(class selector),属性选择器(attribute selector)及伪类选择器(pseudo class selector) :比如 .btn[type="radio"]:hover

其中两类特殊的样式会影响权重的生效,

  • 一是内联样式:style="color:red"。内联样式始终拥有最高的权值,会覆盖样式文件的样式。
  • 另一个是 !important 修饰词。应用该修饰词的规则权重会高于正常的规则,但不推荐。

其他选择器,

  • 全局选择器:*
  • 选择连接符:+,>,-, ,||
  • 伪类反向选择器::not()

以上,对权重的计算没影响,即不参与计算。

权重的计算

根据以上对选择器的分类,对任意样式规则,可得到 (W,X,Y,Z) 这么一个值,其中,

  • W:标识是否有内联样式
  • X:ID 的数量
  • Y:类名选择器,属性选择器及伪类选择器的数量
  • Z:元素选择器,伪选择器 的数量

对于同一元素身上的多条样式,对第条样式规则计算出上面四个值,然后从左往右逐个比较,数字大的胜出。

如果权重全部一样,后面的规则会生效。

示例

示例一

考察下面的示例代码:

<ul class="list"><li class="list-item">item1</li><li class="list-item">item2</li><li class="list-item">item3</li>
</ul>

ul > li {color: blue
}.list > .list-item {color: red;
}

  • 先来分析第一条规则 ul > li ,包含 2 个元素类型选择器,得到的权值为 (0,0,0,2)

  • 再看 .list > .list-item,包含 2 个类名选择器,权值为 (0,0,2,0)

两者一对比,在进行到第三位时,后面的 2>0,所以后者胜出,它的样式将生效,列表颜色为红色。

示例二

<nav id="nav"><ul><li>1</li><li>2</li><li>3</li></ul>
</nav>

nav#nav > li:hover{color: purple;
}li: nth-child(2):hover{color:pink;
}

  • 首先 nav#nav > li:hover 规则中有 1 个 ID 选择器,2 个元素选择器以及 1 个伪类选择器,权值为 (0,1,1,2)

  • li: nth-child(2):hover 中,2 个伪类选择器和 1 个类型选择器,权值为 (0,0,2,1)

一对比,前者胜出,因为比较到第二位时,前者是 1 后者是 0。只要有大于的情况,后面的值就不用比较了。

因此列表中元素在 hover 时,会是紫色(purple)。

相关资源

  • MDN - Specificity
  • Specifishity :: Specificity with Fish
  • CSS Specificity
  • Specifics on CSS Specificity

转载于:https://www.cnblogs.com/Wayou/p/css-specificity-calculation.html

CSS 选择器权重计算规则相关推荐

  1. html内容权重计算,HTML CSS 选择器权重计算规则

    其实,CSS有自己的优先级计算公式,而不仅仅是行间>内部>外部样式:ID>class>元素. 一.样式类型 1.行间 我的行间CSS样式. 2.内联 h1{font-size: ...

  2. [css] 请描述css的权重计算规则

    [css] 请描述css的权重计算规则 权重值计算 选择器 案例 权重值 !important !important Infinity 内联样式 style="-" 1000 ID ...

  3. CSS选择器权重计算与优先级

    CSS选择器权重计算与优先级 选择器有优先级,可以通过权重来计算优先级. 一:优先级 等级划分: 第一优先级:css属性+!important是一种强制改变优先级的方法,它会覆盖页面内任何位置定义的元 ...

  4. Css选择器权重问题

    Css选择器权重问题 我们都知道,在利用HTML+CSS开发网站的时候,CSS的选择器有很多种,例如:行间样式,ID选择器,class类选择器,标签选择器等等,但是当一个标签包含多种选择器时,有作用的 ...

  5. css选择器优先级权重计算规则

    作用: 当多个选择器混合在一起使用时, 我们可以通过计算权重来判断谁的优先级最高 权重大小: 1.内联样式,如: style="...",权值为1000. 2.ID选择器,如:#c ...

  6. 关于CSS选择器优先级的规则说明

    简单规则: !important > 行内样式 > id选择器 > 类选择器 > 元素选择器 > 通配选择器 选择器举例说明: !important: <h1 id ...

  7. css选择器权重排序_CSS选择器的权重与优先规则

    我们在使用CSS对网页元素定义样式时经常会遇到这种情况:要对一般元素应用一般样式,然后在更特殊的元素上覆盖它们.那么我们怎么样来保证我们所新定义的元素样式能覆盖目标元素上原有的样式呢? 在CSS中,会 ...

  8. css选择器权重与优先级

    一:优先级 第一优先级:css属性+!important  拥有最高优先级 第二优先级: 给标签加style,及内联样式    权值1000 第三优先级: id选择器,#id{}            ...

  9. css选择器有哪些,选择器的权重的优先级

    选择器类型: 1.ID #id 2.class .class 3.标签 p 4.通用 * 5.属性 [type="text"] 6.伪类 :hover 7.伪元素 ::first- ...

最新文章

  1. 深度学习 vs 机器学习 vs 模式识别
  2. C语言引用不同路径下的头文件的方法
  3. ElasticSearch 2 (7) - 基本概念
  4. Ubuntu下git使用教程
  5. NLP:LSTM之父眼中的深度学习十年简史《The 2010s: Our Decade of Deep Learning / Outlook on the 2020s》的参考文献
  6. mysql sail_MySQL使用小记
  7. 为mysql cluster添加sql节点
  8. 20181031-1
  9. laravel 图片
  10. Julia:Datetime的用法
  11. 关于如何用python下载文件
  12. 智能风控建模全流程--看这篇就够了
  13. java文本反垃圾_java毕业设计_springboot框架的反垃圾邮件管理分析系统
  14. 最基本财务基础知识,财务知识基础来源
  15. NDB Cluster基本操作
  16. 输入框添加Emoje表情demo
  17. 200左右哪款蓝牙耳机值得入手?双11小白新手避雷高性能蓝牙耳机
  18. 一个html页面请求多个接口,前端页面,一个页面几个接口请求比较合理?
  19. 范数(norm) 几种范数的简单介绍
  20. 修改ftp服务器地址,ftp服务器的地址修改

热门文章

  1. LeetCode-46. Permutations
  2. Mingw编译DLib
  3. CentOs中iptables配置允许mysql远程访问
  4. No tag datetimepicker defined in tag library imported with prefix s解决
  5. .NEt中的继承、聚合和组合
  6. 解决Windows Server2008 R2中IE开网页时弹出阻止框
  7. Vue项目中遇到了大文件分片上传的问题
  8. Java编写代理服务器(Burp拦截Demo)一
  9. keras实现嘴唇图像autoencoder
  10. Red Hat 8.0中设置光盘为软件源