CSS3偽類別選取器詳解

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   os   io   strong   

前面花了兩節內容分別在《CSS3基本選取器》和《CSS3屬性選取器詳解》介紹了CSS3選取器中的基本選取器和屬性選取器使用方法,今天要和大家一起學習CSS3選取器中的第三部分,也是最後一部分——偽類別選取器。偽類別選取器對於大家來說最熟悉的莫過於:link,:focus,:hover之類的了,因為這些在平時中是常用到的偽類別選取器,那麼先和大家一起簡單總結一下CSS中常用的偽類別選取器的使用方法,最後把重心放到CSS3新增加的":nth-child"選取器的使用方法。

和前面一樣,在開始之前先建立一個Dom:

<div class="demo clearfix">  <ul class="clearfix"><li class="first links odd" id="first"><a href="">1</a></li><li class="links even"><a href="">2</a></li><li class="links odd"><a href="">3</a></li><li class="links even"><a href="">4</a></li><li class="links odd"><a href="">5</a></li><li class="links even"><a href="">6</a></li><li class="links odd"><a href="">7</a></li><li class="links even"><a href="">8</a></li><li class="links odd"><a href="">9</a></li><li class="links even last" id="last"><a href="">10</a></li></ul></div>

同樣先加上一些樣式,讓他看起來好看一點

     .demo {width: 300px;border: 1px solid #ccc;padding: 10px;     }     .demo li {border: 1px solid #ccc;padding: 2px;float: left;margin-right:4px;     }     .demo a { float: left; display: block; height: 20px; line-height: 20px; width: 20px; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px; text-align: center; background: #f36; color: green; text-decoration: none;     }

最出效果:

CSS的偽類文法和別的文法有點不一樣,其主要有兩種文法表達方式

    E:pseudo-class {property:value}/*其中E為元素;pseudo-class為偽類名稱;property是css的屬性;value為css的屬性值*/

樣本:

a:link {color:red;}

第二種寫法

E.class:pseudo-class{property:value}

如:

   a.selected:hover {color: blue;}

下面開始我們一起來看看這些偽類的具體應用:

一、動態偽類

動態偽類,因為這些偽類並不存在於HTML中,而只有當使用者和網站互動的時候才能體現出來,動態偽類包含兩種,第一種是我們在連結中常看到的錨點偽類,如":link",":visited";另外一種被稱作使用者行為偽類,如“:hover”,":active"和":focus"。先來看最常見的錨點偽類

.demo a:link {color:gray;}/*連結沒有被訪問時前景色彩為灰色*/.demo a:visited{color:yellow;}/*連結被訪問過後前景色彩為黃色*/.demo a:hover{color:green;}/*滑鼠懸浮在連結上時前景色彩為綠色*/.demo a:active{color:blue;}/*滑鼠點中啟用連結那一下前景色彩為藍色*/

對於這四個錨點偽類的設定,有一點需要特別注意,那就是他們的先後順序,要讓他們遵守一個愛恨原則LoVe/HAte,也就是Link--visited--hover--active。如果你把順序搞錯了會給你帶來意想不到的錯誤,大家對於這個應該很熟悉的,如果是初學的朋友,可以私下練習一下。其中:hover和:active又同時被列入到使用者行為偽類中,他們所表達的意思是:

  1. :hover用於當使用者把滑鼠移動到元素上面時的效果;
  2. :active用於使用者點擊元素那一下的效果(正發生在點的那一下,鬆開滑鼠左鍵此動作也就完成了)
  3. :focus用於元素成為焦點,這個經常用在表單元素上。

本站的button就採用了這幾處效果:

    .form-submit {-moz-transition: border-color 0.218s ease 0s;-webkit-transition: border-color 0.218s ease 0s;-o-transition: border-color 0.218s ease 0s;-ms-transition: border-color 0.218s ease 0s;transition: border-color 0.218s ease 0s;background: none repeat scroll 0 0 #F5F5F5;border: 1px solid #DCDCDC;-moz-border-radius: 2px 2px 2px 2px;-webkit-border-radius: 2px 2px 2px 2px;border-radius: 2px 2px 2px 2px;color: #333333;font: 11px/27px arial,sans-serif;height: 27px;padding: 0 8px;text-align: center;text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1);     }     .form-submit:hover {background-color: #F8F8F8;border-color: #C6C6C6;-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);color: #333333;     }     .form-submit:active {border-color: #4D90FE;-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3) inset;-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3) inset;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3) inset;color: #000000;     }     .form-submit:focus { border: 1px solid #4D90FE !important;     }

對於:hover在IE6下只有a元素支援,:active只有IE7-6不支援,:focus在IE6-7下不被支援。

二、UI元素狀態偽類

我們把":enabled",":disabled",":checked"偽類稱為UI元素狀態偽類,這些主要是針對於HTML中的Form元素操作,最常見的比如我們"type="text"有enable和disabled兩種狀態,前者為可寫狀態後者為不可狀態;另外"type="radio"和"type="checkbox""有"checked"和"unchecked"兩種狀態。來看兩個執行個體,比如說你想將"disabled"的文字框與別的文字框區別出來,你就可以這樣應用

        input[type="text"]:disabled {border:1px solid #999;background-color: #fefefe;}

這樣一來就把頁面中禁用的文字框應用了一個不同的樣式。那麼對於其他幾個用法是一樣的,這裡就不在講述。IE6-8不支援":checked",":enabled",":disabled"這三種選取器。

三、CSS3的:nth選取器

這節內容才是關鍵,也是CSS3選取器最新部分,有人也稱這種選取器為CSS3結構類,下面我們通過實際的應用來具體瞭解他們的使用和區別,首先列出他具有的選擇方法:

  1. :fist-child選擇某個元素的第一個子項目;
  2. :last-child選擇某個元素的最後一個子項目;
  3. :nth-child()選擇某個元素的一個或多個特定的子項目;
  4. :nth-last-child()選擇某個元素的一個或多個特定的子項目,從這個元素的最後一個子項目開始算;
  5. :nth-of-type()選擇指定的元素;
  6. :nth-last-of-type()選擇指定的元素,從元素的最後一個開始計算;
  7. :first-of-type選擇一個上階項目下的第一個同類子項目;
  8. :last-of-type選擇一個上階項目的最後一個同類子項目;
  9. :only-child選擇的元素是它的父元素的唯一一個了元素;
  10. :only-of-type選擇一個元素是它的上階項目的唯一一個相同類型的子項目;
  11. :empty選擇的元素裡面沒有任何內容。

下面我們針對上面所列的各種選取器,一個一個來介紹:

1、:first-child

:first-child是用來選擇某個元素的第一個子項目,比如我們這裡的這個demo,你想讓列表中的"1"具有與從不同的樣式,我們就可以使用:first-child來實現:

      .demo li:first-child {background: green; border: 1px dotted blue;}

在沒有這個選取器出現之前,我們都需在要第一個li上加上一個不同的class名,比如說“first”,然後在給他應用不同的樣式

     .demo li.first {background: green; border: 1px dotted blue;}

其實這兩種最終效果是一樣的,只是後面這種,我們需要在html增加一個額外的class名,請看效果:

IE6不支援:first-child選取器。

2、:last-child

:last-child選取器與:first-child選取器的作用類似,不同的是":last-child"選擇是的元素的最後一個子項目。比如說,我們需要單獨給列表最後一項一個不同的樣式,我們就可以使用這個選取器,如:

     .demo li:last-child {background: green; border: 2px dotted blue;}

這個效果和以前在列表上的“last”的class是一樣的

     .demo li.last {background: green; border: 2px dotted blue;}

他們效顯示的效果都是一致的,;

3、:nth-child()

:nth-child()可以選擇某個的一個或多個特定的子項目,你可以按這種方式進行選擇:

:nth-child(length);/*參數是具體數字*/:nth-child(n);/*參數是n,n從0開始計算*/:nth-child(n*length)/*n的倍數選擇,n從0開始算*/:nth-child(n+length);/*選擇大於length後面的元素*/:nth-child(-n+length)/*選擇小於length前面的元素*/:nth-child(n*length+1);/*表示隔幾選一*///上面length為整數

:nth-child()可以定義他的值(值可以是整數,也可以是運算式),如上面所示,用來選擇特定的子項目,對於這個我們直接看執行個體,比我說的更好理解。

:nth-child(3),選擇某元素下的第三個子項目,(這裡的3可以是你自己需要的數字),比如說,我需要挑選清單中的第三個li元素,那麼我們可以直接這樣使用:

.demo li:nth-child(3) {background: lime;}

效果如下所示:

這種不式不能引用負值,也就是說li:nth-child(-3)是不正確的使用方法。

:nth-child(n),其中n是一個簡單的運算式,那麼"n"取值是從“0”開始計算的,到什麼時候結束我也不知道,如果你在實際應用中直接這樣使用的話,將會選中所有子項目,比如說,在我們的demo中,你在li中使用":nth-child(n)",那麼將選中所有的"li",如:

.demo li:nth-child(n) {background: lime;} 等於.demo li {background: lime;}

他其實是這樣計算的

n=0 --》 沒有選擇元素n=1 --》 選擇第一個li,n=2 --》 選擇第二個li,後在的依此類推,這樣下來就選中了所有的li

請看效果:

請注意了,這裡的“n”只能是"n",不能使用其他字母代替,不然會沒有任何效果的。

:nth-child(2n),這中方式是前一種的變身,我們可以選擇n的2倍數,當然其中“2”可以換成你自己需要的數字,如:

.demo li:nth-child(2n) {background: lime;}等於.demo li:nth-child(even) {background: lime;}

我們來看一下其計算的過程:

n=0 --》 2n=0 --》 沒有選中任何元素,n=1 --》 2n=2 --》 選擇了第二個lin=2 --》 2n=4 --》 選擇了第四個li,後面的依此類推

如果是“2n”這樣跟我們以使用"even"命名class定義樣式,所起到的效果是一樣的,:

“:nth-child(2n)”也等於":nth-child(even)"效果。

:nth-child(2n-1),這個選取器是在":nth-child(2n)"基礎上演變過來的,上面說了人是選擇偶數,那麼我們在他的基礎上減去“1”就變成奇數選擇,如:

.demo li:nth-child(2n-1) {background: lime;}

我們來看看其實現過程

n=0 --》 2n-1=-1 --》 也沒有選中任何元素,n=1 --》 2n-1=1 --》 選擇第一個lin=2 --》 2n-1=3 --》 選擇第三個li,後面的依此類推

其實實現這種奇數效果,我們還可以使用":nth-child(2n+1)"和":nth-child(odd)",一起來看他們的效果

:nth-child(n+5)這個選取器是選擇從第五個元素開始選擇,這裡的數字你可以自己定義,如:

.demo li:nth-child(n+5) {background: lime;}

按前面的計算方法,我們來看看,

n=0 --》 n+5=5 --》  選中第5個lin=1 --》 n+5=6 --》  選擇第6個li,後面的就不列出來了,原理一樣

你可以使用這種方法選擇你需要開始選擇的元素位置,也就是說換了數字,起始位置就變了,看下在的:

:nth-child(-n+5)這種選取器剛好和上面的選取器相反,這個是選擇第5個前面的,如:

.demo li:nth-child(-n+5) {background: lime;}

如果不清楚怎麼一回事,你只要計算一下就明白了

n=0 --》 -n+5=5 --》 選擇了第5個lin=1 --》 -n+5=4 --》 選擇了第4個lin=2 --》 -n+5=3 --》 選擇了第3個lin=3 --》 -n+5=2 --》 選擇了第2個lin=4 --》 -n+5=1 --》 選擇了第1個lin=5 --》 -n+5=0 --》 沒有選擇任何元素

從上面的計算方法中,大家很清楚的知道是怎麼得來的,最後我們一起看看效果吧:

:nth-child(4n+1)這種方法是實現隔幾選一的效果,比如我們這裡是隔三選一,如果你把"4"換成別的數字那就是另外的一種隔法了,比如這個執行個體

.demo li:nth-child(4n+1) {background: lime;}

我們主要來看其計算出來的結果

n=0 --》4n+1=1 --》選擇了第一個lin=1 --》4n+1=5 --》選擇了第五個lin=2 --》4n+1=9 --》選擇了第九個li

效果如下

IE6-8和FF3-瀏覽器不支援":nth-child"選取器。

4、:nth-last-child()

":nth-last-child()"選取器和前面的":nth-child()"很相似,只是這裡多了一個last,所以他起的作用就和前面的":nth-child"不一樣了,他只要是從最後一個元素開始算,來選擇特定元素。我們來看幾個執行個體:

.demo li:nth-last-child(4) {background: lime;}

上面代碼錶示選擇倒數第四個清單項目,效果如下:

其中":nth-last-child(1)"和":last-child"所起作用是一樣的,都表示的是選擇最後一個元素。

另外":nth-last-child()"也可以像“:nth-child()”一樣,可以使用運算式來選擇特定元素,下面我們來看幾個特殊的運算式所起的作用

:nth-last-child(2n),這個表示的是從元素後面計算,選擇的是偶數個數,從而反過來說就是選擇元素的奇數,和前面的":nth-child(2n+1)",":nth-child(2n-1)",":nth-child(odd)"所起的作用是一樣的。如:

.demo li:nth-last-child(2n) {background: lime;}.demo li:nth-last-child(even) {background: lime;}等於.demo li:nth-child(2n+1) {background: lime;}.demo li:nth-child(2n-1) {background: lime;}.demo li:nth-child(odd) {background: lime;}

請看效果:

:nth-last-child(2n-1)這個選取器剛好跟上面的相反,從後面計算選擇的是奇數,而從前面計算選擇的就是偶數位了,這個前面的":nth-child(2n)"之類是相同的效果,如:

.demo li:nth-last-child(2n+1) {background: lime;}.demo li:nth-last-child(2n-1) {background: lime;}.demo li:nth-last-child(odd) {background: lime;}等於:.demo li:nth-child(2n) {background: lime;}.demo li:nth-child(even) {background: lime;}

效果如下

看了這幾個執行個體,大家都知道":nth-last-child()"和"nth-child()"使用方法是一樣的,只不過他們的區別是“:nth-child()”是從元素的第一個開始計算,而“:nth-last-child()”是從元素的最後一個開始計算,他們的計算方法都是一樣的。同樣在IE6-8和FF3.0-瀏覽器不支援“:nth-last-child()”選取器。

5、:nth-of-type

:nth-of-type類似於:nth-child,不同的是他只計算選取器中指定的那個元素,其實我們前面的執行個體都是指定了具體的元素,這個選取器主要對用來定位元素中包含了好多不同類型的元素是很有用處,比如說,我們div.demo下有好多p元素,li元素,img元素等,但我只需要選擇p元素,並讓他每隔一個p元素就有不同的樣式,那我們就可以簡單的寫成:

.demo p:nth-of-type(even) {background-color: lime;}

其實這種使用和:nth-child使用是一樣的,也可以使用:nth-child的那些運算式和使用方法,唯一不同的是這種指定了元素的類型而以。同樣在IE6-8和FF3.0-瀏覽器不支援這種選取器

6、:nth-last-of-type

這個選取器不用說大家都能想得到了,他和前面的:nth-last-child一樣使用,只是他指一了元素的類型而以。

同樣在IE6-8和FF3.0-瀏覽器不支援這種選取器

7、:first-of-type和:last-of-type

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

:nth-of-type,:nth-last-of-type;:first-of-type和:last-of-type實際意義並不是很大,我們前面講的:nth-child之類別選取器就能達到這此功能,不過大家要是感興趣還是可以瞭解一下,個人認為實用價值並不是很大。此類說法僅供參考。

8、:only-child和:only-of-type

":only-child"表示的是一個元素是它的父元素的唯一一個子項目。我們一起來看一個執行個體更好理解

 <div class="post">    <p>Lorem ipsum dolor sit amet, consectetur</p>    <p>Lorem ipsum dolor sit amet, consectetur</p> </div> <div class="post">    <p>Lorem ipsum dolor sit amet, consectetur</p> </div>    

css樣式

.demo .post p {background: lime;}

初步效果

如果我需要在div.post只有一個p元素的時候,改變這個p的樣式,那麼我們現在就可以使用:only-child,如:

.demo .post p {background: lime;}.demo .post p:only-child {background: red;}

此時只有div.post只有一個子項目p時,那麼他的背景色將會改變,:

:only-of-type是表示一個元素他有很多個子項目,而其中只有一個子項目是唯一的,那麼我們使用這種選擇方法就可以選擇中這個唯一的子項目,比如說

<div class="post">    <div>Lorem ipsum dolor sit amet, consectetur</div>    <p>Lorem ipsum dolor sit amet, consectetur</p>    <div>Lorem ipsum dolor sit amet, consectetur</div></div>

如果我們想只選擇中上面中的p元素,我們就可以這樣寫,

p:only-of-type{background-color:red;}

IE6-8瀏覽器不支援:only-child選取器;IE6-8和FF3.0-瀏覽器不支援:only-of-type選取器。

9、:empty

:empty是用來選擇沒有任何內容的元素,這裡沒有內容指的是一點內容都沒有,哪怕是一個空格,比如說,你有三個段落,其中一個段落什麼都沒有,完全是空的,你想這個p不顯示,那你就可這樣來寫:

p:empty {display: none;}

IE6-8瀏覽器不支援:empty選取器

三、否定選取器(:not)

否定選取器和jq中的:not選取器一模一樣,就拿form中的元素來說明這個選取器的用法,比如你想對form中所有input加邊框,但又不想submit也起變化,此時就可以使用:not為實現

input:not([type="submit"]) {border: 1px solid red;}

否定選取器 :not(),可以讓你定位不匹配該選取器的元素。IE6-8瀏覽器不支援:not()選取器

四、虛擬元素

CSS中的虛擬元素大家以前看過::first-line,:first-letter,:before,:after;那麼在CSS3中,他對虛擬元素進行了一定的調整,在以前的基礎上增加了一個“:”也就是現在變成了“::first-letter,::first-line,::before,::after”另外他還增加了一個“::selection”,兩個“::”和一個“:”css3中主要用來區分偽類和虛擬元素,到目前來說,這兩種方式都是被接受的,也就是說不管使用哪種寫法所起的作用都是一樣的,只是一個書寫格式不同而以。

那麼我們簡單瞭解一下他們的作用

::first-line選擇元素的第一行,比如說改變每個段落的第一行文本的樣式,我們就可以使用這個

p::first-line {font-weight:bold;}

::first-letter選擇文字區塊的第一個字母,除非在同一行裡麵包含一些其它元素,不過這個主要運用於段落排版上多,比如說首字下沉,

p::first-letter {font-size: 56px;float:left;margin-right:3px;}

::before和::after這兩個主要用來給元素的前面或後面插入內容,這兩個常用"content"配合使用,見過最多的就是清除浮動,

.clearfix:before,.clearfix:after {    content: ".";    display: block;    height: 0;    visibility: hidden;}.clearfix:after {clear: both;}.clearfix {zoom: 1;}

當然可以利用他們製作出其他更好的效果,比如本站首面的那個三角紙張效果,也是通過這個來實現的。

 

那麼有關於CSS3的選取器到這裡就全部介紹完了,如果你對這個東西感興趣,你可以點擊這裡瞭解更多的知識。如果你全部看完了這三章關於CSS3選取器的文章你很快能發現,其實有很多選取器和jquery中的選取器是很相似的,新的東西並不多,個人認為最實用的就是:nth-child這些,在特定的環境中所起的作用還是蠻大的,如果你是一位前端的大膽嘗試者,你可以嘗試這些新的選取器使用方法,這可以讓你省去不少的標籤,如果你認為還不實用在項目中,但讓你學習還是蠻不錯的。哈。。。。

 

感謝W3CPLUS提供精彩原文。

歡迎大家加入互連網技術交流群:62329335 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.