css 权重想必大家都听说过, 一些简单的规则大部分人也都知道:

  • 较长的 css selector 权重会大于较短的 css selector
  • id selector 权重高于 class selector.

但是具体规范是什么? 浏览器是按照什么标准来判定不同选择器的权重的呢?

让我们来看一下官方文档是怎么说的~

第一个关键词: Specificity

Specificity is the means by which browsers decide which CSS property values are the most relevant to an element and, therefore, will be applied. Specificity is based on the matching rules which are composed of different sorts of CSS selectors

官方文档中用 Specificity: 特异性 来表示一个 css selector 和其元素的相关性. 相关性越强, 即表示表示其权重最高.

那么问题来了, Specificity 是如何被比较的呢?

Specificity is a weight that is applied to a given CSS declaration, determined by the number of each selector type in the matching selector.

Specificity 是由 selector 中 不同 selector type 的数目决定的.

第二个关键词: Selector Type

根据 W3 标准中的规定, css selector 分为 4 种 type: a, b, c, d. 他们的数目计算规则为:

  • a: 如果 css 属性声明是写在 style=“” 中的, 则数目为 1, 否则为 0
  • b: id 选择器的数目
  • c: class 选择器, 属性选择器(如 type=“text”), 伪类选择器(如: ::hover) 的数目
  • d: 标签名(如: p, div), 伪类 (如: :before)的数目

在比较不同 css selector 的权重时, 按照 a => b => c => d 的顺序进行比较.

由第一个 selector type a 的计算规则可知: 写在 html 代码 style 属性中的 css 相较写在 css 选择器中的 css 属性具有最高的优先级.

而 id selector (b) 相较 class selector (c) 有更高的优先级. 这也和我们平时的经验相吻合.

还有一些 css 选择器你没提, 它们该怎么计算权重?

除了上面 Specificity 计算规则中的 css 选择器类型, 还有一些选择器如: *, +, >,:not() 等. 这些选择器该如何计算其权重呢?

答案是这些选择器并不会被计算到 css 的权重当中 :)

有一个需要特别注意一下的选择器: :not(), 虽然它本身是不计权重的, 但是写在它里面的 css selector 是需要计算权重的.

如果 a,b,c,d 算完都一样, 怎么办?

默认行为是: 当 specificity 一样时, 最后声明的 css selector 会生效.

如果我重复同样的 css selectory type, 权重会增加吗?

让我们来做个实验, 我们声明一个 html 节点:

<div><div id="testId" class="testClass"><span>test div</span></div>
</div>

在 css 中我们添加两个选择器:

.testClass.testClass {background-color: red;
}
.testClass {background-color: black;
}

如果重复的 css selector 会被忽略的话, 按照前面的规则, 最后声明的 css selector 会生效, 所以 这个 div 节点背景色应该是黑色. 让我们看看结果:

结果我们得到的是一个红色的 div, 也就是说 .testClass.testClass 高于 .testClass. 所以结论是: 重复的 css selector, 其权重会被重复计算.

关于 !important:

按照 MDN的说法, !important 是不在 css 选择器的权重计算范围内的, 而它之所以能让 css 选择器生效是因为浏览器在遇见 !important 时会进行特殊的判断. 当多个 !important 需要进行比较时, 才会计算其权重再进行比较.

通常来说, 不提倡使用 !important. 如果你认为一定要使用, 不妨先自检一下:

  • 总是先考虑使用权重更高的 css 选择器, 而不是使用 !important
  • 只有当你的目的是覆盖来自第三方的 css(如: Bootstrap, normalize.css)时, 才在页面范围使用 !important
  • 永远不要 在你写一个第三方插件时使用 !important
  • 永远不要在全站范围使用 !important

一些误导的信息

我在搜索关于 css 权重的资料时, 看到了下面这张图, 看似十分有道理, 但其实是错误的!

让我们来做一个简单的测试:

按照图片中的计算公式: 如果一个 css 选择器包含11 个 class selector type, 另一个选择器是1 个 id selector type. 那么 class 选择器的权重会高于 id 选择器的权重. 让我们来试一试:

.testClass.testClass.testClass.testClass.testClass.testClass.testClass.testClass.testClass.testClass.testClass {background-color: red;
}
#testId {background-color: black;
}

让我们看看结果:

结果显示还是 id 选择器权重更高.

虽然我们在实际编码过程中很少会出现 10 多个 class 的情况, 但万一出现了, 知道权重真正的计算比较规则, 我们才能正确的处理~

想了解更多 前端 和 数据可视化 ?

这里是我的 D3.js数据可视化 的 github 地址, 欢迎 star & fork :tada:

D3-blog

如果觉得本文不错的话, 不妨点击下面的链接关注一下 : )

github 主页

知乎专栏

掘金

想直接联系我 ?

邮箱: ssthouse@163.com

前端杂谈: CSS 权重 (Specificity)相关推荐

  1. 【前端帮帮忙】第5期 关于CSS权重,你了解多少?

    前言 配图是小孩叠的积木,觉得刚好符合这个主题,所以就拿来做封面了哈. 什么是CSS权重? CSS权重,我们可以简单理解为CSS优先级.来看下MDN官网对优先级的描述: 浏览器通过优先级来判断哪一些属 ...

  2. 你应该知道的一些事情——CSS权重

    本文由99根据Vitaly Friedman的<CSS Specificity: Things You Should Know >所译,整个译文带有我们自己的理解与思想,如果译得不好或不对 ...

  3. [前端笔记——CSS] 10.层叠与继承+选择器

    [前端笔记--CSS] 10.层叠与继承+选择器 1.层叠与继承 1.1 冲突规则 1.2 继承 1.3 层叠 1.4 CSS位置的影响 2.选择器 2.1 选择器是什么? 2.2 选择器列表 2.3 ...

  4. 前端基础-CSS的各种选择器的特点以及CSS的三大特性

    一. 基本选择器 二. 后代选择器.子元素选择器 三. 兄弟选择器 四. 交集选择器与并集选择器 五. 序列选择器 六. 属性选择器 七. 伪类选择器 八. 伪元素选择器 九. CSS三大特性 一. ...

  5. 前端html,css基础总结

    0.1.css引入界面的方式: 内联式:通过标签的style属性,在标签上直接写样式. <div style="width:100px; height:100px; backgroun ...

  6. 深入理解CSS权重(优先级)

    对于上一篇:你应该知道的一些事情--CSS权重 ,实战时会遇到一些实际的问题,本篇继续加重对css优先级的理解.最近跟公司同事分享session时在谈到CSS优先级权重问题,引入了之前一直在网上公认的 ...

  7. Web前端HTML+CSS全套(1~20)

    Web前端HTML+CSS全套(1~20) 拨云见日 CSS基础 切图流程 PC企业站布局 PC游戏站布局 溯本求源 HTML扩展 CSS扩展 HTMLS新语法 CSS3新语法 兼容与hack 风生水 ...

  8. css权重是什么?css权重的介绍

    本篇文章给大家带来的内容是关于css权重是什么?css权重的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. --各位小伙伴在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方 ...

  9. 前端04 /css样式

    目录 前端04 /css样式 昨日内容回顾 css样式 1高度宽度 2字体属性 3文本属性 4背景属性 5边框属性 6display属性 7.盒子模型 8.float浮动 9.定位 10.z-inde ...

  10. CSS权重,属性书写顺序,布局技巧和网页布局总结,盒子模型排列位置---CSS

    文章目录 一.CSS权重 二.CSS属性书写顺序 一.布局总结 二.常见布局技巧 一.CSS权重 注意:类选择器.属性选择器.伪类选择器,权重为 10. 参考看 CSS三大特性,在CSS的特性优先级中 ...

最新文章

  1. VS2010 win32项目windows窗体程序 向导生成代码解析
  2. zbb20170613 linux 安装 mysql
  3. 判断浮点数溢出的方法
  4. 安卓后端mysql_后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)
  5. c语言扫描图片的坐标,tc 如何在指定坐标处 输出bmp图片??
  6. js 根据条件禁止复选框_element-ui多选框根据不同条件禁用?
  7. android 自定义wifi设置在哪里,Android Wifi的设置、连接操作
  8. 大前端快闪二:react开发模式 一键启动多个服务
  9. Windows进程系列(2) -- Svchost进程
  10. 为什么人会摆高姿态_Yo , 你为什么喜欢冲浪?
  11. java8 按条件过滤集合
  12. eval() python_python基础-input函数和eval函数
  13. 举例 微积分 拉格朗日方程_《微积分教程》数学笔记目录
  14. debian9 设置
  15. flash与javacript:图片交互
  16. 重提URL Rewrite(4):不同级别URL Rewrite的一些细节与特点
  17. 初中计算机教学进度表,初中学校教学活动安排表.doc
  18. Windows11安装安卓子系统WSA及安卓应用
  19. QProcess实现进程通信
  20. 171-路飞12-课程页面和课程数据表构建

热门文章

  1. 蜗牛星际b款装服务器系统,蜗牛星际B款单网口折腾
  2. 基于JAVA校园快递代领系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  3. 小数转化为百分数(保留小数点后一位有效数字)
  4. Python 将tif文件分割成多个小tif
  5. OSChina 端午节乱弹 ——用魔兽世界来祭奠青春
  6. 出租车收费管理系统(MyEclipse+Java)
  7. plot画图 matlab,Matlab Plot 画图中图
  8. 物联网技术应用在智慧医疗的应用案例
  9. c语言转义字符 pdf,C语言教程讲义 pdf版
  10. android模拟奥克斯空调红外,奥克斯空调手机遥控器