CSS3 nth 偽類選擇器

考察下面的 HTML 代碼片段:

<div><section>section 1</section><section>section 2</section><ul><li>item 1</li><li><ul><li>sub item 1</li><li>sub item 2</li><li>sub item 3</li></ul></li><li>item 3</li><li>item 4</li><li>item 5</li><li>item 6</li><li>item 7</li><li>item 8</li><li>item 9</li></ul><section>section 3</section><section>section 4</section><section>section 5</section>
</div>

單憑 section 可以讓我們選中所有的<section> 標簽,what if we wanna specific ones? 譬如只選中第一個。

那你可能已經知道:first-child偽類選擇器了,所以選中第一個也不是什么麻煩事情。類似地可以用:last-child選中最后一個指定的元素。

section:first-child,section:last-child {color: red;
}

here comes out the result:
css :fist-child & :last-child 選擇器

當場景再復雜一些的時候,譬如選中第2個,第3個,第基數個,很自然地,我們會想到引入一個變量來完成任務。

nth 系列榮譽登場

CSS3中的 nth 系列選擇器便是這樣一種支持變量計算的選擇器,可以完成上述復雜的選擇需求。

譬如高亮前面示例 HTML 片段中第基數個 sectionli 標簽可以這樣做:

section:nth-child(2n+1),li:nth-child(2n+1){color:red;
}

and here comes out the result again:

使用 :nth-child 高亮第基數個元素

:nth-child完整的語法為:nth-child(an+b),它匹配父容器下面中第an+b個子元素。例如:nth-child(3n+1)將會選中位置位于第1(3*0+1),4(3*1+1),7(3*2+1)...的元素。

:nth-child這樣厲害的選擇器還有3個!它們分別是:

  • :nth-last-child(an+b) 原理同:nth-child,只不過方向相反,從滿足條件的兄弟子節點后面開始計數
  • :nth-of-type(an+b) 匹配第 an+b 個相同標簽的元素
  • :nth-last-of-type(an+b)nth-of-type ,只不過方向相反,從最后開始計數。

借助于這樣靈活的選擇器,在編寫樣式時使我們更加得心應手,甚至有了很多花樣玩法。

:nth-child

:nth-child(an+b) 會匹配所有兄弟節點中位置位于an+b位置的元素。 其中 n 是從0開始的正整數。

除了像前面所說的可以通過完整的表達式匹配到連續規律位置的元素外,如果我們將 a 設為0的話,就可以匹配指定的單個元素。

譬如考察下面的 HTML 片段:

<div><p>foo</p><p>bar</p><p>baz</p>
</div>

高亮第二個元素:

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

利用:nth-child 選中第2個元素

同理,:nth-child(3) 會選中第三個元素。

這個示例中,也可以用:nth-last-child:

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

效果當然是一樣的,因為:nth-last-child(2)從后面開始數第二個,正好與順位數第二個是同一元素。

:nth-of-type

:nth-of-type(an+b)用法上沒有區別,但它只會匹配相同標簽的兄弟元素。也就是在:nth-child的基礎上加了一條限制:標簽要一致。

還是考察剛剛的 HTML 片段,我們要選中第二個<p> 標簽,仍然是指定位置為2即可:

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

但情況變一下,我們在第2個<p>標簽前面加上另外一個元素譬如<section>,考察更新后的 HTML 片段:

<div><p>foo</p><section>quz</section><p>bar</p><p>baz</p>
</div>

此時我們仍然想要選中第2個<p>標簽。

p:nth-child(2){color: red;/*會匹配失敗,因為第二個子元素不是 p 標簽*/
}
p:nth-of-type(2){color: red;/*仍然匹配成功*/
}

此時用:nth-child(2)不會選中任何元素,因為它的意思是選中div下面子元素中的第2個元素,并且這個元素是一個<p> 標簽。而上面 HTML 片段中,第二個子元素明顯不是<p>標簽,所以匹配失敗。

而通過:nth-of-type(2)來選擇則仍然生效。因為不管第2個<p>元素前面插幾個<section>標簽,此時內容為bar<p>標簽仍然是父容器所有子節點中順位第二個類型為<p>的標簽。

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

通過前面的示例可以看出,:nth-of-type在你始終需要選擇第 N 個特定類型的元素時更為可靠,它首先會提取出所限定的元素類型,然后再從這個沒有雜質的集合中去匹配順序。

因此:nth-of-type在大多數時候可能更滿足你的需要,畢竟很多時候需求是選中第3個<span>,第5個<p>。而不是第7個元素,無論是什么類型的節點。

這里有一個頁面:nth Tester可以方便地把玩 nth 系列的四大金鋼。通過可視化操作應該能夠更好地理解。

擴展的花樣玩法

前面說道,表達式an+b可以將 a 取值為0,這樣就可以選中第 b 個元素。如果將 a 取值為1的話,我們就可以選中從第 b 個元素開始的所有元素。

譬如選中從第三個元素開始的所有<p>標簽:

<div><p>1</p><p>2</p><p>3</p><p>4</p><p>5</p>
</div>
p:nth-child(n+3){color: red;
}

選中從第3個元素后的所有p標簽

雖然 n 是從0開始的正整數,但 a 其實可以取負值的。當我們將 a 取值為-1的時候,可以達到只選取前 b 個元素的目的。

示例:選中前3個元素

<div><p>1</p><p>2</p><p>3</p><p>4</p><p>5</p>
</div>
p:nth-child(-n+3){color: red;
}

選取前3個元素

另外,選取基數和偶數元素時,可以通過指定值為oddeven來完成,這和2n+12n效果是一樣的。

css 選偶數元素 p:nth-child(2n){ color: red; } /*或者*/ p:nth-child(even){ color: red; }

css 選基數元素 p:nth-child(2n+1){ color: red; } /*或者*/ p:nth-child(odd){ color: red; }

https://css-tricks.com/useful-nth-child-recipies/

需要注意的地方

與 class 的搭配

博主在使用過程中剛好遇到一個問題,可以拿出來分享一下。
那就是 nth 系列對元素的類名是不生效的,也就是說它只對標簽名起作用,如果你使用時指定為 class 名則不會生效。

譬如考察下面的 HTML 片段與 CSS:

<div><p>1</p><p class="foo">2</p><p class="foo">3</p><p class="foo">4</p><p class="foo">5</p>
</div>
/*從帶 class 為'foo'的 p 標簽中選取第2個將字體設為紅色*/
p.foo:nth-of-type(2){color: red;
}
/*從帶 class 為'foo'的 p 標簽中選取第3個將字體設為綠色*/
p.foo:nth-child(3){color: green;
}

上述 CSS 中,我們只希望對帶 class 且值為foo<p>標簽進行操作,于是使用了類選擇器進行限制,但最終結果其實是這樣的:

8.jpg

我們預期值為3的應該為紅色,因為它是帶 class 且值為foo這種類型里面的第二個,但其實值為2的 <p>標簽被選中了。因為第一個不帶 class 的 <p> 標簽其實也參與了進來,證明 class 選擇器其實沒有生效,并沒有起到限制的作用。

對于:nth-child同理。

推而廣之,其實對于其他嵌套 CSS 語法組合(arbitrary selector),譬如屬性選擇[type=text]:nth-child:nth-of-type 都是會忽略的。

對于:nth-child,納入考量的永遠是同屬同一個父容器下同一級所有的兄弟元素。而對于:nth-of-type來說,則是同一父容器下,同一級所有兄弟元素中標簽類型相同的元素。

與 querySelector 的搭配

既然是偽類選擇器,所以就無法使用 querySelector 來進行選擇。我想你已經讀出另外一層意思,即所有偽類選擇器在 querySelector 中都不起作用,而不只是 nth 系列。原因見W3C Spec。

瀏覽器兼容性

:nth-child 為例,nth 系列的瀏覽器支持情況還是蠻理想的。可以放心使用。

來自 MDN 關于 nth-child 的瀏覽器兼容性表格

更多資料

  • MDN :nth-child doc
  • MDN :nth-of-type doc
  • :nth Tester
  • The Difference Between :nth-child and :nth-of-type
  • Useful :nth-child Recipes
  • nth-child doesn't respond to class
  • Can I combine :nth-child() or :nth-of-type() with an arbitrary selector

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284208.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284208.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284208.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RedisCluster的安裝、部署、擴容和 Java客戶端調用

Redis下載 官網地址&#xff1a;http://redis.io/ 中文官網地址&#xff1a;http://www.redis.cn/ 下載地址&#xff1a;http://download.redis.io/releases/ 安裝 # &#xff08;三臺&#xff09;安裝 C 語言需要的 GCC 環境 yum install -y gcc-c yum install -y wget # 下…

【CloudCompare教程】001:CloudCompare中文版下載與安裝圖文教程

CloudCompare是一款功能強大的點云后處理軟件,本文講解CloudCompare中文版下載與安裝方法。 文章目錄 一、CloudCompare下載地址二、CloudCompare安裝教程三、CloudCompare中文設置一、CloudCompare下載地址 官方下載地址:http://www.danielgm.net/cc/release/ 二、CloudComp…

ML.NET相關資源整理

在人工智能領域&#xff0c;無論是機器學習&#xff0c;還是深度學習等&#xff0c;Python編程語言都是絕對的主流&#xff0c;盡管底層都是C實現的&#xff0c;似乎人工智能和C#/F#編程語言沒什么關系。在人工智能的工程實現&#xff0c;通常都是將Python訓練好的人工智能模型…

帶參數的宏替換

帶參數的宏替換因各種需求疊加&#xff0c;替換規則很怪異&#xff1a; 1、首先將實參替換形參&#xff0c;并展開宏 2、如果1步展開后&#xff0c;有#或者##&#xff0c;那么停止替換。 3、如果1步展開后&#xff0c;沒有#或者##&#xff0c;且參數也是宏&#xff0c;那么繼續…

JAVA學習日志(7-1-繼承)

為什么80%的碼農都做不了架構師&#xff1f;>>> 繼承 1.提高代碼復用性 2.讓類與類之間產生關系&#xff0c;有了這個關系才有了多態的特性 **不要為了獲取其他類的功能&#xff0c;簡化代碼而繼承&#xff0c; 必須是類與類之間有所屬關系才可以繼承&#xff0c;所…

BZOJ 1370: [Baltic2003]Gang團伙 [并查集 拆點 | 種類并查集WA]

題意&#xff1a; 朋友的朋友是朋友&#xff0c;敵人的敵人是朋友&#xff1b;朋友形成團伙&#xff0c;求最多有多少團伙 種類并查集WA了一節課&#xff0c;原因是&#xff0c;只有那兩種關系才成立&#xff0c;諸如朋友的敵人是朋友之類的都不成立&#xff01; 所以拆點做吧 …

常見Lidar點云數據處理及可視化軟件匯總

常見的點云處理及可視化軟件有&#xff1a; CloudCompare、Globalmapper、Pix4d、ArcGIS&#xff08;Pro&#xff09;、Lidar 360、PCL等等。 文章目錄1. CloudCompare2. Globalmapper3. Pix4d4. ArcGIS&#xff08;Pro&#xff09;5. Lidar 3606. PCL1. CloudCompare CloudCo…

Spring 自帶工具類匯總

斷言 斷言是一個邏輯判斷&#xff0c;用于檢查不應該發生的情況 Assert 關鍵字在 JDK1.4 中引入&#xff0c;可通過 JVM 參數-enableassertions開啟 SpringBoot 中提供了 Assert 斷言工具類&#xff0c;通常用于數據合法性檢查 // 要求參數 object 必須為非空&#xff08;Not…

解決new Thread().Start導致高并發CPU 100%的問題

背景之前接手一個項目的時候&#xff0c;發現到處是new Thread(()>{ //do something }).Start();這么做的目的&#xff0c;無非是為了減少頁面等待時間提高用戶體驗&#xff0c;把一些浪費時間的操作放到新線程中在后臺運行。問題但是這樣帶來的問題是大量的創建線程&#x…

基于 HTML5 Canvas 繪制的電信網絡拓撲圖

電信網結構&#xff08;telecommunication network structure&#xff09;是指電信網各種網路單元按技術要求和經濟原則進行組合配置的組合邏輯和配置形式。組合邏輯描述網路功能的體系結構&#xff0c;配置形式描述網路單元的鄰接關系&#xff0c;即以交換中心&#xff08;或節…

網絡相關配置,SSH服務,bash, 元字符

作業一&#xff1a;臨時配置網絡&#xff08;ip&#xff0c;網關&#xff0c;dns&#xff09;永久配置 設置IP和掩碼ifconfig eth0 192.168.2.2 netmask 255.255.255.0設置網關route add default gw 192.168.2.10[rootbogon ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0…

【GlobalMapper精品教程】021:利用控制點校正柵格圖像

本文講解GlobalMapper中利用控制點校正柵格圖像的方法,數據為配套實驗數據包中的data021.rar。 文章目錄 一、結果預覽二、校正過程【推薦閱讀】:ArcGIS實驗教程——實驗二:ArcGIS地理配準完整操作步驟 一、結果預覽 二、校正過程 (1)打開圖像。選擇實驗包中的待校正的柵…

[筆記]提升R的性能和突破內存限制的技巧

本文為雪晴數據網《R語言大規模數據分析實戰》 http://www.xueqing.tv/course/56 的課程學習筆記。 該課程目前更新到“第2章 Microsoft R Server簡介”的微軟數據科學家介紹MRS&#xff0c;后續教學主要是關于MRS的內容&#xff0c;再另外學習&#xff0c;所以本文只學習“第1…

WTM:ASP.NET Core快速開發利器!

不少程序員朋友應該都有這個想法&#xff0c;接接私活&#xff0c;賺賺外快&#xff0c;但是從零開發一套系統并不容易&#xff0c;今天給大家推薦一款開箱即用的通用后臺管理系統。一個能夠讓程序猿快速開發的炒雞腳手架&#xff0c;采用.NET Core開源框架&#xff01;github地…

【CloudCompare教程】002:點云繪制模式詳解

文章目錄 1. 按高程著色2. 按索引著色3. 按漸變著色1. 按高程著色 在內容列表中選中點云圖層,點擊【編輯】→【標量領域】→【將坐標導出到SF】。 勾選Z,點擊OK。 高程著色效果: 2. 按索引著色 點擊【編輯】→【標量領域】→【添加點指數為SF】。 索引著色效果:

《首席產品官》成海清 著 圖書目錄 思維導圖

原文檔地址&#xff1a;《首席產品官》成海清

「每天一道面試題」如何理解方法的重載與覆蓋?

方法重載在同一個Java 類中&#xff08;包含父類&#xff09;&#xff0c;如果出現了方法名稱相同&#xff0c;而參數列表不同的情況就叫做重載。方法的重載的規則&#xff1a;&#xff08;1&#xff09;&#xff1a;方法名稱必須相同&#xff08;2&#xff09;&#xff1a;參數…

day63-webservice 01.cxf介紹

CXF功能就比較強了。CXF支持soap1.2。CXF和Spring整合的非常密切。它的配置文件基本就是Spring的配置文件了。CXF是要部署在服務器才能用的。CXF得放到Web容器里面去發布。CXF就可以整合咱們的Web容器。 cxf-2.4.0解壓出來之后 apache-cxf-2.4.2是核心包,apache-cxf-2.4.4-src是…

Java中的static關鍵字解析

static關鍵字是很多朋友在編寫代碼和閱讀代碼時碰到的比較難以理解的一個關鍵字&#xff0c;也是各大公司的面試官喜歡在面試時問到的知識點之一。下面就先講述一下static關鍵字的用法和平常容易誤解的地方&#xff0c;最后列舉了一些面試筆試中常見的關于static的考題。以下是…