CSS 選擇器用於定位咱們想要給予樣式的 HTML 元素css
瀏覽器經過優先級來判斷哪些屬性值與一個元素最爲相關,從而在該元素上應用這些屬性值。優先級是基於不一樣種類選擇器組成的匹配規則。算法
CSS 選擇器有許多種,例如 ID 選擇器、類選擇器、標籤選擇器、通用選擇器、屬性選擇器、僞類選擇器、僞元素選擇器、羣組選擇器、後代選擇器、子元素選擇器、兄弟元素選擇器等等瀏覽器
相信各位寫過 CSS 的朋友都知道,CSS 幾種常見選擇器優先級是:!important > 內聯 > ID選擇器 > 類選擇器 > 標籤選擇器 > 通用選擇器
。那麼它是怎麼算出來的呢?有這樣一個算法過程:指針
優先級是由 A、B、C、D 的值來決定的,其中它們的值計算規則以下:code
若是存在內聯樣式
,那麼 A = 1, 不然 A = 0;繼承
B 的值等於ID選擇器
出現的次數;element
C 的值等於類選擇器
和屬性選擇器
和僞類
出現的總次數;文檔
D 的值等於標籤選擇器
和僞元素
出現的總次數 。get
再通俗一點的說法:在一個賭桌上,有這麼幾種籌碼,input
一個內聯樣式
至關於¥1000;
一個ID選擇器
至關於¥100;
一個類選擇器
/屬性選擇器
/僞類
至關於¥10
一個標籤選
擇器 / 僞元素
至關於¥1
每出現一個上述選擇器,就增長對應籌碼的錢數,最終,誰的籌碼多,就聽誰的。可是,這裏的計算方法和生活中的計算方法不同,這裏的十個一百,並不等於一千,只能是‘十百’,因此哪怕是‘十一百’,都要比一千小。
選擇器 | 示例 | 權重 |
---|---|---|
!impotant | color: #fff !important; | +∞ |
內聯選擇器 | "<div style='color: #fff'></div>" | 1 0 0 0 |
ID 選擇器 | #id | 0 1 0 0 |
類選擇器、屬性選擇器、僞類 | .class | 0 0 1 0 |
標籤選擇器、僞元素 | div | 0 0 0 1 |
通用選擇器 | * | 0 0 0 0 |
CSS 樣式有衝突時:
對於不一樣的 CSS 選擇器,可經過計算權重值得出優先級,判斷生效樣式
對於相同的 CSS 選擇器,可根據書寫位置判斷生效樣式
繼承屬性沒有權重值,優先級最低
選擇器 | 例子 | 描述 | css版本 |
---|---|---|---|
.class | .intro | 選擇 class="intro" 的全部元素。 | 1 |
#id | #firstname | 選擇 id="firstname" 的全部元素。 | 1 |
* | * | 選擇全部元素。 | 2 |
element | p | 選擇全部 <p> 元素。 | 1 |
element,element | div,p | 選擇全部 <div> 元素和全部 <p> 元素。 | 1 |
element element | div p | 選擇 <div> 元素內部的全部 <p> 元素。 | 1 |
element>element | div>p | 選擇父元素爲 <div> 元素的全部 <p> 元素。 | 2 |
element+element | div+p | 選擇緊接在 <div> 元素以後的全部 <p> 元素。 | 2 |
[attribute] | [target] | 選擇帶有 target 屬性全部元素。 | 2 |
[attribute=value] | [target=_blank] | 選擇 target="_blank" 的全部元素。 | 2 |
[attribute~=value] | [title~=flower] | 選擇 title 屬性包含單詞 "flower" 的全部元素。 | 2 |
[attribute|=value] | [lang|=en] | 選擇 lang 屬性值以 "en" 開頭的全部元素。 | 2 |
:link | a:link | 選擇全部未被訪問的連接。 | 1 |
:visited | a:visited | 選擇全部已被訪問的連接。 | 1 |
:active | a:active | 選擇活動連接。 | 1 |
:hover | a:hover | 選擇鼠標指針位於其上的連接。 | 1 |
:focus | input:focus | 選擇得到焦點的 input 元素。 | 2 |
:first-letter | p:first-letter | 選擇每一個 <p> 元素的首字母。 | 1 |
:first-line | p:first-line | 選擇每一個 <p> 元素的首行。 | 1 |
:first-child | p:first-child | 選擇屬於父元素的第一個子元素的每一個 <p> 元素。 | 2 |
:before | p:before | 在每一個 <p> 元素的內容以前插入內容。 | 2 |
:after | p:after | 在每一個 <p> 元素的內容以後插入內容。 | 2 |
:lang(language) | p:lang(it) | 選擇帶有以 "it" 開頭的 lang 屬性值的每一個 <p> 元素。 | 2 |
element1~element2 | p~ul | 選擇前面有 <p> 元素的每一個 <ul> 元素。 | 3 |
[attribute^=value] | a[src^="https"] | 選擇其 src 屬性值以 "https" 開頭的每一個 <a> 元素。 | 3 |
[attribute$=value] | a[src$=".pdf"] | 選擇其 src 屬性以 ".pdf" 結尾的全部 <a> 元素。 | 3 |
[attribute*=value] | a[src*="abc"] | 選擇其 src 屬性中包含 "abc" 子串的每一個 <a> 元素。 | 3 |
:first-of-type | p:first-of-type | 選擇屬於其父元素的首個 <p> 元素的每一個 <p> 元素。 | 3 |
:last-of-type | p:last-of-type | 選擇屬於其父元素的最後 <p> 元素的每一個 <p> 元素。 | 3 |
:only-of-type | p:only-of-type | 選擇屬於其父元素惟一的 <p> 元素的每一個 <p> 元素。 | 3 |
:only-child | p:only-child | 選擇屬於其父元素的惟一子元素的每一個 <p> 元素。 | 3 |
:nth-child(n) | p:nth-child(2) | 選擇屬於其父元素的第二個子元素的每一個 <p> 元素。 | 3 |
:nth-last-child(n) | p:nth-last-child(2) | 同上,從最後一個子元素開始計數。 | 3 |
:nth-of-type(n) | p:nth-of-type(2) | 選擇屬於其父元素第二個<p> 元素的每一個 <p> 元素。 | 3 |
:nth-last-of-type(n) | p:nth-last-of-type(2) | 同上,可是從最後一個子元素開始計數。 | 3 |
:last-child | p:last-child | 選擇屬於其父元素最後一個子元素每一個 <p> 元素。 | 3 |
:root | :root | 選擇文檔的根元素。 | 3 |
:empty | p:empty | 選擇沒有子元素的每一個 <p> 元素(包括文本節點)。 | 3 |
:target | #news:target | 選擇當前活動的 #news 元素。 | 3 |
:enabled | input:enabled | 選擇每一個啓用的 <input> 元素。 | 3 |
:disabled | input:disabled | 選擇每一個禁用的 <input> 元素 | 3 |
:checked | input:checked | 選擇每一個被選中的 <input> 元素。 | 3 |
:not(selector) | :not(p) | 選擇非 <p> 元素的每一個元素。 | 3 |
::selection | ::selection | 選擇被用戶選取的元素部分。 | 3 |