nth-child和nth-of-type的區別

在使用nth-child和nth-of-type的時候,你會不會搞混呢?我們來簡單的看下他們怎么使用,以及對應的差異。

先看用法

得先知道用法,才能去比較他們的差異。

nth-child

先來看看nth-child的用法。

  • 選擇第五個元素
image
li:nth-child(5) {
    color: green;   
}

要選擇第一個元素,可以使用:first-child,其實我打賭你也可以修改上面的元素來實現這一點。

  • 選擇除前五個之外的所有
img
li:nth-child(n+6) {
    color: green;   
}

如果這里有超過10個元素,它將選擇5個后面的所有元素。

  • 選擇前五個元素
img
li:nth-child(-n+5) {
    color: green;   
}
  • 每四個一組,選擇第一個
img
li:nth-child(4n-7) {  /* 或者 4n+1 */
    color: green;   
}
  • 選擇奇數或者偶數

    • 奇數

      img
      li:nth-child(odd) {
          color: green;   
      }
      
    • 偶數

      ?
      img
      li:nth-child(even) {
          color: green;   
      }
      
  • 選擇最后一個元素
img
li:last-child {
    color: green;
}

這里顯示第十個,因為我們這里只有十個元素。如果有八個元素,那么小綠球就是第八個。...

  • 選擇倒數第二個元素
img
li:nth-last-child(2) {
    color: green;
}

選擇第9個因為我們這里有10個元素,但是如果有30個元素則會選擇第29個元素。

動手試試?

來在線嘗試

nth-of-type

:nth-of-type允許根據公式根據源順序選擇一個或多個元素。在CSS選擇器第3級規范中,它被定義為“結構偽類”,這意味著它用于根據與父元素和兄弟元素的關系對內容進行樣式化。

假設我們有一個無序列表,并希望“斑馬條紋”交替列表項:

<ul>
  <li>First Item</li>
  <li>Second Item</li>
  <li>Third Item</li>
  <li>Fourth Item</li>
  <li>Fifth Item</li>
</ul>

不用為每個列表都添加類(.even & .odd也不用),我們可以使用:nth-of-type

li {
  background: slategrey;
}
/* 從第二個項開始選擇交替項 */
li:nth-of-type(2n) {
  background: lightslategrey;
}

如你所見,:nth-of-type接受一個參數:這個參數可以是單個整數、關鍵字evenodd,也可以是如上所示的公式。如果指定一個整數,則只選擇一個元素——但如果是關鍵字或公式將遍歷 父元素的所有子元素 并選擇匹配的元素——類似于在JavaScript中導航數組中的項。關鍵詞evenodd很直截了當,但公式是使用語法a + b構造的,其中:

  • "a"是一個整數
  • "n"是一個字母
  • "+"是一個運算符,可能是+-
  • "b"是一個整數,如果公式中包含運算符,則需要使用"b"

需要注意的是,這個公式是一個方程,遍歷每個同級元素,確定要選擇哪個。如果包含公式的"n"“部分,則表示一組遞增的正整數(就像遍歷數組一樣)。在上面的例子中,我們用公式2n來選擇每第二個元素,這是可行的,因為每次選中一個元素,"n"就會增加1(2×0,2×1,2×2,2×3,等等)。如果一個元素的順序與方程的結果匹配,那么它將被選中(2,4,6,等等)。要更深入地解釋所涉及的數學,請閱讀本文

為了進一步說明,這里有一些不錯的:nth-of-type選擇器的例子:

感興趣的點(需要記住哦)

  • :nth-of-type從源順序的頂部開始遍歷元素。它與:nth-last-of-type之間的唯一區別是后者迭代從源順序底部開始的元素。
  • :nth-of-type選擇器非常類似于:nth-child但有一個 關鍵區別 :它更具體。在上面的例子中,它們會產生相同的結果,因為我們只遍歷li元素,但是如果我們遍歷更復雜的兄弟姐妹組,:nth-child會嘗試匹配所有的兄弟姐妹,而不僅僅是相同元素類型的兄弟姐妹。這就說明了:nth-of-type的強大功能,它針對的是與類似的兄弟姐妹(而不是所有的兄弟姐妹)的關系順序中的特定類型的元素。

相關的屬性

其他的資源

來看看區別

假設有那么一個HTML:

<section>
   <p>Little</p>
   <p>Piggy</p>    <!-- Want this one -->
</section>

我們來做一些完全相同的事情:

p:nth-child(2) { color: red; }
p:nth-of-type(2) { color: red; }

你看到的是相同,但是他們當然有一點不同。

我們的 :nth-child 選擇器,在"Plain English"中表示在以下情況下選擇一個元素:

  • 這是一個段落元素
  • 這是父級的第二個child

我們的 :nth-of-type 選擇器,在"Plain English"中表示:

  • 選擇父元素的第二段子元素

:nth-of-type是……怎么說才好呢?更少的條件。

假設我們改成下面這樣:

<section>
   <h1>Words</h1>
   <p>Little</p>
   <p>Piggy</p>    <!-- 想要匹配這個 -->
</section>

這就破壞了:

p:nth-child(2) { color: red; } /* 現在就不對了 */

但是下面這個這仍然有效:

p:nth-of-type(2) { color: red; } /* 仍然可以 */

至于上面的"破壞",我的意思是:上面的:nth-child選擇器現在選擇的是單詞"Little"而不是"Piggy",因為該元素滿足了條件:1: 它是第二個孩子,2: 它是一個段落元素。至于上面說的"仍然可以",就是說"Piggy"還是被選中的,因為他是該父元素下的第二個段落(p)。

如果想在h1后面添加h2:nth-child選擇器不會選擇任何東西,因為現在第二個子節點不再是一個段落,所以選擇器什么也找不到。:nth-of-type可以繼續工作。

我認為:nth-of-type一般更健壯,也更有用,盡管:nth-child更常見。

瀏覽器對于:nth-of-type也挺不錯,Firefox 3.5+, Opera 9.5+, Chrome 2+, Safari 3.1+, IE 9+。

不要忘記其他的方法::first-of-type:last-of-type:nth-last-of-type:only-of-type。在這里了解更多

相關參考

本文原文: nth-child和nth-of-type的用法及區別

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

推薦閱讀更多精彩內容