詳解CSS選取器、優先順序與匹配原理

來源:互聯網
上載者:User

給一個p標籤增加一個類(class),可是執行後該class中的有些屬性並沒有起作用。通過Firebug查看,發現沒有起作用的屬性被覆蓋了。這個時候突然意識到了CSS選取器的優先順序問題,這裡就CSS選取器的優先順序問題做了一些總結。

51CTO推薦閱讀:巧妙地使用CSS選取器

選取器種類

嚴格來講,選取器的種類可以分為三種:標籤名選取器、類別選取器和ID選取器。而所謂的後代選取器和群組選取器只不過是對前三種選取器的擴充應用。而 在標籤內寫入style=""的方式,應該是CSS的一種引入方式,而不是選取器,因為根本就沒有用到選取器。而一般人們將上面這幾種方式結合在一起,所 以就有了5種或6種選取器了。

三種基本的選取器類型

文法如下:

◆標籤名選取器,如:p{},即直接使用HTML標籤作為選取器。

◆類別選取器,如.polaris{}。

◆ID選取器,如#polaris{}。

注意,ID選取器跟類別選取器有很大的不同:一個頁面內不能出現相同的ID;再就是ID也是後台開發人員會經常用的,所以前端開發人員應該盡量少的使用。當然跟後台人員的工作配合十分嫻熟之後,這些都不會成為限制。

延伸選取器

◆後代選取器,如.polaris span img{},後代選賊器實際上是使用多個選取器加上中間的空格來找到具體的要控制標籤。

◆群組選取器,如div,span,img{},群組選取器實際上是對CSS的一種簡化寫法,只不過把有相同定義的不同選取器放在一起,省了很多代碼。

選取器的優先順序別

瞭解了各種選取器後,還有一個重要的知識點就是CSS選取器的優先順序。這也就是為什麼polaris會遇到文章開頭的問題。舉個簡單的例子:

  1. <div class="polaris"> 
  2. <span class="beijixing"> 
  3. beijixing  
  4. </span> 
  5. <span> 
  6. polaris  
  7. </span> 
  8. </div> 

如果已經把.polaris下面span內的字型設定成紅色:

  1. .polaris span {color:red;} 

這時,如果要改變.beijixing的顏色為藍色,用下面的命令是不能實現的:

  1. .beijixing {color:blue;} 

出現這種情況就是因為後一個命令的優先順序不夠,兩條相互衝突的樣式設定,瀏覽器只會執行優先順序較高的那個。

那麼選取器的優先順序是怎麼規定的呢?

一般而言,選取器越特殊,它的優先順序越高。也就是選取器指向的越準確,它的優先順序就越高。通常我們用1表示標籤名選取器的優先順序,用10表示類選擇 器的優先順序,用100標示ID選取器的優先順序。比如上例當中 .polaris span {color:red;}的選取器優先順序是 10 + 1 也就是11;而 .polaris 的優先順序是10;瀏覽器自然會顯示紅色的字。理解了這個道理之後下面的優先順序計算自是易如反掌:

  1. div.test1 .span var 優先順序 1+10 +10 +1  
  2. span#xxx .songs li 優先順序1+100 + 10 + 1  
  3. #xxx li 優先順序 100 +1 

對於什麼情況下使用什麼選取器,用不同選取器的原則是:第一:準確的選到要控制的標籤;第二:使用最合理優先順序的選取器;第三:HTML和CSS代碼盡量簡潔美觀。通常:

1、最常用的選取器是類別選取器。

2、li、td、dd等經常大量連續出現,並且樣式相同或者相類似的標籤,我們採用類別選取器跟標籤名選取器結合的後代選取器 .xx li/td/dd {} 的方式選擇。

3、極少的情況下會用ID選取器,當然很多前端開發人員喜歡header,footer,banner,conntent設定成ID選取器的,因為相同的樣式在一個頁面裡不可能有第二次。

在這裡不得不提使用在標籤內引入CSS的方式來寫CSS,即:

  1. <div style="color:red">polaris</div> 

這時候的優先順序是最高的。我們給它的優先順序是1000,這種寫法不推薦使用,特別是對新手來說。這也完全違背了內容和顯示分離的思想。DIV+CSS的優點也不能再有任何體現。

後代選取器的定位原則

在這裡介紹一下對於後代選取器,瀏覽器是如何尋找元素的呢?

瀏覽器CSS匹配不是從左至右進行尋找,而是從右至左進行尋找。比如DIV#divBox p span.red{color:red;},瀏覽器的尋找順序如下:先尋找html中所有class='red'的span元素,找到後,再尋找其父輩元 素中是否有p元素,再判斷p的父元素中是否有id為divBox的div元素,如果都存在則匹配上。

瀏覽器從右至左進行尋找的好處是為了儘早過濾掉一些無關的樣式規則和元素。比如如下html和css:

  1. <style> 
  2. DIV#divBox p span.red{color:red;}  
  3. ><style> 
  4. <body> 
  5. <div id="divBox"> 
  6. <p><span>s1</span></p> 
  7. <p><span>s2</span></p> 
  8. <p><span>s3</span></p> 
  9. <p><span class='red'>s4</span></p> 
  10. </div> 
  11. </body> 

如果按從左至右尋找,哪會先尋找到很多不相關的p和span元素。而如果按從左至右的方式進行尋找,則首先就尋找到<span class='red'>的元素。firefox稱這種尋找方式為key selector(關鍵字查詢),所謂的關鍵字就是樣式規則中最後(最右邊)的規則,上面的key就是span.red。

簡潔、高效的CSS

所謂高效的CSS就是讓瀏覽器在尋找style匹配的元素的時候盡量進行少的尋找,下面列出一些我們常見的寫CSS犯一些低效錯誤:

◆不要在ID選取器前使用標籤名

一般寫法:DIV#divBox

更好寫法:#divBox

解釋: 因為ID選取器是唯一的,加上div反而增加不必要的匹配。

◆不要再class選取器前使用標籤名

一般寫法:span.red

更好寫法:.red

解釋:同第一條,但如果你定義了多個.red,而且在不同的元素下是樣式不一樣,則不能去掉,比如你css檔案中定義如下:

  1. p.red{color:red;}  
  2. span.red{color:#ff00ff} 

如果是這樣定義的就不要去掉,去掉後就會混淆,不過建議最好不要這樣寫

◆盡量少使用層級關係

一般寫法:#divBox p .red{color:red;}

更好寫法:.red{..}

◆使用class代替層級關係

一般寫法:#divBox ul li a{display:block;}

更好寫法:.block{display:block;}

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.