CSS 属性选择器
无论是类选择器或者 ID选择器, 本质上都是元素的属性来做匹配。
这里我们来了解以下 属性选择器(attribute selector). 它可以基于元素的属性名称和属性值来匹配元素。
有四种类型的属性选择器:
- 简单属性选择器 (Simple attribute selector)
 - 精确属性值选择器 (Exact attribute value selector)
 - 部分匹配属性值选择器 (Partial-match attribute value selector)
 - 前导值属性选择器 (Leading-value attribute selector)
 
1. 简单属性选择器
如果你想选中哪些包含某个特定属性名称的元素,而不关心这个属性的值, 可以使用 简单属性选择器。
例如,你想选中所有带有 class 属性的 h1 元素, 可以这样写:
<!DOCTYPE html><html><head>  <meta http-equiv="content-type" content="text/html; charset=utf-8" />  <title>Simple styling of a simple document</title>  <style type="text/css">    html { background-color: white; }    h1[class] {color: silver;}  </style></head><body><h1 class="hoopla">Hello</h1><h1>Serenity</h1><h1 class="fancy">Fooling</h1></body></html>
你也可以用它来选择哪些包含多个特定属性名称的元素。
比如,选中同时包含 href 和 title 属性的 a 元素:
<!DOCTYPE html><html><head>  <meta http-equiv="content-type" content="text/html; charset=utf-8" />  <title>Simple styling of a simple document</title>  <style type="text/css">    html { background-color: white; }    a[href][title] {font-weight: bold;}  </style></head><body><a href="https://www.w3.org/" title="W3C Home">W3C</a><br /><a href="https://developer.mozilla.org">Standards Info</a><br /><a title="Not a link">dead.letter</a></body></html>
2. 精确属性值选择器
你可以通过指定属性的值来进一步缩小匹配的元素的范围。
比如, 你想给所有指向特定链接地址的 a 元素设置粗体,你可以这样实现:
<!DOCTYPE html><html><head>  <meta http-equiv="content-type" content="text/html; charset=utf-8" />  <title>Simple styling of a simple document</title>  <style type="text/css">    html { background-color: white; }    a[href="https://www.w3.org"] {font-weight: bold;}  </style></head><body><a href="https://www.w3.org" title="W3C Home">W3C</a><br /><a href="https://developer.mozilla.org">Standards Info</a><br /></body></html>
和简单属性选择器一样, 你也可以组合多个属性选择器来更精确的匹配元素,
比如:
<!DOCTYPE html><html><head>  <meta http-equiv="content-type" content="text/html; charset=utf-8" />  <title>Simple styling of a simple document</title>  <style type="text/css">    html { background-color: white; }    a[href="https://www.w3.org/"][title="W3C Home"] {font-size: 200%;}  </style></head><body><a href="https://www.w3.org/" title="W3C Home">W3C</a><br /><a href="https://developer.mozilla.org"title="Mozilla Developer Network">Standards Info</a><br /><a href="http://www.example.org/" title="W3C Home">confused.link</a></body></html>
3. 部分匹配属性值选择器
有时候, 你又想通过部分属性值来匹配元素。CSS 提供了以下选项:
| Type | Description | 
|---|---|
[foo~="bar"] | 匹配所有包含 foo 属性并且它的值中包含 bar 的元素 (bar 需要是一个完整的单词) | 
[foo*="bar"] | 匹配所有包含 foo 属性并且它的值中包含 bar 子字符串 | 
[foo^="bar"] | 匹配所有包含 foo 属性并且它的值以 bar 开头 | 
[foo$="bar"] | 匹配所有包含 foo 属性并且它的值以 bar 结尾 | 
[foo|="bar"] | 匹配所有包含 foo 属性并且它的值以 bar 开头后面紧跟 - 或者完全等于 bar | 
3.1 匹配空格分隔列表中的一个单词
对于任何一个接受以空格分隔符的单词列表作为它的值的属性,你都可以通过是否出现某个单词的规则来匹配到它。
(For any attribute that accepts a space-separated list of words, you can select elements based on the presence of any one of those words. )
比如, 你想选中所有包含 class 属性,并且class 属性的值中包含 warning 的元素,你可以这样写:
p[class~="warning"] {font-weight: bold;}
它等于同
p.warning {font-weight: bold;}
<!DOCTYPE html><html><head>  <meta http-equiv="content-type" content="text/html; charset=utf-8" />  <title>Simple styling of a simple document</title>  <style type="text/css">    html { background-color: white; }    span[class~="barren"] {font-style: italic;}  </style></head><body><span class="barren rocky">Mercury</span><span class="cloudy barren">Venus</span><span class="life-bearing cloudy">Earth</span></body></html>
这里 "Mercury" 和 "Venus" 均被选中。
3.2 匹配属性值中的子字符串
有时,你希望根据元素的属性值的一部分来选择元素,但这些值并不是以空格分隔的单词列表。这种情况下,你可以使用 [attr*="val"] 来匹配元素。
例如:
<!DOCTYPE html><html><head>  <meta http-equiv="content-type" content="text/html; charset=utf-8" />  <title>Simple styling of a simple document</title>  <style type="text/css">    html { background-color: white; }    span[class*="cloud"] {font-style: italic;}  </style></head><body><span class="barren rocky">Mercury</span><span class="cloudy barren">Venus</span><span class="life-bearing cloudy">Earth</span></body></html>
span[class*="cloud"]  会匹配所有 class 属性中包含 "cloud" 子字符串的 span 元素, 包含 "cloudy" 属性的 span 也会被选中。
3.3 匹配属性值开头的子字符串
如果您想根据属性值开头的子字符串来选择元素,那么 [att^="val"] 就是你要找的。
<!DOCTYPE html><html><head>  <meta http-equiv="content-type" content="text/html; charset=utf-8" />  <title>Simple styling of a simple document</title>  <style type="text/css">    html { background-color: white; }    a[href^="https:"] {font-weight: bold;}    a[href^="mailto:"] {font-style: italic;}  </style></head><body><p><a href="https://www.w3schools.com">W3Schools</a></p><p><a href="mailto://example@example.com">Email</a></p><p><a href="ftp://example.com">FTP</a></p></body></html>
3.4 匹配属性值末尾的子字符串
如果您想根据属性值末尾的子字符串来选择元素,那么 [att$="val"] 就是你要找的。
<!DOCTYPE html><html><head>  <meta http-equiv="content-type" content="text/html; charset=utf-8" />  <title>Simple styling of a simple document</title>  <style type="text/css">    html { background-color: white; }    a[href$=".cn"] {font-weight: bold;}  </style></head><body><p><a href="https://www.w3schools.com">.com</a></p><p><a href="mailto://example@example.cn">.cn</a></p><p><a href="ftp://example.io">.io</a></p></body></html>
3.5 匹配属性值的子集
通过一个例子来描述一下如何使用: [foo|="bar"]
例如:
*[lang|="en"] {color: white;}
这个规则将匹配所有 lang 属性等于 en 或以 en- 开头的元素。
<!DOCTYPE html><html><head>  <meta http-equiv="content-type" content="text/html; charset=utf-8" />  <title>Simple styling of a simple document</title>  <style type="text/css">    html { background-color: white; }    *[lang|="en"] {color: red;}  </style></head><body><h1 lang="en">Hello!</h1><p lang="en-us">Greetings!</p><div lang="en-au">G'day!</div><p lang="fr">Bonjour!</p><h4 lang="cy-en">Jrooana!</h4></body></html>
4. 不区分大小写
在属性选择器的右括号前添加一个 i,该选择器将不区分大小写地匹配属性值,而不受文档语言规则的限制。
a[href$='.PDF' i]
它将匹配 .pdf, .PDF, .Pdf 等等。