初学者概念:CSS 选择器的工作原理

Avatar of Chris Coyier
Chris Coyier 发布

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

您是 CSS 新手吗?这篇文章适合您!也许理解 CSS 最大的关键在于理解选择器。选择器使您能够定位特定的 HTML 元素并对其应用样式。不过,现在先不要考虑样式,让我们只关注选择。

在下面的示例中,CSS 将位于一个名为 style.css 的文件中,该文件从一个名为 index.html 的 HTML 文档中引用。它们是单独的文件,这是 CSS 的优点,它将设计文档分开。

HTML 文件将如下所示

<!DOCTYPE html>
<html lang="en">

<head>
  <title>We're learning selectors!</title>
  <link rel="stylesheet" href="style.css">
</head>

<body>
  
  <h1 id="yay">Yay</h1>

<body>
</html>

CSS 文件将只包含如下所示的选择器块。


ID 选择器

#happy-cake {

}
<!-- WILL match -->
<div id="happy-cake"></div>

<!-- WILL match -->
<aside id="happy-cake"></aside>

<!-- Will NOT match -->
<div id="sad-cake">Wrong ID!</div>

<!-- Will NOT match -->
<div class="happy-cake">That's not an ID!</div>

提升水平

CSS 特异性而言,ID 选择器是最强大的选择器类型。这意味着它们胜过其他类型的选择器,并且其中定义的样式获胜。这听起来不错,但这通常被认为是不好的,因为拥有较低特异性的选择器在需要时更容易覆盖是很好的。

类选择器

.module {

}
<!-- WILL match -->
<div class="module"></div>

<!-- WILL match -->
<aside class="country module iceland"></aside>

<!-- Will NOT match -->
<div class=".module">The dot is for CSS, not HTML</div>

<!-- Will NOT match -->
<div class="bigmodule">Wrong class</div>

提升水平

类选择器是您的朋友。它们可能是最有用和用途最广泛的选择器。部分原因在于它们在所有浏览器中都得到了很好的支持。部分原因在于您可以在 HTML 元素上添加多个类(只需用空格分隔)。部分原因在于您可以执行一些特定于操作类的 JavaScript 操作。

标签选择器

h2 {

}
<!-- WILL match -->
<h2>Hi, Mom</h2>

<main>
  <div>
     <!-- WILL match -->
     <h2>Anywhere</h2>
  </div>
</main>

<!-- Will NOT match -->
<div class="h2">Wrong tag, can't trick it</div>

<!-- Will NOT match -->
<h2class="yolo">Make sure that tag has a space after it!</h2>

提升水平

当更改特定于该 HTML 元素的属性时,标签选择器最有用。例如,在<ul>上设置list-style或在<pre>上设置tab-size。还在重置样式表中,您专门尝试取消浏览器应用于某些元素的样式。

不过,不要过分依赖它们。通常,使用类定义可以在任何 HTML 元素上使用的样式更有用。

属性选择器

[data-modal="open"] {

}
<!-- WILL match -->
<div data-modal="open"></div>

<!-- WILL match -->
<aside class='closed' data-modal='open'></aside>

<!-- Will NOT match -->
<div data-modal="false">Wrong value</div>

<!-- Will NOT match -->
<div data-modal>No value</div>

<!-- Will NOT match -->
<div data-modal-open>Wrong attribute</div>

提升水平

您可能会认为属性选择器甚至比类更有用,因为它们具有相同的特异性值,但可以是任何属性,而不仅仅是class此外,它们还可以具有您可以通过其选择的值。

现在几乎不是问题,但属性选择器在 IE 6 中不受支持。

位置选择器

:nth-child(2) {

}
<ul>
  <li>nope</li>
  <!-- WILL match -->
  <li>yep, I'm #2</li>
  <li>nope</li>
</ul>

提升水平

除了:nth-child之外,还有几种不同的位置选择器。使用简单的表达式(例如3n =“每三个”),您可以根据元素在 HTML 中的位置来选择元素。您可以在这里尝试这个想法或查看一些有用的示例

其他伪类选择器

:empty {

}
<!-- WILL match -->
<div></div>

<!-- WILL match -->
<aside data-blah><!-- nothin' --></aside>

<!-- Will NOT match -->
<div> </div>

<!-- Will NOT match -->
<div>
</div>

提升水平

:empty是许多伪类选择器之一,您可以通过其中的冒号(:)来识别它们。它们通常表示一些您仅通过元素和属性无法知道的内容。

请注意,这些与伪元素略有不同,您可以通过双冒号(::)来识别它们。它们负责通过它们选择的内容向页面添加内容。

更多提升水平

选择器可以组合在一起。例如

.module.news {  
  /* Selects elements with BOTH of those classes */
}
#site-footer::after {
  /* Adds content after an element with that ID */
}
section[data-open] {
  /* Selects only section elements if they have this attribute */
}

还有选择器组合器,如~+>,它们会影响选择器,例如

.module > h2 {
  /* Select h2 elements that are direct children of an element with that class */
} 
h2 + p {
  /* Select p elements that are directly following an h2 element */
}
li ~ li {
  /* Select li elements that are siblings (and following) another li element. */
}

在 CSS-Tricks 上,有一个完整的年鉴,涵盖了 CSS 中的所有选择器以及属性。