2019独角兽企业重金招聘Python工程师标准>>>

最近面试了一些求职者,我问css优先级计算规则是怎样的?答曰ID优先级>class>元素选择器,外联样式优先级低于内联样式,内 联样式优先级低于行间样式,然后就没有然后了……,ID选择器的优先级确实>class选择器的优先级>元素选择器的优先级,但是外联样式优 先级并不一定低于内联样式优先级。做为一个合格的前端工程师,让我们彻底搞清楚css优先级计算规则吧!

特殊性

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

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

实际上,同一个元素可以使用多个规则来指定它的字体颜色,每个规则都有自己的选择器。显然最终只有一个规则起作用(不可能一个字既是红色又是绿色),那么 该规则的特殊性最高,特殊性即css优先级。很多同学仅仅知道选择器优先级ID>class>元素选择器,而不知道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

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

 a{color: yellow;} /*特殊性值:0,0,0,1*/div a{color: green;} /*特殊性值:0,0,0,2*/.demo a{color: black;} /*特殊性值:0,0,1,1*/.demo input[type="text"]{color: blue;} /*特殊性值:0,0,2,1*/.demo *[type="text"]{color: grey;} /*特殊性值:0,0,2,0*/#demo a{color: orange;} /*特殊性值:0,1,0,1*/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><!--适用第5、6行规则,第6行优先级高-->
</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选择器优先级高。

层叠

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

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

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

本文地址:http://www.cnblogs.com/wangmeijian/p/4207433.html

转载于:https://my.oschina.net/mayflygeekCarry/blog/365477

css优先级计算规则相关推荐

  1. CSS优先级算法浅谈

    转自:微点阅读  https://www.weidianyuedu.com 在面试之前对css优先级的理解是 :ID优先级>class>元素选择器,外联样式优先级低于内联样式,内联样式优先 ...

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

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

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

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

  4. 深入浅出解析CSS优先级规则

    最近,小莫公司的java同事老是过来问他们写了的样式为什么不生效,秉承着同事之间互相帮助的原则不厌其烦地一遍一遍的解释.最后还是觉得还是应该把自己对于css优先级的经验整理出来,供大家学习交流. 概念 ...

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

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

  6. CSS选择器的优先级计算

    一.引言: 这个问题,实际开发我们肯定遵循以"越具体 权重越高"为原则,所以一般不会出现这样的问题,即便出现了问题也知道该怎么解决,但是笔试,或者面试这种题很容易出现这种题,对于我 ...

  7. CSS三大特性(CSS层叠性、CSS继承性、CSS优先级)

    1. CSS层叠性 层叠性是指多种CSS样式的叠加. 原则: 样式冲突,遵循的原则是就近原则. 那个样式离着结构近,就执行那个样式. 样式不冲突,不会层叠 示例代码: <!DOCTYPE htm ...

  8. css就近原则_「Web前端开发进阶篇」CSS优先级

    所谓CSS优先级,即是指CSS样式在浏览器中被解析的先后顺序.既然样式有优先级,那么就会有一个规则来约定这个优先级,而这个"规则"就是重点. [引言] 讲解完这篇CSS优先级的文章 ...

  9. CSS优先级算法是如何计算?

    CSS的specificity特性或非凡性,它是一个衡量css优先级的一个标准, 既然的标准就有判定规定和计算方式,specificity用一个四位数来表示, 更像四级从左到右,左的最大级,一级大于一 ...

最新文章

  1. docker 启动sqlserver_在Docker上安装MSSQL(SQL Server)
  2. html canvas text 居中,HTML5 Canvas Text文本居中实例
  3. python网课什么平台好-python网课什么平台好
  4. 如何运行一段python代码_Python退出时强制运行一段代码如何实现 Python退出时强制运行一段代码实现方法...
  5. 黑苹果hp有声音hdmi无声音_黑科技!不戴耳机也能独享声音!以色列公司推出无耳机传输音乐...
  6. 如何把VS Code打造成Java开发IDE?
  7. python集合可以修改吗_修改包含Python3中的集合的集合列表-问答-阿里云开发者社区-阿里云...
  8. AE脚本Swiss Knife Mac 瑞士军刀MG动画制作插件
  9. 技术讲坛新模式,积分制
  10. 第四届HTML5峰会 - 上海站
  11. 用户体验的13条金科玉律
  12. html静态页面留言板,html静态留言板
  13. USB蓝牙适配器修改软件升级 玩转蓝牙配置虚拟BLE基站 修改MAC 和 RAWDATA数据
  14. 中文圣经 for Android
  15. win10下微软office2010卸载
  16. 利用JS模拟排队系统
  17. 2021-08-11BUU-CTF:[WUSTCTF2020]alison_likes_jojo
  18. 使用VProtect给自己开发的软件加密
  19. 解决Windows10/11系统桌面背景或者IDE背景出现的莫名其妙的方框/格子
  20. JAVA自定义监听器(通过新线程+while+violate)

热门文章

  1. OpenCV isContinuous()连续存储的问题
  2. 结构型模式—享元模式
  3. 大型分布式系统需要考虑的问题
  4. appium---【Mac】Appium-Doctor提示WARN:“ opencv4nodejs cannot be found”解决方案
  5. 以太坊源码分析——BlockChain
  6. 6.2 二叉树的定义、性质与存储结构
  7. React.js 小书 Lesson15 - 实战分析:评论功能(二)
  8. ASP.NET Core - Razor页面之Handlers处理方法
  9. Unity中使用Attribute
  10. robot framework数据库操作