1. 程式人生 > >30個你不可不知的CSS選擇器

30個你不可不知的CSS選擇器

一、五大基本選擇符

1. *(萬用字元)
*萬用字元選擇器,經常用於css reset(樣式重置),清理標籤的預設樣式,但現在一般不提倡直接使用*了,主要是*會匹配所有標籤,相當耗資源。*在css的優先順序中是最低的。

* {margin: 0; padding: 0;} 也可以用*來匹配某一元素下的所有子元素:

#container * {border: 1px solid black;}

2. #X(ID)
#+id名,這是日常常用的css選擇器,用於匹配id為XXX的元素,id選擇器的優勢是精準,高優先順序(優先順序基數為100,遠高於class的10),作為javascript指令碼鉤子的不二選擇,同樣缺點也很明顯:優先順序過高,重用性差,所以在使用id選擇器前,我們最好問下自己,真的到了非用id選擇器的地步?

#container { width: 960px; margin: auto;}

3. .X(類)
.+class名,標準的樣式選擇器,與id選擇器的區別是樣式選擇器可以選擇多個元素。樣式選擇器是提倡使用的選擇器,也是日常前端人員用到最多的選擇器了。

.error {color: red;}

4. X Y(後代)
li a {text-decoration: none;} 
目前非常常用的css選擇器,用於選取X元素下子元素Y,這裡有個要留意的點是,這種方式的選擇器將選取其下所有匹配的子元素,無視層級,所以有的情況是不宜使用的,比如上述的程式碼去掉li下的所有a的下劃線,但li裡面還有個ul,我不希望ul下的li的a去掉下劃線。

使用此子孫選擇器的時候要考慮是否希望某樣式對所有子孫元素都起作用。

這種子孫選擇器還有個作用,就是建立類似名稱空間的作用。比如上述程式碼樣式的作用域明顯為li。

5. X(標籤)
a { color: red; }
ul { margin-left: 0; } 
標籤選擇器,優先順序僅僅比*高,常用於css reset(樣式重置)。

二、除IE6外瀏覽器支援的css選擇器

6. X:link X:visited X:hover X:active
a:link { color: red; }
a:visted { color: purple; } 
偽類選擇器,visted已被訪問過的樣式,hover滑鼠經過的樣式,link未被訪問的樣式。三種偽類選擇器常用於連結,但不是說只適用於連結,可惜的是IE6只支援將這三種偽類選擇器作用於連結。

這裡說明一點,由於CSS優先順序的關係(後面比前面的優先順序高),這幾個偽類的書寫順序,一般是link、visted、hover、active。

7. X + Y(相鄰)
ul + p { color: red;} 
相鄰選擇器,上述程式碼中就會匹配在ul後面的第一個p,將段落內的文字顏色設定為紅色。(只匹配一個元素)

8. X > Y(子)
子選擇器,留意X > Y與X Y的區別,前者是子孫選擇器,即無視層級,而X Y是字選擇器,只匹配X下的子元素Y。

從理論上來講X > Y是值得提倡選擇器,可惜IE6不支援。

9. X ~ Y
ul ~ p {color: red;}
相鄰選擇器,與X+Y類似,不同的是X ~ Y匹配的是元素集合,如上述程式碼,匹配的是所有ul相鄰的p

10. X[title]
a[title] { color: green;} 
屬性選擇器,如上述程式碼匹配的是帶有title屬性的連結元素。

11. X[title=""]
a[title="maomao"] {color:#096;} 
屬性選擇器,上述程式碼不只匹配帶有title屬性,更匹配title屬性等於maomao的連結元素。[]內不只可用title屬性,還可以使用其他屬性。

12. X[title*=""]
a[title*="mao"] {color:#096;} 
加了*號,意味著是模糊匹配,如上述程式碼,會匹配title屬性為mao或maomao或maomao520等帶有maomao的連結屬性。

13. X[title^=""]
a[title^="maomao"]{color:#096;} 
模糊匹配,與*的作用相反,^起到排除的作用,比如上述程式碼,會匹配title屬性不帶有maomao的連結屬性。

14. X[href$=""]
a[href$=".png"] { color: red;} 
在屬性選擇器中多一個$符號,用於匹配結尾為特定字串的元素,比如上述程式碼匹配的就是href屬性值的結尾為.png的連結。

15.X[data-*=""]
a[data-filetype="image"] {color: red;} 
data-filetype這個屬性目前用的實在不多,但有些場合非常好用。比如我要匹配所有的資料型別為圖片的連結,如果使用X[href$=""]的方式如下:

a[href$=".jpg"], a[href$=".jpeg"], a[href$=".png"], a[href$=".gif"] {color: red;}

而使用data-filetype,只要:
a[data-filetype="image"] {color: red;} 
當然前提是你給每一個連結加上data-filetype屬性。

16.X[foo~=""]
a[data-info~="external"] {color: red;} 
a[data-info~="image"] {border: 1px solid black;} 
這也是非常少用的選擇器,加上~號,有一種情況特別適用,比如你有個data-filetype=”external image”屬性,這時候我希望分別針對external和image樣式控制。

a[data-info~="external"] {color: red;} 
a[data-info~="image"] {border: 1px solid black;} 
上述程式碼會匹配data-filetype=”external”、data-filetype=”image”、data-filetype=”external image”的a。

17.X:checked
input[type=radio]:checked {border: 1px solid black;} 
這個偽類選擇器只用於匹配帶有checked屬性的元素,比如radio、checkbox即單選框和多選框。

目前這個偽類選擇器,IE9下都不支援,非IE瀏覽器基本上都支援。

三、除IE8以下的瀏覽器支援的css選擇器

18.X:after
.clearfix:after {content: "";display: block;clear: both; visibility: hidden;font-size: 0; height: 0;}

.clearfix {*display: inline-block;_height: 1%;0} 
我想上面這段程式碼,很多朋友都非常熟悉,是清理浮動時常用的hack方法。:after偽類與content結合使用,用於往元素類追加內容。:after偽類還有個妙用:用於產生陰影。

19.X:hover
div:hover {background: #e3e3e3;} 
hover在前面已經介紹過,IE6下只支援a的hover。

這裡提到一個很有意思的東西,即使用border-bottom: 1px solid black; 要好於text-decoration: underline;從實際的效果來看,使用border-bottom的距離比text-decoration來的合理,但使用border-bottom存在一些風險,比如顏色問題。

20.X:not(selector)
div:not(#container) {color: blue;} 
否定偽類選擇器,這還是比較好理解的,上述將會把非id為container的div的字型顏色設定為藍色。

:not偽類IE8並不支援,IE9已經支援了。

21.X::pseudoElement
p::first-line {font-weight: bold; font-size: 1.2em;}
::偽類,用於給元素的片段新增樣式,這如何理解呢?比如你要讓一個段落的第一行的文字加粗,那麼這個選擇器是不二之選。

除此之外,你還可以給第一個字加上特殊樣式,這個應用還是非常常見的

p::first-letter { float: left;font-size: 2em;font-weight: bold;font-family: cursive; padding-right: 2px;}
IE6居然支援!這足以讓人驚喜的…..

四、css3 結構性偽類選擇器

22.X:nth-child(n)
li:nth-child(3) {color: red;}
:nth-child(n),用於匹配索引值為n的子元素。索引值從1開始。

X:nth-child()用法實際上有三種變化。X:nth-child()更強大的用處在於奇偶匹配。有興趣的請看《Understanding :nth-child Pseudo-class Expressions》,《CSS3 :nth-child()偽類選擇器》

23.X:nth-last-child(n)
li:nth-last-child(2) {color: red;}
:nth-child(n),是從第一個開始算索引,而X:nth-last-child(n)是從最後一個開始算索引。

24.X:nth-of-type(n)
ul:nth-of-type(3) {border: 1px solid black;}
nth-of-type與nth-child的效果是驚人的相似,想要更多的瞭解nth-of-type請看《Alternative for :nth-of-type() and :nth-child()》,《:nth-of-type(N)》。

25.X:nth-last-of-type(n)
ul:nth-last-of-type(3) {border: 1px solid black;}
:nth-last-child效果相似。

26.X:first-child
ul li:first-child {border-top: none;}
匹配子集的第一個元素。IE7就可以支援了,這個偽類還是非常有用的。

27.X:last-child
ul > li:last-child {color: green;}
與:first-child效果相反

留意IE8支援:first-child,但不支援:last-child。

28.X:only-child
div p:only-child {color: red;}
這個偽類一般用的比較少,比如上述程式碼匹配的是div下的有且僅有一個的p,也就是說,如果div內有多個p,將不匹配。

29.X:only-of-type
li:only-of-type { font-weight: bold;}
與:only-child類似。

30.X:first-of-type
ul:first-of-type{font-weight: bold;} 
等價於:nth-of-type(1),匹配集合元素中的第一個元素。

CSS3 選擇器

在 CSS 中,選擇器是一種模式,用於選擇需要新增樣式的元素。

"CSS" 列指示該屬性是在哪個 CSS 版本中定義的。(CSS1、CSS2 還是 CSS3。)

選擇器 例子 例子描述 CSS
.intro 選擇 class="intro" 的所有元素。 1
#id #firstname 選擇 id="firstname" 的所有元素。 1
* * 選擇所有元素。 2
p 選擇所有 <p> 元素。 1
div,p 選擇所有 <div> 元素和所有 <p> 元素。 1
div p 選擇 <div> 元素內部的所有 <p> 元素。 1
div>p 選擇父元素為 <div> 元素的所有 <p> 元素。 2
div+p 選擇緊接在 <div> 元素之後的所有 <p> 元素。 2
[target] 選擇帶有 target 屬性所有元素。 2
[target=_blank] 選擇 target="_blank" 的所有元素。 2
[title~=flower] 選擇 title 屬性包含單詞 "flower" 的所有元素。 2
[lang|=en] 選擇 lang 屬性值以 "en" 開頭的所有元素。 2
:link a:link 選擇所有未被訪問的連結。 1
a:visited 選擇所有已被訪問的連結。 1
a:active 選擇活動連結。 1
a:hover 選擇滑鼠指標位於其上的連結。 1
input:focus 選擇獲得焦點的 input 元素。 2
p:first-letter 選擇每個 <p> 元素的首字母。 1
p:first-line 選擇每個 <p> 元素的首行。 1
p:first-child 選擇屬於父元素的第一個子元素的每個 <p> 元素。 2
p:before 在每個 <p> 元素的內容之前插入內容。 2
p:after 在每個 <p> 元素的內容之後插入內容。 2
p:lang(it) 選擇帶有以 "it" 開頭的 lang 屬性值的每個 <p> 元素。 2
a[src^="https"] 選擇其 src 屬性值以 "https" 開頭的每個 <a> 元素。 3
a[src$=".pdf"] 選擇其 src 屬性以 ".pdf" 結尾的所有 <a> 元素。 3
a[src*="abc"] 選擇其 src 屬性中包含 "abc" 子串的每個 <a> 元素。 3
p:first-of-type 選擇屬於其父元素的首個 <p> 元素的每個 <p> 元素。 3
p:last-of-type 選擇屬於其父元素的最後 <p> 元素的每個 <p> 元素。 3
p:only-of-type 選擇屬於其父元素唯一的 <p> 元素的每個 <p> 元素。 3
p:only-child 選擇屬於其父元素的唯一子元素的每個 <p> 元素。 3
p:nth-child(2) 選擇屬於其父元素的第二個子元素的每個 <p> 元素。 3
p:nth-last-child(2) 同上,從最後一個子元素開始計數。 3
p:nth-of-type(2) 選擇屬於其父元素第二個 <p> 元素的每個 <p> 元素。 3
p:nth-last-of-type(2) 同上,但是從最後一個子元素開始計數。 3
p:last-child 選擇屬於其父元素最後一個子元素每個 <p> 元素。 3
:root :root 選擇文件的根元素。 3
p:empty 選擇沒有子元素的每個 <p> 元素(包括文字節點)。 3
#news:target 選擇當前活動的 #news 元素。 3
input:enabled 選擇每個啟用的 <input> 元素。 3
input:disabled 選擇每個禁用的 <input> 元素 3
input:checked 選擇每個被選中的 <input> 元素。 3
:not(p) 選擇非 <p> 元素的每個元素。 3
::selection 選擇被使用者選取的元素部分。 3