偽類選擇器之E:first-child系列和E:first-of-type系列


剛開始學習選擇器,一開始對偽類選擇器確實有點懵。昨天晚上自己動手寫了寫,終于是慢慢搞懂了。下面對一些容易誤解的一些知識點做個總結,便于以后復習和查閱。


一.E:first-child

  • 我們先來看看:first-child,一開始我就對這個偽類選擇器誤解了,以為只是選擇某個元素的第一個子元素。舉個例子:
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>偽類選擇器</title>
<style>
p:first-child{
  color: yellow;
}
li:first-child{
  background: #ccc;
}
span:first-child{
  color: red;
}
</style>
</head>
<body>
  <div>
    <h3> <em>My</em> <span>goal</span></h3>
    <p>Next stage</p>
    <ol>
      <li>Learn the front knowledge.</li>
      <li>Find a satisfactory internship.</li>
      <li>Find a <span>good job</span> when graduating.</li>
    </ol>
    <p>Come on!</p>
  </div>
</body>
</html>

我們可以事先想一下結果會是什么。
先分析一下。在上面的例子中作為某個父元素的第一個子元素的有:第一個h3、第一個em、第一個span、第一個p、第一個li。
再來看看第一個樣式,p:first-child{color: yellow;},它的意思不是說要把p元素的第一個元素變成黃色,而是說把作為某個元素第一個子元素的所有p元素設置為黃色。也就是說它必須要滿足兩個條件:第一,必須為p標簽;第二,必須要為某個父元素的第一個子元素。按照這么說來,例子中沒有符合條件的p標簽。
然后再來看看第二個樣式,li:first-child{background: #ccc;},將作為某個元素(ol或者ul)的第一個子元素li設置背景色為灰色,顯而易見,有符合條件的li元素,那就是<li>Learn the front knowledge.</li>
最后再來看看第三個樣式,span:first-child{color: red;},它就是說把作為某個元素第一個子元素是span的元素顏色變為紅色。從上面的例子來看,span有兩次出現。第一次是作為h3的第二個子元素,所以不滿足要求。再來看看第二個span,它是作為li的第一個子元素,滿足了兩個條件,所以肯定會變成紅色。
結果和預想的完全吻合:

first-child

  • 為了加深理解咱們再來舉兩例:
  • 例1:
<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title>first-child</title>
<style>
.fruit p:first-child{
 color: red;
}
.fruit > p:first-child{
 text-align: center;
}
</style>
</head>
<body>
<div class="fruit">
  <p>There are many fruit.For example:</p>
    <ul>
      <li>grape</li>
      <li>banana</li>
      <li>watermelon <p>and so on.</p></li>
    </ul>
  <p>Which is your favorite?</p>
</div>
</body>
</html>

上面的代碼中寫了兩個樣式,其中會牽扯到組合選擇器。我們先來看看第一個,.fruit p:first-child{color: red;}。這是一個后代選擇器,這在我的另一篇博客:CSS選擇器當中做過說明。它用來匹配.fruit的所有后代(不只是子元素、還包括子元素向下遞歸),而在這里后代的要求為:必須是p元素且必須為某個元素的第一個子元素。這樣說來滿足要求的就是:
<p>There are many fruit.For example:</p><p>and so on.</p>,所以結果是把它們渲染為紅色。再來看看第二個樣式,.fruit > p:first-child{text-align: center;}。這是一個直接子元素選擇器,它用來匹配.fruit的直接子元素(不包括向下遞歸的元素,而是同一層級的第一層子元素。),而直接子元素的要求為:必須是p元素且必須為某個元素的第一個子元素。這樣說來滿足要求的就是:<p>There are many fruit.For example:</p>
再來看看結果,和預想的完全一樣。

后代選擇器和:first-chlid組合使用

  • 例2:
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>first-child</title>
<style>
p:first-child span{
  font-weight: bold;
}
</style>
</head>
<body>
 <div class="hello">
   <p><em>Hello</em>,my name is <span>cao tingting</span>.I'm a <span>new-comer</span> here and relly <span>appreciate</span> your advice.</p>
 </div>
</body>
</html>

例2中只有一個樣式,它表示什么意思呢?p:first-child span,首先找到某個元素第一個子元素是p的標簽,再來找到p里面所有的<span>。那么顯而易見,在這個例子中就是<span>cao tingting</span><span>new-comer</span>以及<span>new-comer</span>,將他們設置粗體。

效果

總結:E:first-child要滿足兩個條件。第一:必須是E元素;第二:必須要是某元素的第一個子元素。

二.E:first-of-type

這個偽類選擇器的含義就是匹配父元素下使用同種標簽的第一個子元素(等同于:nth-of-type(1)),它和E:first-child不一樣。它主要強調同種類的標簽中的第一個而不管這類標簽是否是第一個出現。也就是說先找出所有的E元素再找到第一個。下面來舉個例子進行說明,我們就用第一個例子來說明,以便進行對比。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>偽類選擇器</title>
<style>
p:first-child{
  background: #ccc;
}
p:first-of-type{
   color: red;
}
</style>
</head>
<body>
  <div>
    <h3><em>My</em> <span>goal</span></h3>
    <p>Next stage</p>
    <ol>
      <li>Learn the front knowledge.</li>
      <li>Find a satisfactory internship.</li>
      <li>Find a <span>good job</span> when graduating.</li>
    </ol>
    <p>Come on!</p>
  </div>
</body>
</html>

前面已經分析過為什么p:first-child會沒有效果,咱們再來看看p:first-of-type,首先找出所有的p元素,再來看看第一個是誰,這里面就是<p>Next stage</p>,所以它渲染為紅色。

效果對比圖

總結:E:first-of-type強調的是以元素種類劃分,即先找到所有的E元素,再來找到第一個。

三.以此類推的E:nth-child(n)和E:nth-of-type(n)等等

關于n的取值,它可以為: 1,2,3,4,5; 2n+1, 2n, 4n-1; odd, even。

  • nth-child(n)
    它表示匹配其父元素的第n個子元素,第一個編號為1。如果第n個子元素為E,則被選中。它其實和E:first-child是一個原理,都要滿足上面提到的兩個條件。
    與E:first-child原理相同的還有:
    E:nth-last-child(n),表示匹配其父元素的倒數第n個子元素,第一個編號為1;
    E:last-child,表示匹配父元素的最后一個子元素,等同于:nth-last-child(1);

  • E:nth-of-type(n)
    它表示匹配同一種類標簽的第n個子元素。它的原理和E:first-of-type一樣。
    與E:first-of-type原理相同的還有:
    E:nth-last-of-type(n),表示匹配作為某個元素子元素E(只計算使用同種標簽的元素)的倒數第n個元素。
    E:first-of-type:匹配父元素下使用同種標簽的第一個子元素,等同于:nth-of-type(1)
    E:last-of-type:匹配父元素下使用同種標簽的最后一個子元素,等同于:nth-last-of-type(1)
    為了看的更明顯,再來舉個例子吧。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>對比</title>
<style>
span:nth-child(2n){
  background: yellow;
}
span:nth-of-type(2n){
  color: red;
}
</style>
</head>
<body>
 <div class="box">
   <div class="content">
     <h3>標題</h3>
       <span>內容1</span>
       <span>內容2</span>
     <p>這是一個<span>很長</span>的<span>段落。</span></p>
   </div>
       <ol>
         <li>列表<span>內容</span></li>
         <li>列表內容</li>
         <li>列表內容</li>
       </ol>
 </div>
</body>
</html>

結果也是可以預料的。


結果對比

到此為止應該對這一塊都很清楚了吧。


再來補充幾點用法

四.感知子元素的個數

.list li:nth-last-child(n+4) ~ li,
.list li:nth-last-child(n+4):first-child {
  color: red
}

:nth-last-child(n+4)這一個選擇器的意思就是倒數第四個以及之前的元素,后面加了~ li,就是表示符合前面條件的元素之后的li元素。
如果總數不夠四個,就不會選擇任何元素。
但是如果只用~ li,是不會匹配到第一個li的,所以又加上了li:nth-last-child(n+4):first-child
實現了根據元素個數的多少來應用不同的樣式。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容