css权重计算

1,671 阅读2分钟

CSS属性选择器权重

1. 选择器类型

  • Basic Selectors

     element(标签) selector:span、p...
     
     class selector:
             span.classy {
                 background-color: DodgerBlue;
             }
             <span class="classy">Here</span>
     ID selector:
             span#identified {
                 background-color: DodgerBlue;
             }
             <span id="identified">Here</span>
             
     Universal通配选择器:
             *.warning {color:red;}
             <p class="warning">
                 <span lang="en-us">A green span</span> in a red paragraph.
             </p>
             <p id="maincontent" lang="en-gb">
                 <span class="warning">A red span</span> in a green paragraph.
             </p>
             
     Attribute属性选择器:
             // 存在href属性并且属性值以"#"开始的<a> 元素
             a[href^="#"] {
                 background-color: gold;
             }
             // 包含"example"的<a>
             a[href*="example"] {
                 background-color: silver;
             }
             // 包含"insensitive"的<a>, i 表示忽略"insensitive"的大小写
             a[href*="insensitive" i] {
                 color: cyan;
             }
             // 结尾是".org"的<a> 
             a[href$=".org"] {
                 color: red;
             }
             
             <ul>
                   <li><a href="#internal">Internal link</a></li>
                   <li><a href="http://example.com">Example link</a></li>
                   <li><a href="#InSensitive">Insensitive internal link</a></li>
                   <li><a href="http://example.org">Example org link</a></li>
             </ul>
    
  • Combinators 关系选择器

      Adjacent sibling combinator 相邻兄弟选择器 (+):
          两个选择器之间,第二个元素在第一个元素之后,
          两个元素属于同一个父元素的子元素,
          第二个元素将被选中。
          li:first-of-type + li {
              color: red;
          }
          <ul>
              <li>One</li>
              <li>Two!</li>
              <li>Three</li>
          </ul>
      
      General sibling combinator 通用兄弟选择器:
          <div/> 后的所有同级 <span/>
          div ~ span {}
      Child combinator 子选择器:
          直接子元素
          div > span {}
      Descendant combinator 后代选择器:
          所有后代元素 
          div span {}
    
  • Pseudo-classes 伪类选择器

      a:link { } /* 未访问链接 */
      a:visited { } /* 已访问链接 */
      a:hover { } /* 用户鼠标悬停 */
      a:active { } /* 激活链接 */
      
    
  • Pseudo-elements 伪元素选择器

      ::-moz-progress-bar 是<progress> 元素中的关于进度条的Mozilla特性
      
      ::before 创建一个伪元素,它将成为匹配选中的元素的第一个子元素。
               常通过 content 属性来为一个元素添加修饰性的内容。
               属于行内元素。
      ::first-letter::first-line::after::slotted
      
      /* CSS3 语法 */
      element::before { 样式 }  
      
      /* (单冒号)CSS2 过时语法 (仅用来支持 IE8) */
      element:before  { 样式 }  
      
      /* 在每一个p元素前插入内容 */
      p::before { content: "Hello world!"; } 
      
      CSS3 引入 ::before  是为了将伪类和伪元素区别开来。浏览器也接受由 CSS2 引入的 :before 写法。
    

A B C D

A:style属性(内联样式),有一个记为1,依次累加,表示为:1,0,0,0

B:ID 选择器(#header),有一个记为1,依次累加,表示为: 0, 1, 0, 0

C: classatrribute 属性pseudo-classes 伪类选择器、 有一个记为1,依次累加,表示为:0,0,1,0

D: pseudo-element 伪元素element 标签,有一个记为1,依次累加,表示为:0,0,0,1

(universal selector)、+、>、~ 不会增加权重

CSS2规范中规定:!important 用于单独指定某条样式中的单个属性。对于被指定的属性,有 !important 指定的权重值大于所有未用 !important 指定的规则。

Tips1: 如果多条规则中都对同一个属性指定了 !important 呢?这时候 !important 的作用相互抵销,依然按照ABCD四组计算比较。

Tips2: edge 浏览器所有的类名(classes) 可能是8字节字符串存储的。对字节稍稍了解的人都知道,8字节所能hold的最大值就是255. 所以你想啊,当同时出现256个class, 势必会越过其边缘,溢出到id区域, 所以导致class 会覆盖 id

有张图特别好

参考0.0