这是一个考察对 CSS 选择器,特别是结构性伪类掌握程度的面试题。
最快速、最直接的方法是使用 :nth-child(even) 伪类选择器。
核心答案
/* 选取父元素下所有偶数位置的同组兄弟元素 */
.parent :nth-child(even) {
/* 样式规则 */
background-color: #f0f0f0;
}
详细解释
:nth-child(an + b):- 这是一个强大的结构性伪类,用于匹配其父元素的第
an + b个子元素。 a是循环的周期,b是偏移量。
- 这是一个强大的结构性伪类,用于匹配其父元素的第
even关键字:even是:nth-child()的一个特殊关键字,等价于2n。2n表示n取 0, 1, 2, 3… 时,结果为 0, 2, 4, 6, 8…。但由于元素索引从 1 开始,实际匹配的是第 2, 4, 6, 8… 个元素,即偶数序号的元素。
odd关键字:- 同理,
odd等价于2n+1,用于选取奇数序号的元素(1, 3, 5, 7…)。
- 同理,
完整示例
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>选取偶数兄弟元素</title>
<style>
.list {
list-style: none;
padding: 0;
}
/* 选取 .list 下所有偶数位置的 li 元素 */
.list li:nth-child(even) {
background-color: #e8f5e8;
font-weight: bold;
}
</style>
</head>
<body>
<ul class="list">
<li>项目 1 (奇数)</li>
<li>项目 2 (偶数)</li>
<li>项目 3 (奇数)</li>
<li>项目 4 (偶数)</li>
<li>项目 5 (奇数)</li>
<li>项目 6 (偶数)</li>
</ul>
</body>
</html>
在这个例子中,”项目 2″、”项目 4″ 和 “项目 6” 会被选中并应用背景色和粗体样式。
其他可行但非最优的方法
:nth-of-type(even):- 如果兄弟元素是同一类型(如都是
<li>),nth-of-type效果与nth-child相同。 - 区别:
nth-child是按所有子元素的顺序计算,而nth-of-type只计算同类型标签的顺序。 - 示例:
html ¨K17Kp:nth-child(even):不匹配任何<p>(因为<p>在第 1 和第 3 位,都是奇数)。p:nth-of-type(even):匹配“段落 2”(它是第 2 个<p>元素)。
- 结论:对于“同组兄弟元素”,通常它们类型相同,
nth-child(even)更通用。如果类型不同且只想选特定类型,才用nth-of-type。
- 如果兄弟元素是同一类型(如都是
- JavaScript 实现:
- 虽然可以使用
document.querySelectorAll()配合循环来实现,但这违背了“CSS 如何”和“快速”的要求。CSS 选择器在性能和简洁性上远胜于 JS。
- 虽然可以使用
面试加分点
- 理解
n的含义:能解释2n中的n是从 0 开始的整数序列。 - 与
nth-last-child()的对比:知道可以从末尾开始计数。 - 性能意识:强调 CSS 选择器是声明式的,由浏览器高效实现,比 JS 遍历快得多。
- 兼容性:
nth-child在现代浏览器中支持良好(IE9+)。
总结回答示例
要快速选取同组兄弟元素中的偶数序号元素,应使用
:nth-child(even)伪类选择器。它会自动匹配父元素下第 2、4、6、8… 个子元素。
这是最简洁、最高效的方法。如果兄弟元素类型不同且只想选特定标签,可以考虑
:nth-of-type(even),但在大多数情况下nth-child(even)是首选。
THE END


