属性选择器

正如你从 HTML 学习中所知,元素可以拥有属性,这些属性提供了关于被标记元素的更多细节。在 CSS 中,你可以使用属性选择器来定位具有特定属性的元素。本课程将向你展示如何使用这些非常有用的选择器。

预备知识 HTML 基础(学习基本 HTML 语法)、基本 CSS 选择器
学习成果
  • 属性选择器的基本概念。
  • 存在和值属性选择器。
  • 子字符串匹配属性选择器。

存在和值选择器

这些选择器使你可以仅根据属性的存在(例如 href),或根据与属性值进行的各种不同匹配来选择元素。

选择器 示例 描述
[attr] a[title] 匹配带有 attr 属性的元素(属性名是方括号中的值)。
[attr=value] a[href="https://example.com"] 匹配带有 attr 属性且其值与 value 完全相等的元素——字符串在引号内。
[attr~=value] p[class~="special"] 匹配带有 attr 属性的元素,其值等于 value,或其值在(以空格分隔的)值列表中包含 value
[attr|=value] div[lang|="zh"] 匹配带有 attr 属性的元素,其值等于 value 或以 value 开头,后面紧跟一个连字符。

在下面的示例中,你可以看到这些选择器的使用。

  • 通过使用 li[class],我们可以匹配任何带有 class 属性的列表项。这会匹配除第一个之外的所有列表项。
  • li[class="a"] 匹配 class 为 a 的选择器,但不匹配 class 为 a 且其值中还包含其他以空格分隔的 class 的选择器。它选择了第二个列表项。
  • li[class~="a"] 会匹配 class 为 a 的项,也匹配值中包含 a 作为空格分隔列表一部分的项。它选择了第二个和第三个列表项。
html
<h1>Attribute presence and value selectors</h1>
<ul>
  <li>Item 1</li>
  <li class="a">Item 2</li>
  <li class="a b">Item 3</li>
  <li class="ab">Item 4</li>
</ul>
css
body {
  font-family: sans-serif;
}
li[class] {
  font-size: 120%;
}

li[class="a"] {
  background-color: yellow;
}

li[class~="a"] {
  color: red;
}

尝试编辑上面的 CSS,添加一个规则,仅选择 class 属性值为 ab 的列表项,并为它们设置 white 文本 colorpurple background-color

子字符串匹配选择器

这些选择器允许对属性值中的子字符串进行更高级的匹配。例如,如果你有 class box-warningbox-error,并且想要匹配所有以字符串 "box-" 开头的项,你可以使用 [class^="box-"] 来同时选择它们(或者如上面章节所述使用 [class|="box"])。

选择器 示例 描述
[attr^=value] li[class^="box-"] 匹配带有 attr 属性的元素,其值以 value 开头。
[attr$=value] li[class$="-box"] 匹配带有 attr 属性的元素,其值以 value 结尾。
[attr*=value] li[class*="box"] 匹配带有 attr 属性的元素,其值在字符串中的任何位置包含 value

下一个示例展示了这些选择器的用法

  • li[class^="a"] 匹配任何以 a 开头的属性值,因此匹配前两个列表项。
  • li[class$="a"] 匹配任何以 a 结尾的属性值,因此匹配第一个和第三个列表项。
  • li[class*="a"] 匹配 a 出现在字符串中任何位置的属性值,因此它匹配我们所有的列表项。
html
<h1>Attribute substring matching selectors</h1>
<ul>
  <li class="a">Item 1</li>
  <li class="ab">Item 2</li>
  <li class="bca">Item 3</li>
  <li class="bcabc">Item 4</li>
</ul>
css
body {
  font-family: sans-serif;
}
li[class^="a"] {
  font-size: 120%;
}

li[class$="a"] {
  background-color: yellow;
}

li[class*="a"] {
  color: red;
}

尝试编辑上面的 CSS,添加一个规则,仅选择 class 属性值以 bc 结尾的列表项,并为它们设置 2px 宽、solidblackborder。你可能需要使用 选择器列表 来解决这个问题。

总结

现在我们已经完成了属性选择器,你可以继续阅读下一篇文章,了解伪类和伪元素选择器。