2759 字
14 分钟
CSS 选择器

CSS 选择器#

CSS 选择器是 CSS 规则的一部分,用于选择 HTML 元素。

CSS 属性采用键值对形式:<属性名>: <属性值>;

/*p是选择器*/
p {
  /*属性*/
  color: red;
font-size: 14px;
}
  • CSS选择器:选择标签
  • CSS属性:修改样式

选择器分类#

根据使用场景不同,选择器分类也不同。

  • 基础选择器
  • 关系选择器
  • 分组选择器
  • 伪类和伪元素
  • 属性选择器

基础选择器#

基础选择器是指由单个选择器组成,常见的有下面几种:

类型选择器#

选择某个类型的元素,也成为标签选择器

/*选择所有div标签样式*/
div {
  color: red;
}
/*选择所有span标签样式*/
span {
  color: yellow;
}

层叠性:多个 CSS 规则可以同时作用于同一个元素,浏览器会优先执行最近的元素样式,后面的 CSS 会覆盖前面的

类选择器#

类选择器用于选择一个或多个元素

/* blue 为类名,用 . 开头 */
.blue {
color: blue;
}
<ul>
  <li>牌烧完了我打什么?</li>
  <li>转来转去像个小丑</li>
  <li class="blue">故障机器人最强故障机器人最</li>
  <li>哎,诶诶</li>
</ul>

谁要用谁调用,类选择器需要显式声明。

注意事项

  1. 类名建议使用有语义的英文,不建议使用纯数字

  2. 多个单词组成尽量使用 - 连接

  3. class属性可以有多个类名,中间用空格隔开

ID 选择器#

选择 HTML 中具有特定 id 属性的唯一元素

/*#开头*/
#header {
  color: red;
}
<ul id="header">
  <li>牌烧完了我打什么?</li>
  <li>转来转去像个小丑</li>
  <li class="blue">故障机器人最强故障机器人最</li>
  <li>哎,诶诶</li>
</ul>
类选择器和ID选择器的区别#
类选择器ID 选择器
语法以 . 开头,后跟类名以 # 开头,后跟 id 名
作用选择 class 属性的一个或多个元素选择特定 id 属性的唯一元素
特点可以使用多次同一页面中,id 值必须唯一
场景后期修改样式基本都是类选择器后期主要是配合JavaScript添加交互效果

通配符选择器#

通配符选择器可以选择 HTML 中所有的标签,进行样式修改

* {
  margin: 0;
padding: 0;
}

特殊情况下通过通配符清除所有元素的默认边距和填充,统一不同浏览器的默认样式。

* {
  margin: 0; /*去除所有元素的外边距*/
padding: 0; /*去除所有元素的内边距*/
  box-sizing: border-box; /*统一盒模型*/
}

总结#

选择器类型语法示例匹配范围复用性典型使用场景注意事项
类型选择器div { ... }匹配所有指定 HTML 标签元素某一类型标签全局样式重置、基础标签样式(如 body, p)避免滥用,可能导致样式冲突
类选择器.nav { ... }匹配所有含指定 class 的元素多次使用多元素共享样式优先使用,避免与 ID 选择器冲突
ID 选择器#header { ... }匹配唯一含指定 id 的元素唯一性唯一元素标识必须唯一,避免样式覆盖风险
通配符选择器* { ... }匹配所有元素全局覆盖全局样式重置性能较差,慎用

大部分情况下,类选择器是最重要的。

关系选择器#

关系选择器通过位置关系来选择目标元素(标签),可以更精准选择某些元素。常见的有:

  • 后代选择器
  • 子代选择器
  • 邻接兄弟选择器
  • 通用兄弟选择器

后代选择器#

选择某个元素的后代元素(不限层级,包括子元素、孙元素等)

/*选择 box 类内部的所有 p 标签,父级和后代间用空格隔开*/
/*父级作用是限定,不会修改父级本身样式*/
/*父级和后代可以是两个任意类型的基础选择器*/
/*可以多级嵌套,只修改符合全部条件后代的选择器*/
.box p {
  color: skyblue;
}

子代选择器#

选择某个元素的直接子代元素,只限第一层的子代元素,不影响子代的后代。

.box > p {
  color: green;
}

兄弟选择器#

/*邻接兄弟选择器*/
/*选择 h2 后面的第一个同层级 p 标签*/
h2 + p {
  color: pink;
}
/*通用兄弟选择器*/
/*选择 h2 后面的所有同层级 p 标签*/
h2 ~ p {
color: pink;
}

总结#

选择器语法选择范围实例
后代选择器(重点,最常用)A B所有后代(跨层级)ul li { color: pink; }
子代选择器A > B直接子元素(仅一层)div > span { color: pink; }
邻接兄弟选择器A + B紧邻的下一个同级元素h2 + p { ... } 标题后的第一个 p 元素
通用兄弟选择器A ~ BA 之后的所有同级元素h2 ~ p { ... } 标题后的所有 p 元素

分组选择器#

将不同的选择器组合在一起。使用逗号分隔。

也称为并集选择器。

使用场景:多个元素具备相同样式。

p,
h1 {
  color: red;
}

伪类选择器#

选择元素的特定状态或结构位置。符号是冒号(:)

  • 状态伪类

    • 根据用户交互或状态变化选择。
    • 比如:鼠标经过链接、表单获得焦点等。
  • 结构伪类

    • 根据元素的位置选择。
    • 比如:选择第五个元素、选择前三个元素等。
  • 表单伪类

    • 针对表单元素的状态。
    • 比如:表单禁用、选中复选框等

链接伪类#

链接伪类用于根据链接的不同状态(如未访问、悬停、点击等)为其添加样式,从而提升用户体验和界面交互性。

链接伪类作用
a:link未访问链接的默认样式
a:visited已访问链接的样式
a:hover鼠标悬停在链接上时的反馈样式
a:active链接被点击时的瞬时状态(按下到松开)

伪类顺序规则(LVHA顺序,顺序不能变,原理是同级 CSS 样式的就近原则)

a:link {
  color: #000000;
  text-decoration: none;
}
a:visited {
  color: #66ccff;
  text-decoration: none;
}
a:hover {
color: #ee82ee;
  text-decoration: underline;
}
a:active {
  color: #f4004f;
  text-decoration: none;
}

状态伪类#

用户以某种方式和文档交互的时候应用,也称动态伪类。

动态伪类作用
:hover鼠标经过元素
:focus获得焦点的元素(表单)
.box {
  width: 300px;
  height: 300px;
  background-color: red;
}
/*注意这里没有空格*/
.box:hover {
  background-color: skyblue;
}
.search:focus {
  background-color: rgba(255,0,0,0.2)
}

结构伪类#

根据元素的位置选择目标元素。

使用场景:选择多个元素中的任意特定位置的元素。

结构伪类作用
:first-child一组兄弟元素中的第一个元素
:last-child一组兄弟元素中的最后一个元素
:nth-child(n)一组兄弟元素列表中的第 n 个元素

这里n的取值可以是:

  1. 数字。从1开始
  2. 关键字。odd 奇数;even 偶数
  3. 公式。
    1. :nth-child(3n) 3 的倍数,第 3,6,9…个元素
    2. :nth-child(n+2) 第 2 个以及以后的元素
    3. :nth-child(-n+3) 前三个元素
    4. 注意公式的 n 的取值从 0 开始计算
ul li:first-child {
color: pink;
/* 第一个li元素的字体颜色为粉色 */
}
ul li:nth-child(2) {
color: blue;
/* 第二个li元素的字体颜色为蓝色 */
}
ul li:last-child {
color: green;
/* 最后一个li元素的字体颜色为绿色 */
}

表单伪类#

针对表单元素的状态

使用场景:

  1. 表单禁用的时候,调整颜色
  2. 复选框选中修改样式
表单伪类作用
:disabled表单禁用
:checked选中状态,单选 / 复选按钮
button:disabled {
  /*透明度,让整个元素透明*/
  opacity: .4;
}
input:checked+label {
  color: #ff6900;
}

伪元素选择器#

选择元素的特定部分。(使用双冒号::)

使用场景:

  1. 让表单里的 placeholder 文字改变颜色。
  2. 做很多的修饰效果。
伪元素选择器作用
::first-line选择元素的首行文本
::first-letter选择元素的首字母(或首字符)
::placeholder选择 <input><textarea> 的占位符文本
::before元素内插入伪元素,作为第一个元素
::after元素内插入伪元素,作为最后一个元素
p::first-line {
  color: #66ccff;
}
p::first-letter {
  font-size: 28px;
}
div::before {
  content: "start";
  color: red;
}
div::after {
  content: "end";
  color: red;
}

注意:

::before::after 是插入的伪元素,特性类似内联元素。

content 属性是必须,不能省略,没有内容空字符串即可。

常用于实现小图标和各种装饰效果。

属性选择器#

根据元素的属性来精准定位元素,从而实现更灵活的样式控制。

使用场景:

  1. 表单样式控制。
  2. 图标字体控制。
  3. i18n 国际化适配等等
属性选择器作用
[属性]匹配包含指定属性的所有元素
[属性=值]匹配属性值完全等于指定值的元素
[属性^=值]匹配属性值以指定字符串开头的元素
[属性$=值]匹配属性值以指定字符串结尾的元素
[属性*=值]匹配属性值在任意位置包含指定子串的元素

选择器的优先级#

优先级由选择器的权重决定,权重高的规则覆盖权重低的规则。

浏览器通过优先级来判断哪些属性与一个元素最为相关。优先级基于不同种类选择器组成的匹配规则。

原则:

  1. 优先级相同的时候,CSS 中最后声明的那个样式会被应用到元素上。(层叠遵循就近原则)
  2. 其余判断哪个选择器权重高,优先执行那个样式。
  3. 权重是四位一组,是分开的层级,不能进位。
选择器类型示例权重值优先级说明
!importantcolor: red !important;无限大强制覆盖所有规则(慎用)
内联样式<div style="color: red">(1, 0, 0, 0)行内样式权重最高
ID 选择器#myId(0, 1, 0, 0)每个 ID 增加 0,1,0
类 / 属性 / 伪类.class, [type="text"](0, 0, 1, 0)每个类 / 属性 / 伪类增加 0,0,1
类型(标签)/ 伪元素div, ::after(0, 0, 0, 1)每个标签 / 伪元素增加 0,0,0,1
通配符 / 继承*, 继承的样式(0, 0, 0, 0)通配符和继承权重最低

权重叠加:
权重是累加的,每个选择器的层级权重相加。

选择器 #nav .item a 由三部分组成:

  • #nav:ID 选择器,权重为 (0, 1, 0, 0)
  • .item:类选择器,权重为 (0, 0, 1, 0)
  • a:类型(元素)选择器,权重为 (0, 0, 0, 1)

将各部分权重对应位相加:

  • 第 1 位:0 + 0 + 0 = 0
  • 第 2 位:1 + 0 + 0 = 1
  • 第 3 位:0 + 1 + 0 = 1
  • 第 4 位:0 + 0 + 1 = 1

所以,#nav .item a 的最终权重为 (0, 1, 1, 1)

CSS 选择器
https://blog.sheyiyuan.com/notes/css-选择器/
作者
Sheyiyuan
发布于
2025-05-14 16:00
许可协议
CC BY-NC-SA 4.0
如果这篇文章对你有帮助,可以请我喝杯咖啡~