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>谁要用谁调用,类选择器需要显式声明。
注意事项
类名建议使用有语义的英文,不建议使用纯数字
多个单词组成尽量使用
-连接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 ~ B | A 之后的所有同级元素 | 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开始
- 关键字。odd 奇数;even 偶数
- 公式。
:nth-child(3n)3 的倍数,第 3,6,9…个元素:nth-child(n+2)第 2 个以及以后的元素:nth-child(-n+3)前三个元素- 注意公式的 n 的取值从 0 开始计算
ul li:first-child { color: pink; /* 第一个li元素的字体颜色为粉色 */}
ul li:nth-child(2) { color: blue; /* 第二个li元素的字体颜色为蓝色 */}
ul li:last-child { color: green; /* 最后一个li元素的字体颜色为绿色 */}表单伪类
针对表单元素的状态
使用场景:
- 表单禁用的时候,调整颜色
- 复选框选中修改样式
| 表单伪类 | 作用 |
|---|---|
:disabled | 表单禁用 |
:checked | 选中状态,单选 / 复选按钮 |
button:disabled { /*透明度,让整个元素透明*/ opacity: .4;}
input:checked+label { color: #ff6900;}伪元素选择器
选择元素的特定部分。(使用双冒号::)
使用场景:
- 让表单里的 placeholder 文字改变颜色。
- 做很多的修饰效果。
| 伪元素选择器 | 作用 |
|---|---|
::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 属性是必须,不能省略,没有内容空字符串即可。
常用于实现小图标和各种装饰效果。
属性选择器
根据元素的属性来精准定位元素,从而实现更灵活的样式控制。
使用场景:
- 表单样式控制。
- 图标字体控制。
- i18n 国际化适配等等
| 属性选择器 | 作用 |
|---|---|
[属性] | 匹配包含指定属性的所有元素 |
[属性=值] | 匹配属性值完全等于指定值的元素 |
[属性^=值] | 匹配属性值以指定字符串开头的元素 |
[属性$=值] | 匹配属性值以指定字符串结尾的元素 |
[属性*=值] | 匹配属性值在任意位置包含指定子串的元素 |
选择器的优先级
优先级由选择器的权重决定,权重高的规则覆盖权重低的规则。
浏览器通过优先级来判断哪些属性与一个元素最为相关。优先级基于不同种类选择器组成的匹配规则。
原则:
- 优先级相同的时候,CSS 中最后声明的那个样式会被应用到元素上。(层叠遵循就近原则)
- 其余判断哪个选择器权重高,优先执行那个样式。
- 权重是四位一组,是分开的层级,不能进位。
| 选择器类型 | 示例 | 权重值 | 优先级说明 |
|---|---|---|---|
!important | color: 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)