根据上下文选择元素
我们可以定义后代选择器来创建一些规则,使这些规则在某些文档结构中起作用,而在另外一些结构中不起作用。
举例来说,如果您希望只对 h1 元素中的 em 元素应用样式,可以这样写:
h1 em {color:red;}上面这个规则会把作为 h1 元素后代的 em 元素的文本变为 红色。其他 em 文本(如段落或块引用中的 em)则不会被这个规则选中:
<h1>This is a <em>important</em> heading</h1>! Z0 r! @0 y4 e$ _3 \
<p>This is a <em>important</em> paragraph.</p>
0 ?- Q3 U4 D) M9 m3 n9 \
亲自试一试
当然,您也可以在 h1 中找到的每个 em 元素上放一个 class 属性,但是显然,后代选择器的效率更高。
语法解释
在后代选择器中,规则左边的选择器一端包括两个或多个用空格分隔的选择器。选择器之间的空格是一种结合符(combinator)。每个空格结合符可以解释为“... 在 ... 找到”、“... 作为 ... 的一部分”、“... 作为 ... 的后代”,但是要求必须从右向左读选择器。
因此,h1 em 选择器可以解释为 “作为 h1 元素后代的任何 em 元素”。如果要从左向右读选择器,可以换成以下说法:“包含 em 的所有 h1 会把以下样式应用到该 em”。
具体应用
后代选择器的功能极其强大。有了它,可以使 HTML 中不可能实现的任务成为可能。
假设有一个文档,其中有一个边栏,还有一个主区。边栏的背景为蓝色,主区的背景为白色,这两个区都包含链接列表。不能把所有链接都设置为蓝色,因为这样一来边栏中的蓝色链接都无法看到。
解决方法是使用后代选择器。在这种情况下,可以为包含边栏的 div 指定值为 sidebar 的 class 属性,并把主区的 class 属性值设置为 maincontent。然后编写以下样式:
div.sidebar {background:blue;}
9 Q) V9 F1 a5 d# i- K* Ldiv.maincontent {background:white;}
9 S% W# ^3 O. g) i( e' V# Ddiv.sidebar a:link {color:white;}& L' j6 N% i% [$ |8 }) M/ X+ y9 L
div.maincontent a:link {color:blue;}
& X9 N5 p3 B" {# F3 A4 Q' p* D v3 O0 U有关后代选择器有一个易被忽视的方面,即两个元素之间的层次间隔可以是无限的。
例如,如果写作 ul em,这个语法就会选择从 ul 元素继承的所有 em 元素,而不论 em 的嵌套层次多深。
因此,ul em 将会选择以下标记中的所有 em 元素:
<ul>
+ U; z- ^1 j: d% Q- i' L <li>List item 1
* s+ f" w2 F( j5 {; ], Z <ol>
9 Q- b7 ^; r ]% n4 n# `" u <li>List item 1-1</li>
# V. l# ]; d0 t: X9 b <li>List item 1-2</li>
- P* s$ s2 i" N: L u <li>List item 1-3
# J2 c' T' _, h- j' u7 ]8 \ <ol>
. f3 v7 T4 i; Q1 ` <li>List item 1-3-1</li>
` W; Y3 @+ o9 D( I% E, ` <li>List item <em>1-3-2</em></li>9 L2 [1 D5 Y4 m/ V( z4 ^
<li>List item 1-3-3</li>8 [& Q6 L: a' P8 f% ^' q
</ol>
, t: P" q# V5 P) b+ J- L </li># S2 Y( }% S5 Q7 `5 {+ T7 x
<li>List item 1-4</li>
# r6 w. O/ ~: `% T9 ?% @ </ol>- v# o0 b6 t) P: d6 e8 Y' U5 S
</li>) i) q- c1 L" C5 p n' E
<li>List item 2</li>/ W( l4 {3 b: z3 }+ V+ Y: D. J* Z! ?
<li>List item 3</li>
6 U$ J3 X( V. i F</ul>. C" v8 g5 w" `0 D
亲自试一试