css权重是什么?

概述

css Specificity中文一般译为css优先级、css权重。相比“权重”,“优先级”更好理解,mozilla官方中文文档就翻译为“优先级”。

Specificity基于设定的匹配规则,浏览器通过设定好的优先级来判断哪些属性值DOM元素最为相关,从而在该DOM上应用这些值。

简单理解就是一个DOM的某个属性值有多个css样式设置,优先级高的那个应用。很多css设置不生效的问题,都是因为在某处定义了一个更高的优先级,从而导致该处样式不生效。

优先级的顺序如下:

important > 内联(style) > ID > 类(class) > 标签(li...) | 伪类(:hover,:focus...) | 属性选择[attr=''] > 伪对象(:before,:after) > 通配符(*) > 继承(inherit)

那么如何确定优先级呢?

Specificity值的计算

先说结论:

  1. 一般采用10进制的简单相加计算方式。从0开始,一个行内样式+1000,一个id+100,一个属性选择器/class或者伪类+10,一个元素名,或者伪元素+1.

具体的css的规则如下:

  • A:如果规则是写在标签的style属性中(内联样式),则A=1,否则,A=0. 对于内联样式,由于没有选择器,所以 B、C、D 的值都为 0,即 A=1, B=0, C=0, D=0(简写为 1,0,0,0,下同)。
  • B:计算该选择器中ID的数量。(例如,#header 这样的选择器,计算为 0, 1, 0, 0)。
  • C:计算该选择器中伪类及其它属性的数量(包括类选择器、属性选择器等,不包括伪元素)。 (例如, .logo[id='site-logo'] 这样的选择器,计算为 0, 0, 2, 0)。
  • D:计算该选择器中伪元素及标签的数量。(例如,p:first-letter 这样的选择器,计算为0, 0, 0, 2)。
  1. /*通配选择符(Universal Selector)*/ * {} /* a=0 b=0 c=0 d=0 -> specificity = 0,0,0,0 */
  2. /*类型选择符(Type Selectors)*/ li {} /* a=0 b=0 c=0 d=1 -> specificity = 0,0,0,1 */
  3. /*类选择符(Class Selectors)*/ .active{color:blue;}/* a=0 b=0 c=1 d=0 -> specificity = 0,0,1,0 */
  4. /*伪类选择符(Pseudo-classes Selectors)*/li:first-line {} /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */
  5. /*属性选择符(Attribute Selectors)*/ h[title] {color:blue;} /* a=0 b=0 c=1 d=0 -> specificity = 0,0,1,0 */
  6. /*ID选择符(ID Selectors)*/ #sj{ font-size:12px;} /* a=0 b=1 c=0 d=0 -> specificity = 0,1,0,0 */
  7. /*内联(style)*/ style="" /* a=1 b=0 c=0 d=0 -> specificity = 1,0,0,0 */
  8. /*包含选择符(Descendant Selectors)*/ ul li {} /* a=0 b=0 c=0 d=1+1 -> specificity = 0,0,0,2 */
  9. /*相邻+属性选择符(Adjacent Sibling Selectors)*/ h1 + *[rel=up]{} /* a=0 b=0 c=1 d=1 -> specificity = 0,0,1,1 */
  10. ul ol li.red {} /* a=0 b=0 c=1 d=3 -> specificity = 0,0,1,3 */
  11. li.red.level {} /* a=0 b=0 c=2 d=1 -> specificity = 0,0,2,1 */

大多数情况下,按照以上的理解得出的结论是没问题的,不过总有例外,如

  1. body header div nav ul li div p a span em {color: red}
  2. .ctn{color:blue}

按照错误的计算方法,样式一的权重值是11,样式二的权重值是10,如果这两条规则用于同一个元素,则该元素应该是红色。实际结果却是蓝色。

因此还有一些基本的规则

优先级的基本规则

1.相同的权重:以后面出现的选择器为最后规则

假如在外部样式表中,同一个CSS规则你写了两次,那么出现在前面的选择器权重低,你的样式会选择后面的样式:

  1. #content h1 {
  2. padding: 5px;
  3. }
  4. #content h1 {
  5. padding: 10px;
  6. }

两个选择器的权重都是0,1,0,1,最后那个规则生效。

2.不同的权重,权重值高则生效

Id选择器的优先级比属性选择器高,比如下面的例子里 样式表中#p123的权重明显比[id=p123]的权重要高。

  1. a#a-02 { background-image : url(n.gif); }
  2. a[id="a-02"] { background-image : url(n.png); }

3.就近原则

如我在样式表中对DOM定义的样式A,然后我又在html也对DOM定义了B,应用B

  1. .A {
  2. padding: 5px;
  3. }
  1. <style type="text/css">
  2. .B {
  3. padding: 10px;
  4. }
  5. </style>

4.无论多少个元素组成的选择器,都没有一个class选择器优先级高。

就是上面的那个例外。

5.无视DOM树的距离

如下样式:

  1. body h1 {
  2. color: green;
  3. }
  4. html h1 {
  5. color: purple;
  6. }

当它应用在下面的HTML时:

  1. <html>
  2. <body>
  3. <h1>Here is a title!</h1>
  4. </body>
  5. </html>

浏览器会将它渲染成purple;

实际上规则1也适用于此,不过由于其DOM负极标签的不同,故单拎出来特殊化。

6.:not 伪类例外

:not 否定伪类在优先级计算中不会被看作是伪类. 事实上, 在计算选择器数量时还是会把其中的选择器当做普通选择器进行计数.

  1. div.outer p {
  2. color:orange;
  3. }
  4. div:not(.outer) p {
  5. color: lime;
  6. }

当它被应用在下面的HTML时,就是文字描述效果

  1. <div class="outer">
  2. <p>orange</p>
  3. <div class="inner">
  4. <p>lime</p>
  5. </div>
  6. </div>

7.!important 规则例外

当在一个样式声明上使用 !important 规则时,该样式声明会覆盖CSS中任何其他的声明。

尽管技术上 !important 与优先级毫无关系,但是它们之间直接相互影响。

使用 !important 是一个坏习惯,应该尽量避免,因为这打断了样式表中的固有的级联规则 使得调试找bug变得更加困难了。

当两条相互冲突的带有!important 规则的声明被应用到相同的元素上时,拥有更大优先级的声明将会被采用。

具体的参考!important_规则例外,就不一一粘贴过来了。

css权重是什么的更多相关文章

  1. css权重计算方法浅谈

    在这之前只知道css权重的皮毛,比如说:行内权重比头部权重高,头部比外部样式权重高----工作中才知道真正理解css权重重要性.理解权重了才能写出来最优css选择器来.对后面学习less,scss有很 ...

  2. CSS:权重和层叠规则决定了其优先级

    首先,给大家看一篇关于CSS优先级的示例:http://www.ido321.com/76.html 一.基本的优先级规则 比较同一级别的个数,数量多的优先级高,如果相同即比较下一级别的个数,至于各级 ...

  3. css权重及优先级问题

    css权重及优先级问题 几个值的对比 初始值 指定值 计算值 应用值 CSS属性的 指定值 (specified value)会通过下面3种途径取得: 在当前文档的样式表中给这个属性赋的值,会被优先使 ...

  4. CSS优先级的及其衡量标准CSS权重

    一.背景 CSS有三大特性:层叠性.继承性.优先级. 而我们在给CSS定义样式的时候,经常出现两个及以上的规则应用在同一元素上,单该元素最终在浏览器呈现的效果是应用的哪个规则呢?这就要考虑优先级的问题 ...

  5. vue mand-mobile ui加class不起作用的问题 css权重问题

    vue mand-mobile ui加class不起作用的问题 css权重问题组件的样式优先权比自己定的class高多加几层权重才行,要直接用样式覆盖也可以在前面多加几层class,定位更精确了才会覆 ...

  6. css权重 vs 浏览器渲染 -- css之弊病

    昨日,突现一个bug,令人十分恼火. 基本场景 自己实现一多选日历,可多选多天(相连或不相连均可)."贵司"的需求真心有些小复杂了,"市面"上没有这样的相似的东 ...

  7. Css权重解析

    Css权重解析 关于CSS权重,我们需要一套计算公式来去计算,这个就是 CSS Specificity,我们称为CSS 特性或称非凡性,它是一个衡量CSS值优先级的一个标准 具体规范入如下: spec ...

  8. CSS权重的等级划分

    CSS权重 CSS权重指的是样式的优先级,有两条或多条样式作用于一个元素,权重高的那条样式对元素起作用,权重相同的,后写的样式会覆盖前面写的样式. 权重的等级 可以把样式的应用方式分为几个等级,按照等 ...

  9. 盒模型 | CSS权重 | CSS层叠

    span{ color:red;} *{ font-family:"楷体";line-height:2em; font-size:18px;} 盒模型 CSS定义所有的元素都可能拥 ...

随机推荐

  1. ext 3.x 让uploadPanel支持swfupload

    经常做系统的时候会遇到上传组件,特别是大文件的时候总是很郁闷,长时间无响应导致糟糕的用户体验,所以决定采用swfupload来支持文件上传. 大体代码如下. var upload = {}; uplo ...

  2. oracle监听程序无法启动(TNS-12560: TNS: 协议适配器错误,TNS-00530: 协议适配器错误)

    问题描述1:   C:\Users\Administrator>lsnrctl start LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Pr ...

  3. DataTables 入门使用

    前言简述 DataTables是一个JavaScript类库,它操作HTML表格,改变表格CSS样式,增强表格功能使其更具有交互性. DataTables依赖于JQuery类库. 入门示例 环境:Da ...

  4. 清除WebLogic8.1缓存

    在Domain目录下面有一个以server命名的文件夹,删除整个文件夹就可以了.

  5. html5 audio/video 的那些坑

    当我最近项目用到audio的时候,我们用到了jPlayer作为三方库. 功能实现了,暂停播放,进度条什么的,都很顺利的搞定了.后来考虑到当网速过慢时需要给播放按钮一个载入动画,然后就一发不可收拾了. ...

  6. 受限玻尔兹曼机(RBM)学习笔记(三)能量函数和概率分布

      去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算 ...

  7. 任督二脉之Shell中的正则表达式

    VBird说学习Linux,掌握了Shell和正则就相当于打通了任督二脉,此后能力的成长才会突飞猛进. Shell的基础学习之前已经总结了一篇博客:http://www.cnblogs.com/jyz ...

  8. 设计师必备!免费下载 PSD 素材的32个网站

    今天我想和大家分享一组可以免费下载 PSD 图形素材的最好的网站. PSD 文件是非常有用的资源,因为你可以看到所有的层,使用了什么技术来创建出这些作品和效果. 某些列出的网站可能已是众所周知的,但你 ...

  9. LeetCode——Jump Game

    Description: Given an array of non-negative integers, you are initially positioned at the first inde ...

  10. [python]非常小的下载图片脚本(非通用)

    说在最前面:这不是一个十分通用的下载图片脚本,只是根据我的一个小问题,为了减少我的重复性工作写的脚本. 问题 起因:我的这篇博文什么是真正的程序员浏览量超过了4000+. 问题来了:里面的图片我都是用 ...