组合器

我们将要了解的最后一个选择器称为组合器。组合器用于以允许我们根据元素在 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 选择器信息的理解和掌握程度。