衆所周知,在CSS3規範中,添加了許多了僞類選擇器,這些選擇器代替了很多JS的工做,讓咱們從之前經過獲取DOM節點進而進行樣式修改的操做,變得更加便捷高效。 然而我在近期開發使用的過程當中,遇到了很多坑,事實證實認真閱讀文檔仍是頗有必要的,因此這裏總結分享幾個我遇到的問題,經過一個需求對幾對選擇器作解析,但願對你們也有所幫助。html
需求: 尋找頁面上某類名的首個或最後一個元素。bash
CSS3手冊中描述:學習
- :first-child:選擇屬於其父元素的首個子元素的每一個子元素
- :last-child:選擇屬於其父元素的最後一個子元素的每一個子元素
這個描述難免讓人看起有些雲裏霧裏,因此咱們直接來看個例子:spa
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
p:first-child {
border: 1px solid red;
}
p:last-child {
border: 1px solid blue;
}
</style>
</head>
<body>
<div>
<p>這是第一個段落。</p>
<p>這是第二個段落。</p>
<p>這是第三個段落。</p>
</div>
<div>
<p>這是第一個段落。</p>
<p>這是第二個段落。</p>
<p>這是第三個段落。</p>
</div>
</body>
</html>
複製代碼
結果:3d
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
.p:first-child {
border: 1px solid red;
}
.p:last-child {
border: 1px solid blue;
}
</style>
</head>
<body>
<div>
<p class="p">這是第一個段落。</p>
<p class="p">這是第二個段落。</p>
<p class="p">這是第三個段落。</p>
</div>
<div>
<p>這是一個干擾段落。</p>
<p class="p">這是第一個段落。</p>
<p class="p">這是第二個段落。</p>
<p class="p">這是第三個段落。</p>
<p>這是一個干擾段落。</p>
</div>
</body>
</html>
複製代碼
結果:code
有了對上面兩個選擇器的進一步認知後,再來看看這一對。cdn
CSS3手冊中描述:htm
- :first-of-type:選擇屬於其父元素的首個指定類型子元素的每一個子元素
- :last-of-type:選擇屬於其父元素的最後一個指定類型子元素的每一個子元素
來看個例子:blog
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
p:first-of-type {
border: 1px solid red;
}
p:last-of-type {
border: 1px solid blue;
}
</style>
</head>
<body>
<div>
<p>這是第一個段落。</p>
<p>這是第二個段落。</p>
<p>這是第三個段落。</p>
</div>
<div>
<p>這是第一個段落。</p>
<p>這是第二個段落。</p>
<p>這是第三個段落。</p>
</div>
</body>
</html>
複製代碼
結果:開發
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
.p:first-of-type {
border: 1px solid red;
}
.p:last-of-type {
border: 1px solid blue;
}
</style>
</head>
<body>
<div>
<div>這是一個干擾段落。</div>
<p class="p">這是第一個段落。</p>
<p class="p">這是第二個段落。</p>
<p class="p">這是第三個段落。</p>
<div>這是一個干擾段落。</div>
</div>
<div>
<p>這是一個干擾段落。</p>
<p class="p">這是第一個段落。</p>
<p class="p">這是第二個段落。</p>
<p class="p">這是第三個段落。</p>
<p>這是一個干擾段落。</p>
</div>
</body>
</html>
複製代碼
結果:
標籤類型
的元素標籤
中首個或最後一個子元素時,方可被選中CSS3手冊中描述:
- :nth-child(n):選擇屬於其父元素的第n個子元素,不論元素的類型
- :nth-last-child(n):選擇屬於其父元素的倒數第n個子元素,不論元素的類型
經過描述其實咱們也不難看出,當n爲1的時候,其實現的結果和咱們第一組介紹的:first-child / :last-child同樣,因此簡單將n設爲1對咱們解決咱們的需求並無什麼幫助,那你確定要問,爲何還要介紹這一對選擇器。 實際上經過上面兩組選擇器,咱們也發現了,當咱們的應用場景是一個存在多個相同標籤類型子元素的容器下,選擇其中某一類名的首個或最後一個元素是十分困難的事情,但假若咱們知道在想要的類先後有多少個相同標籤的元素,咱們能夠採用一種委曲求全的方法,來看下面這個例子。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
.p:nth-child(2) {
border: 1px solid red;
}
.p:nth-last-child(2) {
border: 1px solid blue;
}
</style>
</head>
<body>
<div>
<p>這是一個干擾段落。</p>
<p class="p">這是第一個段落。</p>
<p class="p">這是第二個段落。</p>
<p class="p">這是第三個段落。</p>
<p>這是一個干擾段落。</p>
</div>
</body>
</html>
複製代碼
結果:
最後咱們來總結一下,在解決這個需求的時候,其實咱們遇到了幾種不一樣的場景,針對不一樣的場景,咱們須要使用不一樣的選擇器。
從上,咱們也看出還有一種場景,也就是,當父元素下除了指定類型(某一類名)外,還有其餘同類標籤元素,其餘標籤個數未知的狀況,這種場景,我目前想不到用CSS找到他的好辦法,歡迎你們補充。
雖然這只是CSS3中很小的一部分,可是學習知識不只要追求廣度,也要追求深度,與你們共勉。