1. 程式人生 > >CSS選擇器及其優先順序排序

CSS選擇器及其優先順序排序

一、 CSS選擇器分類

CSS的選擇器其實大類的話可以分為三類,即id選擇器、class選擇器、標籤選擇器

用法如下:

  • id選擇器: #id名 { 屬性名:屬性值; }
  • class選擇器 :.class名 { 屬性名:屬性值; }
  • 標籤選擇器: 標籤名 { 屬性名:屬性值; }

其中,他們之間又可以以不同的方式進行組合,如下:

  • 後代選擇器: 父代名 後代名 { 屬性名:屬性值; }
  • 子代選擇器:父代名>子代名 { 屬性名:屬性值; }
  • 群組選擇器: #name1, .name2, #name div { 屬性名:屬性值; }
  • 偽類選擇器: name:偽類
  • 通用(萬用字元)選擇器:* { 屬性名: 屬性值; } ……
    常用的也就這些。

詳細的選擇器型別

下面列表中,選擇器型別的優先順序是遞增的:

  1. 型別選擇器(type selectors)(例如, h1)和 偽元素(pseudo-elements)(例如, ::before)
  2. 類選擇器(class selectors) (例如,.example),屬性選擇器(attributes selectors)(例如, [type=“radio”]),偽類(pseudo-classes)(例如, :hover)
  3. ID選擇器(例如, #example)

通配選擇符(universal selector)(*), 關係選擇符(combinators) (+, >, ~, ’ ') 和 否定偽類(negation pseudo-class)(:not()) 對優先順序沒有影響。(但是,在 :not() 內部宣告的選擇器是會影響優先順序)。

給元素新增的內聯樣式 (例如, style=“font-weight:bold”) 總會覆蓋外部樣式表的任何樣式 ,因此可看作是具有最高的優先順序。.

例外的 !important 規則

當在一個樣式宣告中使用一個!important 規則時,此宣告將覆蓋任何其他宣告。雖然技術上!important與優先順序無關,但它與它直接相關。
使用 !important 是一個壞習慣,應該儘量避免,因為這破壞了樣式表中的固有的級聯規則 使得除錯找bug變得更加困難了。當兩條相互衝突的帶有 !important 規則的宣告被應用到相同的元素上時,擁有更大優先順序的宣告將會被採用。

一些經驗法則:

  • 一定要優化考慮使用樣式規則的優先順序來解決問題而不是 !important
  • 只有在需要覆蓋全站或外部 css(例如引用的 ExtJs 或者 YUI )的特定頁面中使用 !important
  • 永遠不要在全站範圍的 css 上使用 !important
  • 永遠不要在你的外掛中使用 !important

取而代之,你可以:

  1. 更好地利用CSS級聯屬性
  2. 使用更具體的規則。在您選擇的元素之前,增加一個或多個其他元素,使選擇器變得更加具體,並獲得更高的優先順序

二、CSS選擇器優先順序

優先順序就是分配給指定的CSS宣告的一個權重,它由 匹配的選擇器中的 每一種選擇器型別的 數值 決定。
而當優先順序與多個CSS宣告中任意一個宣告的優先順序相等的時候,CSS中最後的那個宣告將會被應用到元素上。
當同一個元素有多個宣告的時候,優先順序才會有意義。因為每一個直接作用於元素的CSS規則總是會接管/覆蓋(take over)該元素從祖先元素繼承而來的規則。

  • 最高優先順序是 (直接在標籤中的設定樣式,假設級別為1000)
  • 次優先順序是(ID選擇器 ,假設級別為100) #myDiv{color:Red;}
  • 其次優先順序是(類選擇器,假設級別為10).divClass{color:Red;}
  • 最後優先順序是 (標籤選擇器,假設級別是 1) div{color:Red;}
  • 那麼後代選擇器的優先順序就可以計算了啊

選擇器優先順序通俗的理解

優先順序:由高到低(從上到下)

  • !important

  • 內聯(1,0,0,0)

  • id: (0,1,0,0)

  • 類:(0,0,1,0)

  • 偽類/屬性

  • 元素:(0,0,0,1)

  • 萬用字元

  • 繼承

使用的規則也很簡單,就是 選擇器的權值加到一起,大的優先;如果權值相同,後定義的優先 。雖然很簡單,但如果書寫的時候沒有注意,很容易就會導致CSS的重複定義,程式碼冗餘。

比如

.divClass span { color:Red;} 優先級別就是:10+1=11

從上面我們可以得出兩個關鍵的因素:

  • 權值的大小跟選擇器的型別和數量有關
  • 樣式的優先順序跟樣式的定義順序有關

關於CSS的執行效率:

  1. 樣式系統從最右邊的選擇符開始向左進行匹配規則。只要當前選擇符的左邊還有其他選擇符,樣式系統就會繼續向左移動,直到找到和規則匹配的元素,或者因為不匹配而退出。
  2. 如果你非常在意頁面的效能那千萬別使用CSS3選擇器。實際上,在所有瀏覽器中,用 class 和 id 來渲染,比那些使用同胞,後代選擇器,子選擇器(sibling, descendant and child selectors)對頁面效能的改善更值得關注。