神通廣大的CSS3選擇器

發表於2016-02-04

每個前端工程師可能每天都會寫一些css,其中選擇器是很主要的一部分。但是,大家可能每天寫的大多是#id,.class這樣的選擇器,這並不稀奇,但是如果我們瞭解並且熟用css3為我們提供的強大並且優雅的選擇器,就可以簡化我們的程式碼。

我在學習和整理css3的選擇器的時候都不會去考慮它的瀏覽器的支援程度,如果有需要,可以在這裡檢視它的瀏覽器支援情況:「caniuse.com」。

一、基本選擇器

 1. 通配選擇器 「*」

 

2.元素選擇器 「Element」

 

3.ID選擇器 「#id」

 

4.類選擇器 「.class」

需要注意的是:多個頁面元素可以有相同的類名,但是元素的id在頁面中必須是唯一的。

 

5.群組選擇器 「selector1,…,selectorN」

 

二、層次選擇器

6.後代選擇器「E F」

選擇匹配E的元素內的所有匹配F的元素。

 

7.子選擇器「E > F」

選擇配配E的元素的匹配F的直系子元素。

 

8.相鄰兄弟元素選擇器「E + F」

E和F是同輩元素,具有相同的父元素,並且F元素緊鄰在E元素的後面,此時可以使用相鄰兄弟選擇器。

 

9.通用兄弟選擇器「E ~ F」

E和F是同輩元素,具有相同的父元素,並且F元素在E元素之後,E ~ F將選中E元素後面的所有F元素。

 

三、偽類選擇器

10.動態偽類選擇器「E:link,E:visited,E:active,E:hover,E:focus」

 

11.目標偽類選擇器「E:target」

選擇匹配E的所有元素,且匹配元素被相關URL指向。

通俗點說,頁面的url如果帶有#something這樣的字樣(https://rawgit.com/zhangmengxue/Practice/master/demo.html#section-1)那麼:target就是用來匹配頁面中id為#something(section-1)的元素的。

這裡有一個demo,利用:target實現純css的手風琴效果:[檢視原始碼][執行demo]

 

12.語言偽類選擇器「E:lang(language)」

用來選擇指定了lang屬性的元素,其值為language。

有時候網頁切換不同的語言版本的時候,可以通過這個選擇器做一些特殊的處理。

 

13.狀態偽類選擇器「E:checked,E:enabled,E:disabled」

 

14.結構偽類選擇器「E:first-child,E:last-child,E:root,E:nth-child(n),E:nth-last-child(n),E:nth-of-type(n),E:nth-last-of-type(n),E:first-of-type,E:last-of-type,E:only-child,E:only-of-type,E:empty」

 

14.1 [E:first-child]

用來選取特定元素的第一個子元素。

 

14.2 [E:last-child]

用來選取特定元素的最後一個子元素。

 

14.3 [E:nth-child()],[E:nth-last-child()]

用來選取某個父元素的一個或多個特定的子元素,其中的n可以是數值(從1開始),也可以是包含n的表示式,也可以是odd(奇數),even(偶數)。

E:nth-last-child()選擇器的使用方法於E:nth-child()是相同的,不同的是E:nth-last-child()選擇的元素是從父元素的最後一個子元素開始算起。

 

14.4  [E:root]

用來匹配元素E所在的文件中的根元素,在html文件中根元素就始終是html。

 

14.5 [E:nth-of-type(),E:nth-last-of-type()]

E:nth-of-type()只計算父元素中指定的某種型別的子元素,當某個元素的子元素型別不只是一種時,使用nth-of-type來選擇會比較有用。

E:nth-last-of-type()的用法同E:nth-of-type()相同,不同的是:nth-last-of-type()也是從父元素的最後一個子元素開始算起。

li:nth-of-type(3)的話就會標識它只會選擇第三個li元素,別的元素會忽略掉,如:

 

但是使用nth-child就會是這樣:

 

14.6 [E:first-of-type,E:last-of-type]

:first-of-type和:last-of-type這兩個選擇器類似於:first-child和:last-child,不同的就是指定了元素的型別。

 

14.7 [E:only-child]

匹配的元素E是其父元素的唯一子元素,也就是說匹配元素的父元素只有一個子元素。

 

14.8 [E:only-of-type]

:only-of-type用來選擇一個元素,他的型別在他父元素的所有子元素中是唯一的。也就是說,一個父元素有很多子元素,而其中只有一個子元素的型別是唯一的,那麼就可以使用:only-of-type來選取這個元素。

這個屬性說起來有點繞口,寫了個簡陋的demo說明意思:[檢視原始碼][執行demo]

 

14.9 [E:empty]

:empty用來選擇沒有任何內容的元素,哪怕是一個空格都沒有的元素。

 

15 否定偽類選擇器「E:not(F)」

可以用來選取所有除了F外的所有元素。

 

四、偽元素

以前我們使用的偽元素是:first-letter,:first-line,:before,:after,這樣的。但css3定義的偽元素變成了雙冒號,主要用來區分偽類和偽元素。對於IE6-8,僅支援單冒號表示方法,但是其他現代瀏覽器兩種表示方法是都可以的,也就是說在現代瀏覽器中偽元素使用雙冒號和單冒號都是會識別的。

16. 「::first-letter」

::first-letter用來選擇文字塊的第一個字母,常用於文字排版方面。

 

17. 「::first-line」

::first-line用於匹配元素的第一行文字,也是常用於文字排版。

 

18. 「::before,::after」

::before,::after同我們之前熟用的:before和:after使用方法相同,它們不是指存於標記中的內容,是配合使用content屬性可以插入額外內容的位置,儘管生成的內容不會成為DOM的一部分,但它同樣可以設定樣式。

 

19. 「::selection」

css3新定義的偽元素::selection用來匹配突出顯示的文字。但是使用前需要確認瀏覽器對它的支援程度。

瀏覽器預設的情況下,我們選中的文字背景是藍色,字型是白色。通過使用::selection,我們可以改變它的效果。

但是需要注意的是,::selection僅接受兩個屬性,一個是background,一個是color。

 

五、屬性選擇器

在html中,通過給元素新增屬性,給以給元素新增一些附加的資訊,屬性選擇器就可以通過定位屬性來選取特定的元素。

20. 「 E[attr] 」

用來選擇有某個屬性的元素,不論這個屬性的值是什麼。

 

21. 「 E[attr=val] 」

用來選取具有屬性attr並且屬性值為val的元素。

 

22. 「 E[attr|=val] 」

E[attr|=val]用來選擇具有屬性attr且屬性的值為val或以val-開頭的元素(其中-是不可或缺的)。

 

23. 「 E[attr~=val] 」

當某個元素的某個屬性具有多個用空格隔開的屬性值,此時使用E[attr~=val]只要attr屬性多個屬性值中有一個於val匹配元素就會被選中。

 

24. 「 E[attr*=val] 」

這個屬性選擇器使用了萬用字元,用來選擇具有屬性attr並且只要屬性值中包含val字串的元素。也就是說只要所選屬性中有val字串,不管是不是多個用空格分隔的屬性值,都將被選中。

 

25. 「 E[attr^=val] 」

用來選擇屬性attr的屬性值是以val開頭的所有元素,注意它與E[attr|=val]的區別,attr|=val中-是必不可少的,也就是說以val-開頭。

 

26. 「 E[attr$=val] 」

這個選擇器剛好跟E[attr^=val]相反,用來選擇具有attr屬性且屬性值以val結尾的元素。

相關文章