第三篇、CSS选择器

6 阅读14分钟

选择器的写法

书写规范推荐

  • 选择器和大括号中间保留一个空格
  • 冒号和属性值之间保留一个空格
  • 每个属性独占一行
选择器名 {
    属性名: 属性值;
    属性名: 属性值;
    ......;
    属性名: 属性值;
}

基础选择器

标签选择器:匹配页面中所有同名的 HTML 标签,是最基础的选择器,作用范围广。

p {
    font-style: italic; /* 字体样式:斜体(可选normal/italic/oblique) */
    font-variant: small-caps; /* 字体变体:小型大写字母(可选normal/small-caps) */
    font-weight: 700; /* 字体粗细:粗体(等同于bold,可选100-900/normal/bold/bolder/lighter) */
    font-size: 22px; /* 字体大小:22像素(可选数值+单位/百分比/xx-small/x-small/small/medium/large/x-large/xx-large) */
    line-height: 2; /* 行高:字号的2倍(可选数值/数值+单位/百分比/normal) */
    font-family: "Microsoft Yahei", Arial, sans-serif; /* 字体族:微软雅黑优先,其次Arial,最后无衬线字体(可选具体字体名/通用字体族) */
}

类选择器:匹配页面中所有 class 属性包含该类名的元素,是开发中使用最多的选择器,核心优势是「可复用」

  • 一个标签可绑定多个类选择器,只需在class属性值中用空格分隔多个类名
.class-name {
    /* font: [字体样式] [字体变体] [字体粗细] 字体大小/[行高] 字体系列; */
    font: italic small-caps 700 22px/2 "Microsoft Yahei", Arial, sans-serif; /* 斜体 + 小型大写字母 + 粗体 + 22px字号/2倍行高 + 微软雅黑/Arial/无衬线字体 */
}

id选择器:匹配页面中唯一的、id 属性为该名称的元素(HTML 规范要求:一个页面中 id 必须唯一,不能重复)

#id-name {
    font: 22px "Microsoft Yahei", Arial, sans-serif;
}

通配符选择器:匹配页面中所有 HTML 元素(包括htmlbodydivp等所有标签)

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

关系选择器

后代选择器:匹配某个元素下所有层级的指定后代元素(包括子、孙、曾孙等),选择器之间用空格分隔,是最常用的层级选择器

/* 后代选择器:选中.card下所有层级的div标签(无论嵌套深度) */
.card div {
    color: #2d3748; /* 文本颜色:深灰蓝色(网页常用主文本色,视觉舒适) */
    text-shadow: 2px 2px 4px 1px rgba(0, 0, 0, 0.2) inset; /* 文本阴影:水平2px/垂直2px偏移,模糊4px,扩展1px,半透明黑色内阴影 */
    text-transform: capitalize; /* 文本大小写:首字母大写(可选none/uppercase/lowercase) */
    user-select: none; /* 禁止用户选中/复制文本(可选:auto/ text/ none/ all) */
}

子代选择器:仅匹配某个元素下直接子级的指定元素(仅子层级,不包含孙级及更深层级),选择器之间用>分隔,比后代选择器更精准

/* 子代选择器:仅选中.list下直接子级的div标签(孙级div不生效) */
.list > div {
    text-indent: 2em; /* 文本缩进:首行缩进2个字符宽度(中文段落标配,英文常用1em) */
    letter-spacing: 0.5px; /* 字符间距:字符间增加0.5px,12px以下小字号建议设0避免拥挤 */
    word-spacing: 1px; /* 单词间距:仅对空格分隔的英文单词生效,中文无影响 */
    text-align: justify; /* 文本对齐:整体两端对齐,需搭配text-justify控制对齐逻辑 */
    text-align-last: justify; /* 最后一行对齐:强制最后一行也两端对齐(默认left) */
    text-justify: inter-ideograph; /* 对齐算法:调整汉字/表意字符间距(中文专用,英文用inter-word) */
}

邻接兄弟选择器:匹配某个元素紧挨着的下一个同级兄弟元素(仅相邻的第一个),选择器之间用+分隔,需满足「同级、相邻、在后」三个条件

/* 邻接兄弟选择器:选中h2后紧邻的第一个同级p标签(仅第一个相邻p) */
h2 + p {
    text-decoration: underline wavy #f06292 2px; /* 复合属性:下划线 + 波浪样式 + 粉色 + 粗细2px(覆盖以下单属性,优先级更高) */
    text-decoration-line: underline; /* 装饰线类型:下划线(可选none/overline/line-through/combine-inherit) */
    text-decoration-style: wavy; /* 装饰线样式:波浪线(可选solid/dashed/dotted/double/wavy) */
    text-decoration-color: #f06292; /* 装饰线颜色:粉色(独立于文本color,可单独设置) */
    text-decoration-thickness: 2px; /* 装饰线粗细:2px(可选数值/百分比/auto/from-font) */
    
    text-underline-offset: 4px; /* 下划线偏移:距离文本基线4px(仅对underline生效) */
    text-underline-position: under; /* 下划线位置:在文本下方(可选auto/below/under/left/right,仅对underline生效) */
}

通用兄弟选择器:匹配某个元素之后所有同级的指定兄弟元素(不限相邻,只要是同级且在后),选择器之间用~分隔,覆盖范围比邻接兄弟选择器更广

/* 通用兄弟选择器:选中h2之后所有同级的div标签(无论是否相邻) */
h2 ~ div {
    text-emphasis: dot #f06292; /* 复合属性:强调标记样式(点)+ 颜色(粉色),覆盖以下单属性 */
    text-emphasis-style: dot; /* 强调标记样式:点(可选none/filled/open/dot/circle/disc/字符串/图标) */
    text-emphasis-color: #f06292; /* 强调标记颜色:粉色(默认继承文本color) */
    
    text-emphasis-position: over right; /* 标记位置:水平文本在上方,竖排文本在右侧(可选over/under + right/left) */
}

分组选择器

并集选择器:匹配多个选择器对应的所有元素(相当于“或”的逻辑),选择器之间用逗号分隔,核心优势是「代码复用」,可给多个不同选择器的元素设置相同样式。

/* 并集选择器:同时选中div标签、.card类、.feature类对应的所有元素 */
div, .card, .feature {
    background-color: #f8f9fa; /* 背景色:浅灰白(自定义值) */
    background-image: url("feature-bg.jpg"); /* 背景图片:自定义图片路径 */
    background-repeat: no-repeat; /* 背景重复:不重复(可选repeat/repeat-x/repeat-y/no-repeat/space/round) */
    background-attachment: scroll; /* 背景附着:随滚动条滚动(可选scroll/fixed/local) */
    background-position: center center; /* 背景位置:水平垂直居中(可选方位词/数值+单位) */
    /* background-position-x: center;  */ /* 背景水平位置:居中(可选方位词/数值+单位,拆分写法) */
    /* background-position-y: center;  */ /* 背景垂直位置:居中(可选方位词/数值+单位,拆分写法) */
    background-size: cover; /* 背景尺寸:覆盖容器(可选auto/length/percent/cover/contain) */
    background-origin: padding-box; /* 背景原点:从内边距盒开始显示(可选padding-box/border-box/content-box) */
    background-clip: content-box; /* 背景裁剪:仅在内容盒内显示(可选padding-box/border-box/content-box/text) */
    
    background-blend-mode: multiply; /* 背景混合模式:正片叠底(可选normal/multiply/screen/overlay等) */
    -webkit-background-blend-mode: multiply; /* 兼容webkit内核:正片叠底 */
    -moz-background-blend-mode: multiply; /* 兼容Firefox:正片叠底 */
}

交集选择器:匹配同时满足多个选择器条件的元素(相当于 “且” 的逻辑),选择器之间无分隔符拼接,核心特点是「精准匹配」,仅选中同时符合所有条件的元素

  • 单独的.active是纯类选择器,只有 “标签 + 类”“类 + 类” 等无分隔符拼接的组合才是交集选择器;ID 选择器因唯一性强,极少用于交集选择器
/* 交集选择器:仅选中同时是p标签且class包含.active的元素(标签+类) */
p.active {
    /* background复合简写:[颜色] [图片] [重复] [附着] [位置]/[尺寸] [原点] [裁剪] */
    background: #f8f9fa url("feature-bg.jpg") no-repeat scroll center center / cover padding-box content-box; /* 背景:浅灰白 + 自定义图片 + 不重复 + 随滚动条滚动 + 水平垂直居中/覆盖容器 + 内边距盒原点 + 内容盒裁剪 */
    
    background-blend-mode: multiply; /* 背景混合模式:正片叠底(可选normal/multiply/screen/overlay等) */
    -webkit-background-blend-mode: multiply; /* 兼容webkit内核:正片叠底 */
    -moz-background-blend-mode: multiply; /* 兼容Firefox:正片叠底 */
}

伪选择器

伪类选择器(:xxx

伪类核心是匹配元素的特殊状态、位置、关系,按用途可细分为 6 个子类,覆盖前端开发所有核心场景:

交互状态伪类(用户行为触发):匹配元素因用户交互产生的动态状态,是页面交互性的核心,需遵循特定书写顺序(如链接的 LVHA)。

选择器作用核心示例
:hover鼠标悬浮在元素上button:hover { background: #0056b3; transform: scale(1.02); }
:active元素被点击按下(未松开).btn:active { transform: scale(0.98); }(点击按压反馈)
:focus元素获取焦点(输入框/按钮)input:focus { border-color: #007bff; box-shadow: 0 0 0 2px rgba(0,123,255,0.25); }
:focus-visible仅在「键盘聚焦」时显示焦点样式a:focus-visible { outline: 2px solid #007bff; }(优化无障碍体验)
:link未访问的链接(仅<a>a:link { color: #007bff; text-decoration: none; }
:visited已访问的链接(仅<a>a:visited { color: #6c757d; }

结构位置伪类(DOM 结构匹配):根据元素在 DOM 树中的位置、层级匹配,是批量布局样式的核心,分为「通用子元素」和「同类型子元素」两类。

(1)通用子元素(匹配所有类型子元素)

选择器作用核心示例
:first-child父元素下第一个子元素(任意类型)ul > li:first-child { border-top: 1px solid #eee; }
:last-child父元素下最后一个子元素(任意类型)ul > li:last-child { border-bottom: 1px solid #eee; }
:nth-child(n)父元素下第 n 个子元素(n = 数字/even/odd/an+b)tr:nth-child(odd) { background: #f8f9fa; }(奇数行变色)
:nth-last-child(n)从后往前数第 n 个子元素li:nth-last-child(2) { color: #dc3545; }(倒数第二个 li)
:only-child父元素下唯一的子元素div:only-child { margin: 0 auto; }(唯一子元素居中)

(2)同类型子元素(仅匹配指定类型)

选择器作用核心示例
:first-of-type父元素下第一个指定类型的子元素article > p:first-of-type { font-size: 18px; }(第一个 p 标签放大)
:last-of-type父元素下最后一个指定类型的子元素article > img:last-of-type { margin-bottom: 0; }(最后一个 img 去外边距)
:nth-of-type(n)父元素下第 n 个指定类型的子元素section > h2:nth-of-type(3) { color: #007bff; }(第三个 h2 标蓝)
:nth-last-of-type(n)从后往前数第 n 个指定类型子元素div > span:nth-last-of-type(1) { font-weight: bold; }(最后一个 span 加粗)
:only-of-type父元素下唯一的指定类型子元素aside > p:only-of-type { padding: 10px; }(唯一 p 标签加内边距)

表单状态伪类(表单元素专属):匹配表单元素的特殊状态,是表单样式定制的核心。

选择器作用核心示例
:disabled禁用状态的表单元素input:disabled { background: #e9ecef; cursor: not-allowed; }
:enabled启用状态的表单元素input:enabled { border: 1px solid #ced4da; }
:checked勾选状态的单选 / 复选框input[type="checkbox"]:checked { accent-color: #007bff; }
:indeterminate半选状态的复选框(如全选框)#all-check:indeterminate { accent-color: #ffc107; }
:required带 required 属性的必填表单元素input:required { border-left: 3px solid #dc3545; }(必填项标红边)
:optional无 required 属性的可选表单元素input:optional { border-left: 3px solid #6c757d; }(可选项标灰边)
:valid验证通过的表单元素input:valid { border-color: #28a745; }(验证通过标绿)
:invalid验证失败的表单元素input:invalid { border-color: #dc3545; }(验证失败标红)
:read-only只读状态的表单元素input:read-only { background: #f8f9fa; color: #6c757d; }(只读灰底)
:read-write可读写状态的表单元素input:read-write { background: #fff; border-color: #ced4da; }(可写白底)
:in-range输入值在限定范围的表单元素input[type="number"]:in-range { border-color: #28a745; }(范围内标绿)
:out-of-range输入值超出限定范围的表单元素input[type="number"]:out-of-range { border-color: #dc3545; }(超范围标红)

否定伪类(排除选择):唯一的「反向选择」伪类,选中不满足条件的元素,可嵌套使用(CSS4)。

选择器作用核心示例
:not(selector)排除满足 selector 的元素p:not(.active):not(#intro) { color: #333; }(排除 active 类和 intro id 的 p)

文档状态伪类(页面/窗口状态):匹配整个文档/窗口的特殊状态,常用作全局样式控制。

选择器作用核心示例
:root匹配文档根元素(HTML):root { --main-color: #007bff; }(定义全局 CSS 变量)
:target匹配锚点定位的目标元素section:target { border: 2px solid #007bff; }(锚点跳转后高亮)

其他实用伪类

选择器作用核心示例
:empty无内容(含空格)的空元素div:empty { height: 20px; background: #f5f5f5; }(空元素占位)
:lang(xx)匹配指定语言的元素p:lang(en) { font-family: Arial; }(英文 p 标签用 Arial 字体)

伪元素选择器(::xxx

伪元素核心是创建虚拟元素或选中元素的「部分内容」,按用途细分 3 个子类:

内容插入伪元素(最常用):在元素内部插入虚拟内容,无实际 HTML 标签,仅 CSS 渲染,必须配合 content 属性(空值也需写 content: "",否则伪元素不生效。

选择器作用核心示例
::before元素内部最前方插入虚拟内容.tag::before { content: "🔖"; margin-right: 4px; }(标签前缀图标)
::after元素内部最后方插入虚拟内容.clearfix::after { content: ""; display: block; clear: both; }(清浮动)

文本片段伪元素(选中部分文本):仅选中元素内的特定文本片段,用于文本样式定制。

选择器作用核心示例
::first-letter元素内第一个字符.article p::first-letter { font-size: 2em; float: left; margin-right: 8px; }
::first-line元素内第一行文字.article p::first-line { font-weight: 700; color: #2c3e50; }
::selection用户选中的文本::selection { background: #ffc107; color: #fff; }(自定义选中文本样式,Webkit内核需加 -webkit- 前缀)
::placeholder输入框的占位符文本input::placeholder { color: #adb5bd; font-size: 14px; }

表单/滚动条伪元素(特殊场景):用于定制表单组件或滚动条的默认样式(部分需加浏览器前缀)。

选择器作用核心示例
::file-selector-button文件上传按钮input[type="file"]::file-selector-button { background: #007bff; color: #fff; }
::marker列表项(li)的标记符号li::marker { color: #007bff; font-size: 1.2em; }(自定义列表圆点颜色)
::scrollbar滚动条整体(需浏览器前缀)::-webkit-scrollbar { width: 6px; } (自定义滚动条宽度仅Webkit内核浏览器)

属性选择器

属性选择器通过匹配 HTML 元素的属性名属性值来选中元素,语法以方括号 [] 包裹,核心优势是:无需依赖 class/id,直接通过元素自带的属性精准选元素,是定制特殊元素样式的高效工具。

选择器格式匹配规则核心特点典型场景
[attr]匹配拥有attr属性的元素(无论属性值是什么)最宽松,仅判断属性存在选中所有带 disabled 的禁用元素
[attr="value"]匹配attr属性值完全等于value的元素精准匹配,值需完全一致选中 type="password" 的输入框
[attr*="value"]匹配attr属性值包含value字符串的元素模糊匹配,包含即可选中 src 含 "avatar" 的头像图片
[attr^="value"]匹配attr属性值以value开头的元素前缀匹配选中 href 以 "https://" 开头的链接
[attr$="value"]匹配attr属性值以value结尾的元素后缀匹配选中 src 以 ".png" 结尾的图片
[attr~="value"]匹配attr属性值包含独立的value单词(空格分隔)多值属性匹配(如class)选中 class 含独立单词 "active" 的元素
[attr|="value"]匹配attr属性值以value开头或value-开头的元素语言属性匹配(如lang)选中 lang="zh"/lang="zh-CN" 的中文文本