原文: How to Use CSS Combinators to Select and Style Elements

组合器允许你将多个选择器组合起来,以选择 DOM 中的特定元素。在这篇文章中,我将用实例来解释四个组合器。

在我上一篇关于 CSS 选择器类型的文章中,我分享了七种类型的选择器,用于选择你想要为其设置样式的元素。

如果你还没有看过那篇文章,我建议你在阅读这篇文章之前先读一读它。

在本教程中,我讲的是组合器,它允许你使用多种选择器类型来选择元素。这种选择是基于符合指定的多个选择器类型的元素之间的关系。

如果你喜欢的话,这篇文章还有一个视频版本

下面是 CSS 中的四个组合器以及它们的工作原理。

如何使用后代组合器

这个组合器允许你选择一个元素,它是另一个元素的后代。这里的“后代”可以是孩子、孙子、曾孙、曾曾曾......等等。

要使用这个组合器,你要在选择器之间输入一个空格,像这样:

.container p {
  color: red;
}

上面这个样式声明选择了 p 元素,这些元素是具有 div class 的元素的后代。

它在 HTML 中是这样的:

<p>I am the first p</p>

<div class='container'>
    <p>I am the second p</p>
    
    <div>
        <p>I am the third p</p>
    </div>
</div>

<p>I am the last p</p>

结果如下:

image-396

从上面的结果中,你可以看到第二个和第三个 p 被设置了样式。这是因为它们都是 .container 元素的后代。第二个 p 是直接子元素,而第三个 p 是孙子元素(div 的直接子元素),但它们都是后代。

你也可以像这样使用多个选择器:

.container div p {
  color: red;
}

结果如下:

image-405

正如你所看到的,只有第三个 p 被设置了样式,因为这个元素是 div 元素的后代,而 div 又是具有 container class 的元素的后代。

如何使用子代组合器

子代组合器匹配子代、孙代,以此类推。子代组合器选择的元素是另一个元素的直接子代。

你在选择器之间使用大于符号(>)来指定一个选择器是另一个的直接子代。

下面是一个例子:

.container > p {
  color: red;
}

这个样式将选择所有作为 container class 元素的直接子元素的 p 元素。让我们看看这在上面的 HTML 例子中是如何运行的:

<p>I am the first p</p>

<div class='container'>
    <p>I am the second p</p>
    
    <div>
        <p>I am the third p</p>
    </div>
</div>

<p>I am the last p</p>

结果如下:

image-397

正如你在这里看到的,只有第二个 p 受到影响。尽管第二个和第三个 p 元素是 container class 元素的后代,但只有第二个是直接子元素,正如我们在 CSS 中所指定的那样。

你也可以像这样用这个组合器使用多个选择器:

.container > div > p {
  color: red;
}

这种样式设计将匹配所有 p 元素,这些元素是 div 元素的直接子代,而 div 元素又是 container class 元素的直接子代。

如何使用相邻兄弟组合器

我们已经看过了后代,那么兄弟姐妹呢——就像在一个家庭环境中一样?在选择器之间使用的相邻兄弟组合器,可以匹配作为另一个元素的兄弟的元素。

要使用这个组合器,你要输入 ~ 符号。下面是一个例子:

div ~ p {
  color: red;
}

这种样式设计选择了所有与 div 元素同级的 p 元素。比方说,我们有以下的 HTML:

<p>I am the first p</p>

<div class='container'>
    <p>I am the second p</p>
    
    <div>
        <p>I am the third p</p>
    </div>
</div>

<p>I am the last p</p>
<p>I am the very last p</p>

结果如下:

image-399

最后两个 p 有颜色样式。这是因为 div(具有 container class)和这些 p 是兄弟元素。

然而,如果你注意到,第一个 p 也是该 div 的兄弟元素。那么为什么它没有被设置样式呢?

原因是,在我们的 CSS 中,我们是这样使用子代组合器的:

div ~ p

这个选择意味着它只选择 div 元素后面p 兄弟元素。之前的兄弟元素不受影响。

如果选择变为:

p ~ div

然后它将选择在 p 元素之后div 的同级元素。

如何使用相邻组合器

这个组合器与兄弟组合器类似。不同的是,兄弟组合器匹配一个元素之后的所有兄弟元素,而相邻组合器只匹配一个元素之后的紧接着的兄弟元素。

要使用这个组合器,你要使用 + 符号,像这样:

div + p {
  color: red;
}

这种样式会影响到作为 div 元素之后的即时兄弟元素,即 p 元素。比方说,我们有前面的 HTML 例子:

<p>I am the first p</p>

<div class='container'>
    <p>I am the second p</p>
    
    <div>
        <p>I am the third p</p>
    </div>
</div>

<p>I am the last p</p>
<p>I am the very last p</p>

结果如下:

image-400

从这个结果中,你可以看到,只有第四个 p 元素被设置了样式。这是因为在我们的 HTML 代码中,这个 p 元素是 div 元素之后的一个紧接着的兄弟元素。

尽管最后一个 p 也是 div 元素之后的同级元素,但它并不是 div 的相邻元素。

总结

正如我们在这篇文章中所看到的,组合器允许你使用多种选择器类型。根据 DOM 中与这些选择器相匹配的元素之间的关系,你可以针对元素进行样式设计。

我们看到的组合器有:

  • 后代组合器:用于选择属于其他元素的后代元素
  • 子代组合器:用于选择属于其他元素的直接子代元素
  • 兄弟组合器:用于选择在其他元素之后的兄弟元素
  • 相邻组合器:用于选择其他元素之后的紧接着的兄弟元素

如果你喜欢这篇文章并从中受益,请和其他人分享它 💜