CSS执行顺序与优先权的问题


  CSS执行顺序与优先权的问题其实便是一个 摩擦解决的问题,当同一个元素(或内容)被CSS 取舍符选中时,就要依照优先权取舍不同的CSS 规定,这其中 波及到的问题其实众多 。


  首先便是CSS 规定的specificity(特别性),CSS2.1有一套对于specificity的计算 模式,用一个四位的数字串(CSS2是三位)来 示意,最后specificity越高的 规定越特别,在优先级 断定时也就越有优势 。对于specificity的具体计算在各种状况下的数字加成有如下一般 规定:


  每个ID 取舍符(#someid),加 0,1,0,0 。


  每个class 取舍符(.someclass)、每个属性 取舍符(形如[attr=”"]等)、每个伪类(形如:hover等)加0,0,1,0


  每个元素或伪元素(:firstchild)等,加0,0,0,1


   其余 取舍符包含全局 取舍符*,加0,0,0,0 。相当于没加,不过这也是一种specificity,后面会解释 。
  按这些 规定将数字串逐位相加,就得到最后计算得的specificity, 而后在 比较取舍时依照从左到右的顺序逐位 比较 。

  举一些例子吧:

 

h1 {color: red;} 
/* 惟独一个一般元素加成, 后果是 0,0,0,1 */
body h1 {color: green;} 
/* 两个一般元素加成, 后果是 0,0,0,2 */ ——后者胜出       
h2.grape {color: purple;}
/* 一个一般元素、一个class 取舍符加成, 后果是 0,0,1,1*/
h2 {color: silver;} 
/*一个一般元素, 后果是 0,0,0,1 */ ——前者胜出       
html > body table tr[id=”totals”] td ul > li {color: maroon;} 
/* 7个一般元素、一个属性 取舍符、两个 其余 取舍符, 后果是0,0,1,7 */
li#answer {color: navy;} 


/* 一个ID 取舍符,一个一般 取舍符, 后果是0,1,0,1 */ ——后者胜出 
除了specificity还有一些 其余 规定

 

  文内的 款式优先级为1,0,0,0,所以始终高于外部定义 。这里文内 款式指形如<div style=”color: red”>blah</div>的 款式,而外部定义指经由<link>或<style>标签定义的 规定 。


  有!important申明的 规定高于 所有 。
  假如!important申明 摩擦,则 比较优先权 。


  假如优先权一样,则依照在源码中浮现的顺序决定,后来者居上 。


  由继承而得到的 款式没有specificity的计算,它低于 所有 其余 规定( 比方全局 取舍符*定义的 规定) 。


对于经由@import载入的外部 款式,因为@import必须浮现在全部 其余 规定定义之前(如不是,则阅读器应该 忽略之),所以依照 后来居上 准则,一般优先权 摩擦时是占下风的 。


  这里需求提一下IE,IE是 可以 鉴别位置 舛误的@import的,但无论@import在什么地方,它都认为是位于全部 其余 规定定义之前的,这可能会激发一些误会 。
  所以优先权问题 固然看起来 方便,但其背后还是有蛮复杂的机制的,需求多多 留神 。