CSS 選擇器指南:first-child、last-child、nth-child() 與 nth-of-type() 的區別
更新日期: 2024 年 10 月 21 日
在撰寫 CSS 時,經常需要針對某些特定的元素進行樣式設置,特別是根據元素在其父級中的位置或類型。
CSS 提供了幾個強大的 Pseudo-classes(偽類)來幫助你選擇這些元素,其中最常見的就是 :first-child
、:last-child
、:nth-child()
和 :nth-of-type()
。
雖然這些選擇器看似相似,但它們的應用場景和行為存在重要差異。
本文將詳細介紹這些選擇器,幫助新手理解它們的不同之處,以及如何在實際開發中正確使用它們。
什麼是 :first-child
和 :last-child
?
:first-child
:first-child
用於選擇父級元素中的第一個子元素,無論該子元素是什麼類型。
語法:
父元素:first-child {
/* 樣式規則 */
}
範例:
p:first-child {
color: blue;
}
HTML:
<div>
<p>第一段文字</p>
<p>第二段文字</p>
</div>
在這裡,第一個段落 p
會被選中並變成藍色。
:last-child
:last-child
用於選擇父級元素中的最後一個子元素,同樣不區分元素的類型。
語法:
父元素:last-child {
/* 樣式規則 */
}
範例:
p:last-child {
color: red;
}
HTML:
<div>
<p>第一段文字</p>
<p>最後一段文字</p>
</div>
在這裡,最後一個段落 p
會被選中並變成紅色。
什麼是 :nth-child()
和 :nth-of-type()
?
:nth-child()
:nth-child()
用於根據元素在父級中的位置來選擇特定子元素,這個位置包括所有類型的元素。例如,你可以選擇父級中的第二個或第三個子元素,無論它們是 p
、div
還是 span
。
語法:
父元素:nth-child(n) {
/* 樣式規則 */
}
n
可以是具體數字(例如2
),也可以是表達式(例如2n
表示每隔一個選擇一個元素)。
範例:
li:nth-child(2) {
color: green;
}
HTML:
<ul>
<li>第一項</li>
<li>第二項</li>
<li>第三項</li>
</ul>
在這個範例中,nth-child(2)
會選擇第二個 li
元素並將其文字顏色變為綠色。
:nth-of-type()
:nth-of-type()
用於根據同類型的元素順序來選擇特定的子元素。
與 :nth-child()
不同,:nth-of-type()
只會根據同一類型的元素來計算順序,而不會考慮其他類型的元素。
語法:
父元素:nth-of-type(n) {
/* 樣式規則 */
}
n
可以是具體數字(例如2
),也可以是表達式(例如2n
表示每隔一個選擇一個元素)。
範例:
p:nth-of-type(2) {
color: blue;
}
HTML:
<div>
<p>第一段文字</p>
<span>這是其他元素</span>
<p>第二段文字</p>
<p>第三段文字</p>
</div>
在這裡,:nth-of-type(2)
會選擇第二個 p
元素,而不會考慮 span
元素。
這意味著即使第二個子元素是 span
,它也不會影響對第二個 p
的選擇。
:first-child
、:last-child
與 :nth-child()
、:nth-of-type()
的區別
雖然這些選擇器看似相似,但它們在選擇元素時的行為存在明顯區別。
:first-child
和 :last-child
的行為
first-child
:僅選擇父級元素中的第一個子元素,不區分元素的類型。last-child
:僅選擇父級元素中的最後一個子元素,無論其類型。
這意味著,如果一個父級元素內有多種類型的子元素,如 span
和 li
混合存在時,first-child
和 last-child
會根據所有子元素的順序來選擇。
範例:
<ul class="child">
<span></span>
<li>item</li>
<li>item</li>
</ul>
在這個範例中,li:first-child
會無效,因為第一個子元素實際上是 span
,而不是 li
。
:nth-child()
與 :nth-of-type()
的行為
nth-child()
:基於父級中所有子元素的順序進行選擇,不考慮元素的類型。nth-of-type()
:只選擇同一類型的元素,不管這些元素是否是父級中的第幾個子元素。
範例:
li:nth-child(2) {
color: red;
}
在上面的 HTML 結構中,li:nth-child(2)
不會選擇第二個 li
,因為它實際上是父級的第三個子元素(因為第一個元素是 span
)。
相對的,使用 nth-of-type()
可以解決這個問題:
li:nth-of-type(2) {
color: red;
}
這樣,會選擇第二個 li
元素,無論它是不是父級中的第二個子元素。
使用場景與建議
使用 :first-child
和 :last-child
的場景
當你需要選擇一個容器內的第一個或最後一個子元素時,不論其類型,使用 :first-child
和 :last-child
是合適的。
例如:
/* 選擇第一個子元素 */
div:first-child {
background-color: yellow;
}
/* 選擇最後一個子元素 */
div:last-child {
background-color: red;
}
使用 :nth-child()
的場景
如果你想選擇父級中所有子元素中的特定位置,無論它們的類型是什麼,使用 :nth-child()
是最佳選擇。
例如:
/* 選擇父級中的第三個子元素 */
ul li:nth-child(3) {
color: green;
}
使用 :nth-of-type()
的場景
當你只希望針對某一類型的元素進行選擇時(例如只針對所有 p
元素),使用 :nth-of-type()
可以避免其他類型的元素干擾。
例如:
/* 選擇父級中的第二個段落(p)元素 */
p:nth-of-type(2) {
font-weight: bold;
}
結語
理解 :first-child
、:last-child
、:nth-child()
和 :nth-of-type()
之間的區別,對於靈活應用 CSS 選擇器非常重要。
這些選擇器在處理父級內部,不同類型和位置的子元素時,提供了強大的控制能力。
無論是基於子元素的順序還是類型,你都可以使用這些選擇器,精確地選擇並應用樣式,從而讓你的網頁設計更具靈活性和可控性。