面试必考之CSS选择器

210 阅读3分钟

引言

CSS选择器是前端开发中至关重要的工具,它决定了我们如何精确地定位和样式化HTML元素。本文将系统介绍CSS的各种选择器类型,帮助您从基础到高级全面掌握选择器的使用技巧。

基本选择器

1. 元素选择器(标签选择器)

元素选择器是最简单的选择器类型,直接使用HTML标签名作为选择器。

p { color: red; }

优点:写法简单直观
缺点:当页面中存在多个相同标签时,无法精确区分特定元素

2. 类选择器

类选择器通过元素的class属性进行选择,以点号(.)开头。

.name { color: red; }

3. ID选择器

ID选择器通过元素的id属性进行选择,以井号(#)开头。

#name { color: red; }

4. 通配符选择器

通配符选择器(*)匹配页面中的所有元素,常用于重置默认样式。

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

复合选择器

1. 交集选择器

将多个选择器紧密连接(无空格),同时满足所有条件的元素才会被选中。

p.beauty { color: red; }

2. 并集选择器

用逗号分隔多个选择器,匹配其中任意一个选择器的元素。

h1, h2, h3 { 
    font-family: 'Microsoft YaHei';
}

3. 兄弟选择器

  • +:选择紧邻的下一个兄弟元素
  • ~:选择后面所有的兄弟元素
h1 + p { color: blue; }  /* 只选择h1后第一个p */
h1 ~ p { color: red; }   /* 选择h1后所有p */

4. 属性选择器

根据元素的属性及属性值进行选择。

[class^="d"] { color: red; }  /* class以"d"开头 */
[class$="h"] { color: blue; } /* class以"h"结尾 */
[class*="i"] { color: green; } /* class包含"i" */
[class~="num1"] { color: yellow; } /* class包含独立单词"num1" */

5. 后代选择器

  • >:直接子元素选择器
  • 空格:所有后代元素选择器
.div > p { color: red; }  /* 只选择直接子元素p */
.div p { color: blue; }   /* 选择所有后代p */

伪类和伪元素选择器

1. 伪元素选择器

使用双冒号(::)表示,用于创建不在DOM中的虚拟元素。

span.book::before { content: "《"; }
span.book::after { content: "》"; }
p::first-letter { 
    font-size: 2em;
    color: red;
}

2. 伪类选择器

使用单冒号(:)表示,描述元素的特定状态。

动态伪类(常用链接状态)

a:link { color: blue; }     /* 未访问 */
a:visited { color: purple; } /* 已访问 */
a:hover { color: red; }     /* 鼠标悬停 */
a:active { color: green; }  /* 激活状态 */

记忆口诀:LVHA(爱恨原则)

结构伪类(根据DOM位置选择)

li:first-child { color: red; }
li:nth-child(2n) { background: #f5f5f5; } /* 偶数行 */
tr:nth-child(odd) { background: #eee; }   /* 奇数行 */

CSS选择器权重

当多个选择器作用于同一元素时,浏览器通过权重决定最终应用的样式。

权重计算规则

使用(a,b,c)格式计算:

  • a:ID选择器的数量
  • b:类、伪类、属性选择器的数量
  • c:元素、伪元素选择器的数量

比较规则:从左到右逐级比较,数值大的优先级高

权重等级(从高到低)

  1. !important声明
  2. 行内样式(style属性)
  3. ID选择器
  4. 类/伪类/属性选择器
  5. 元素/伪元素选择器
  6. 通配符选择器
/* 权重示例 */
#header .nav li.active a { color: red; }  /* (1,2,2) */
.main-nav > ul > li > a { color: blue; } /* (0,1,3) */

注意:当权重相同时,后定义的样式会覆盖前面的样式("后来居上"原则)

最佳实践建议

  1. 尽量使用类选择器,减少ID选择器的使用
  2. 避免过度使用!important,它会破坏样式层叠规则
  3. 保持选择器简洁,避免过长的后代选择链
  4. 合理使用CSS预处理器(如Sass/Less)的嵌套功能
  5. 对于复杂项目,考虑使用BEM等命名规范