組合器

我們將要了解的最後一個選擇器稱為組合器。組合器用於以允許我們根據元素在 DOM 中的位置相對於其他元素(例如,子元素或同級元素)來選擇元素的方式組合其他選擇器。

預備知識 HTML 基礎(學習基本 HTML 語法)、基本 CSS 選擇器
學習成果
  • 組合器的基本概念。
  • 後代和子組合器。
  • 相鄰同級和後續同級組合器。
  • 巢狀。
  • 將組合器與選擇器結合使用。

後代組合器

後代組合器 — 用單個空格 ( ) 字元表示 — 將兩個選擇器結合在一起,如果第二個選擇器匹配的元素具有匹配第一個選擇器的祖先(父元素、父元素的父元素,或父元素的父元素的父元素,依此類推)元素,則選中該元素。使用後代組合器的選擇器稱為後代選擇器

css
body article p {
}

在下面的示例中,我們只匹配位於類名為 .box 的元素內部的 <p> 元素。

html
<div class="box"><p>Text in .box</p></div>
<p>Text not in .box</p>
css
.box p {
  color: red;
}

子組合器

子組合器 (>) 放置在兩個 CSS 選擇器之間。它僅匹配由第二個選擇器匹配的、作為由第一個選擇器匹配的元素的直接子元素的那些元素。層次結構中更深的後代元素不匹配。例如,要僅選擇 <article> 元素的直接子元素的 <p> 元素

css
article > p {
  /* … */
}

在下一個示例中,我們有一個無序列表(<ul>)巢狀在一個有序列表(<ol>)中。子組合器僅選擇作為 <ul> 直接子元素的 <li> 元素,併為它們設定上邊框樣式。

html
<ul>
  <li>Unordered item</li>
  <li>
    Unordered item
    <ol>
      <li>Item 1</li>
      <li>Item 2</li>
    </ol>
  </li>
</ul>
css
ul > li {
  border-top: 5px solid red;
}

在前一個示例中,嘗試刪除指定選擇器為子選擇器的 >。您最終會得到一個後代選擇器,所有 <li> 元素都會獲得紅色邊框。

相鄰兄弟組合器

相鄰同級組合器 (+) 放置在兩個 CSS 選擇器之間。它僅匹配由第二個選擇器匹配的、緊跟在由第一個選擇器匹配的元素之後的那些元素。例如,要選擇緊跟在 <p> 元素之後的所有 <img> 元素

css
p + img {
  /* … */
}

一個常見的用例是處理緊跟在標題後面的段落,如下面的示例所示。在這裡,我們選擇任何與 <h1> 共享父元素並且緊跟在該 <h1> 之後的段落。

html
<article>
  <h1>A heading</h1>
  <p>
    Veggies es bonus vobis, proinde vos postulo essum magis kohlrabi welsh onion
    daikon amaranth tatsoi tomatillo melon azuki bean garlic.
  </p>

  <p>
    Gumbo beet greens corn soko endive gumbo gourd. Parsley shallot courgette
    tatsoi pea sprouts fava bean collard greens dandelion okra wakame tomato.
    Dandelion cucumber earthnut pea peanut soko zucchini.
  </p>
</article>
css
body {
  font-family: sans-serif;
}

h1 + p {
  font-weight: bold;
  background-color: #333333;
  color: white;
  padding: 0.5em;
}

在前一個示例中

  1. 嘗試在 <h1><p> 之間插入另一個元素,例如 <h2>。您會發現該段落不再被選擇器匹配,因此當元素相鄰時,不會應用背景和前景顏色。
  2. 現在修改 h1 + p 選擇器,以便特殊樣式能再次應用於第一個段落。

後續兄弟組合器

如果您想選擇一個元素的同級元素,即使它們不直接相鄰,那麼您可以使用後續同級組合器 (~)。要選擇 <p> 元素之後任何位置的所有 <img> 元素,我們可以這樣做:

css
p ~ img {
  /* … */
}

在下面的示例中,我們選擇 <h1> 之後的所有 <p> 元素,即使文件中還有一個 <div>,該 <div> 之後的 <p> 也會被選中。

html
<article>
  <h1>A heading</h1>
  <p>I am a paragraph.</p>
  <div>I am a div</div>
  <p>I am another paragraph.</p>
</article>
css
body {
  font-family: sans-serif;
}

h1 ~ p {
  font-weight: bold;
  background-color: #333333;
  color: white;
  padding: 0.5em;
}

將組合器與選擇器結合使用

您可以將我們在之前課程中學到的任何選擇器與組合器結合使用,以選擇文件的一部分。例如,要選擇 <ul> 的直接子元素且類名為 a 的列表項,請嘗試以下方法:

css
ul > li[class="a"] {
}

但是,在建立選擇非常具體文件部分的大型選擇器列表時要小心。由於您使選擇器非常具體地指向元素在標記中的位置,因此將很難重用 CSS 規則。

通常最好建立一個簡單的類並將其應用於相關元素。話雖如此,如果您需要為文件中的某些內容設定樣式但又無法訪問 HTML(可能是因為它由 CMS 生成),那麼您對組合器的瞭解將非常有用。

總結

到此為止,關於選擇器的內容暫時告一段落。接下來,我們將提供一些測試,以檢查您對我們提供的關於 CSS 選擇器資訊的理解和掌握程度。