CSS样式选择器优先级

原文:CSS样式选择器优先级

CSS样式选择器分为4个等级,a、b、c、d,可以以这四种等级为依据确定CSS选择器的优先级。

1.如果样式是行内样式(通过Style=””定义),那么a=1
2.b为ID选择器的总数
3.c为Class类选择器的数量。
4.d为类型选择器的数量
5.属性选择器,伪类选择器和class类选择器优先级一样,伪元素选择器和类型选择器一样
6.!important 权重最高,比 inline style 还要高。

例如:

 

 


选择器


特殊性 (a,b,c,d)


Style= ””


1,0,0,0


#wrapper #content {}


0,2,0,0


#content .datePosted {}


0,1,1,0


div#content {}


0,1,0,1


#content p {}


0,1,0,1


#content {}


0,1,0,0


p.comment .dateposted {}


0,0,2,1


div.comment p {}


0,0,1,2


.comment p {}


0,0,1,1


p.comment {}


0,0,1,1


.comment {}


0,0,1,0


div p {}


0,0,0,2


p {}


0,0,0,1

 

CSS优先级的读法 

这里先更正一些错误的读法。通过百度搜索到的内容中,通常出现这样的写法:(1,0,0,0),但有部分文章对它的解释不全面,有的甚至有误。

其中最大的一个错误就是把结果加:(1,0,0,0)=1000,(0,0,2,2)=22,更有甚者:(0,1,0,1)=0+1+0+1=2!虽然这些理解在很简单的情况下看上去是正确的,但本质上却是个重大的错误。

另外有部分文章把它理解为4个级别,也相近,但不能把条理分清楚,理解起来也难。

    “CSS优先级包含四个级别(文内选择符,ID选择符,Class选择符,元素选择符)以及各级别出现的次数。根据这四个级别出现的次数计算得到CSS的优先”级。

这句话总结得很好,但对初学者来说,在理解方面就有点难度了,“四个级别”,太容易混淆,其实应该是“四组级别”。

我认为,对优先级的读法,应该是以“组”来分,这个组之间相互独立,从左到右进行对比。它们成组出现,以逗号分隔。

  selector( a , b , c , d )
   compare: ↑ , ↑ , ↑ , ↑
  selector( a , b , c , d ) 

正如w3c.org中原文所示,分为a,b,c,d四组,全为正整娄,默认为0,对应于不同的选择器结构和组成形式。在选择器之间的优先级进行对比时,从左到右1对1对比,当比出有大者时即可停止比较。

li.red.level  {} 
                      
 h1 + *[rel=up]{} 
                            
 ul ol li.red  {} 
                      
 #x34y         {} 

(上表中,↑表示还要进行比较,√表示从此处已得到了结果)

再有,只要正确书写,仅从优先级中大概知道选择器结构形式了,如:

1,0,0,0表示是元素内的style;

0,2,1,1表示是一个由两个ID选择器,1个类或伪类或属性选择器,以及一个元素选择器组成的选择器。

CSS优先级规则的细节: 

在纠正读法后,才能开始讲详细的规则:

    * a组数值只有把CSS写进style属性时才会为1,否则为0.写进style的样式声明其实不算是个选择器,所以这里面的b,c,d组值均为0,只有真正的选择器才会有b,c,d组值。
    * b组数值决定于ID选择器#ID,有多少个ID选择器,并会进行此组数值累加;
    * c组数值决定于类、伪类和属性选择符,并会进行该组数值累加;
    * d组数值决定于元素名,即元素选择器,并会进行该组数值累加;

注意,这四组数值分别对应于不同类型的选择器,互不影响,根据读法法则进行比较。

最近在写css的时候,由于经常使用到很长的多级选择器,而碰到一些样式被覆盖或者覆盖不了的情况是相当的郁闷,所以专门花了一些时间对一些选择器做了对比测试。这里先说明一下,由于ie6不支持css2.0选择器,所以这些测试忽略了一些2.0的选择器和连接符,如伪类(:hover),属性 ([type=”text”]),子选择符(>)等,仅对#id,.class,tag和空格连接符测试。

  定义:

   1. CSS句子:一个完整的选择器构成一个CSS句子,如.abb #cd div.class。而用逗号连接的算作多个句子的省略定义方法。
   2. CSS单词:CSS句子中任何一个#id或.class或tag都算作一个CSS单词,虽然照以前的理解一般把tag#id.class1.class2整个看作一个单词,但是在本文讨论范围内,这个只能算作一个由4个单词组成的词组。
   3. 优先级:对于选择到同一个元素的两个CSS句子,当他们定义该元素的同一个属性时,如果其中一个写在前而不会被写在后面的覆盖这个属性,那么就称这个CSS句子的优先级高于另一个。而当2个CSS句子互相调换在代码中的位置都是后面的覆盖前面的属性时,称这两个CSS句子有相同的优先级。

测试用dom:

  1.  

    <html id="html" class="html">  
    <body id="body" class="body">  
    <div id="div">  
        <div id="test1" class="test test1">1第一行<br>第二行<br>自身</div>  
        <div id="test2" class="test test2">2第一行<br>第二行<br>自身</div>  
        <div id="test3" class="test test3">3第一行<br>第二行<br>自身</div>  
        <div id="test4" class="test test4">4第一行<br>第二行<br>自身</div>  
        <div id="test5" class="test test5">5第一行<br>第二行<br>自身</div>  
        <div id="test6" class="test test6">6第一行<br>第二行<br>自身</div>  
        <div id="test7" class="test test7">7第一行<br>第二行<br>自身</div>  
        <div id="test8" class="test test8">8第一行<br>第二行<br>自身</div>  
    </div>  
    </body>  
    </html>  
    

    这里先给出8组选择器,每组两个,各位同学可以先想一想每组里面哪个选择器的优先级高:

    1. <style>  
      
      #test1{height:2em;}  
      .test1{height:1em;}  
      
      .body #test2{height:1em;}  
      #test2{height:2em;}  
      
      div .test3{height:2em;}  
      #test3{height:1em;}  
      
      .body #test4{height:2em;}  
      body #test4{height:1em;}  
      
      html #test5{height:2em;}  
      body #test5{height:1em;}  
      
      #body #test6{height:1em;}  
      .html #test6{height:2em;}  
      
      html #body #test7{height:1em;}  
      .html .body #test7{height:2em;}  
      
      #html.html .body #test8{height:1em;}  
      .html #body.body #test8{height:2em;}  </style>  
      
      现在公布答案:
      
         1. 仅一个选择器单词的时候#id高于.class应该不用说了;   2. div#test2比#test2多了一个单词,那么多一个单词的优先级高,这里可以暂时理解成多一个单词就选择的更精确;   3. 同样多一个单词,但其中一个有#id选择,则#test3要高于div .test3;   4. .body #test4高于body #test4,暂时可理解为同样多层级时,.class高于tag;   5. html #test5与body #test5有同样的优先级,先写的会被覆盖,这里猜测同样的层级数,优先级与层级跨越的深度无关;   6. #body #test6高于.html #test6,理解为#id优于.class也与层级深度无关;   7. 最后两个比较有难度了,但浏览器下的结果是html #body #test7高于.html .body #test7,怎样理解我先不说;   8. #html.html .body #test8与.html #body.body #test8同级。
      
        其实越到后面,应该越是能看出一种模糊的规则来。经过我反复的分析,最终从模糊的感觉中发现了其中的奥秘,或者说是一种说得通的解释:
      
        把css句子的单词组成定义为“数位”,像个十百位的数字一样,css中不同的单词代表不同的权重数位,分别是#id,.class,tag三个数位依次从高到低排列,组成了相当于十进制数字的百位,十位,个位。再把每个css句子中个各种单词的个数代入到刚刚划分的数位里,就可以得到一个类似于十进制数字的三位数,只是在css的优先级数位里,没有进位的概念,无数个低位单词也还是低于一个高位的单词。从而结论就是,按#id,.class,tag的数位统计了css的单词个数并代入各个数位后,只要比较两个css数字的大小(从高位到低位依次比较),就能得出两个css的优先级。
      
        用这个规则重新比较一遍前面的例子:
      
         1. 1,0,0>0,1,0   2. 1,1,0>1,0,0   3. 0,1,1<1,0,0   4. 1,1,0>1,0,1   5. 1,0,1=1,0,1   6. 2,0,0>1,1,0   7. 2,0,1>1,2,0   8. 2,2,0=2,2,0
      
      用这个方法很容易就能比较出最后两组例子的优先级,对于前述的一些情况也可以做出合理的解释,所以在没有更好的css选择器解释方法之前,这个数位计算法是非常方便且容易理解的。
      
    
    
时间: 2025-01-21 00:12:06

CSS样式选择器优先级的相关文章

CSS中选择器优先级顺序实战讲解

原文:CSS中选择器优先级顺序实战讲解 我们有些程序猿在给一个元素(比如div)应用样式的时候,会有一些疑问,为什么我写在后面的样式不能覆盖前面的样式呢,不是说CSS是层叠样式表吗? 如果你在开发中也遇到同样的问题,即在给某一元素应用样式的时候(比如写在外部样式表中),写在后面的样式不能覆盖前面定义的样式.这个时候,你可能就得考虑是不是没考虑优先级问题了.   当我们在给一个标签,比如div应用样式的时候,我们得考虑优先级问题. 下面列出的就是是选择器的优先级:     行内样式 > ID选择器

CSS样式的优先级

css ---------------------------引用文字--------------------------------------样式表中的特殊性描述了不同规则的相对权重,它的基本规则是: 统计选择符中的ID属性个数. 统计选择符中的CLASS属性个数. 中国教程网--个人空间;统计选择符中的HTML标记名格式. 最后,按正确的顺序写出三个数字,不要加空格或逗号,得到一个三位数.( 注意,你需要将数字转换成一个以三个数字结尾的更大的数).相应于选择符的最终数字列表可以很容易确定较

CSS样式选择器

1.css选择器   (1)标记选择器: 选择器 { 属性1:值:属性2:值 }        用来指定确定标记的样式      如:<style>           h1 { color:red:font-size:25px:}          </style>       (2)类别选择器: .class(类别名称){ 属性1:值:属性2:值:}      如:<style type="text/css">          .one{col

asp.net导入CSS样式,用不起

问题描述 asp.net导入CSS样式,用不起 asp.net我导入了CSS样式表,路径也是对的,但是样子一点也没用起 解决方案 使用ASP.NET直接控制CSS样式asp.net css 样式选择器,优先级在Asp.net中过滤html,javascript,css样式代码 解决方案二: 浏览器开发工具看你css文件路径是否正确,不是你说对就是对,要浏览器能正常加载才行

Dreamweaver8.0使用CSS样式美化页面

查看全套"dreamweaver8.0教程" 在"CSS规则对话框"中,我们可以通过类型.背景.区块.方框.边框.列表.定位和扩展项的设置,来美化我们的页面,当然啦,我们在定义某个CSS样式的时候,不需要对每一个项都进行设置,需要什么效果,选择相应的项进行设置就可以了. 1.文本样式的设置 新建CSS样式, "选择器类型"为类,名称为 "style1"定义在"仅对该文档".保存至站点根目录下的CSS文件夹内

CSS样式----图文详解:css样式表和选择器

主要内容 CSS概述 CSS和HTML结合的三种方式:行内样式表.内嵌样式表.外部样式表 CSS四种基本选择器:标签选择器.类选择器.ID选择器.通用选择器 CSS三种扩展选择器:组合选择器.后代选择器.伪类选择器 CSS样式优先级 CSS 概述 CSS:Cascading Style Sheet,层叠样式表.CSS的作用就是给HTML页面标签添加各种样式,定义网页的显示效果.简单一句话:CSS将网页内容和显示样式进行分离,提高了显示功能. 接下来我们要讲一下为什么要使用CSS. HTML的缺陷

CSS样式表:详细介绍IE7新支持的选择器

css|样式表 现在IE7已经推出一段时间并且渗透到用户当中,不用等太久我们就可以在页面上使用更高级的CSS.两个最有用的项目将是 Child子和Adjacent Sibling相邻兄弟选择符.现在已是时候使用它们制作网页,并且更深入研究它们. 注意,选择器包括现行的符号,">","+"和空格(后代选择符),涉及到子选择器,相邻兄弟选择器,后代选择器,统称为选择符. 一个较好的方法 在我们研究选择符之前,弄清楚他们的不同和为什么它们是好东西的原因是个不错的主意

CSS样式优先级计算方法

  一.什么是CSS优先级? 所谓CSS优先级,即是指CSS样式在浏览器中被解析的先后顺序.当同一个元素(或内容)被多个CSS选择符选中时,就要按照优先权取舍不同的CSS规则. 二.为什么要研究CSS优先级?CSS优先级与门户系统有什么关系? 研究CSS优先级的主要目的就是解决多个CSS选择符选中同一个元素时的冲突问题.在门户系统中,为了保证所有的页面能正常展示,几乎所有的微件及页面都有基础CSS样式,但是门户系统是开放的.个性化的平台,大部分样式都给予了用户修改权,这时自定义样式和门户基本样式

入门:在网页中使用CSS样式表的四种方法

css|网页|样式表 如何在网页中插入CSS 前面我们了解了CSS的语法,但要想在浏览器中显示出效果,就要让浏览器识别并调用.当浏览器读取样式表时,要依照文本格式来读,这里介绍四种在页面中插入样式表的方法:链入外部样式表.内部样式表.导入外表样式表和内嵌样式. 1. 链入外部样式表 链入外部样式表是把样式表保存为一个样式表文件,然后在页面中用< link >标记链接到这个样式表文件,这个标记必须放到页面的< head >区内,如下: <head> -- <link