news 2026/5/11 1:42:58

前端必备:一文吃透CSS选择器,告别样式失效的烦恼

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前端必备:一文吃透CSS选择器,告别样式失效的烦恼

一、基础选择器(最常用,必须掌握)

1. 通配符选择器*

匹配页面中的所有元素。性能开销较大,通常用于重置样式或全局设置。

css

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

2. 标签选择器div

直接选中HTML标签。它的作用域很广,适合重置默认样式。

css

p { color: gray; line-height: 1.5; }

3. 类选择器.class

最灵活、最常用的选择器。可以给多个不同的元素赋予同一个类名,实现样式复用。

css

/* 选中所有 class="highlight" 的元素 */ .highlight { background-color: yellow; } /* 选中 class="btn primary" 的元素(组合类) */ .btn.primary { background-color: blue; }

4. ID选择器#id

页面中唯一的元素(理论上)。ID的优先级很高,通常用于锚点定位或JavaScript钩子,CSS中应尽量少用,以免导致优先级混乱。

css

#header { position: fixed; top: 0; }

二、层级与组合选择器(解决复杂嵌套)

当元素有层级关系时,需要区分“后代”、“儿子”、“兄弟”。

选择器符号含义示例
后代选择器空格选中所有符合条件的子孙元素div p选中div里的所有p
子代选择器>只选中直接儿子元素div > p只选儿子p,不管孙子
相邻兄弟+选中紧挨着的下一个兄弟h1 + p选紧跟在h1后面的第一个p
通用兄弟~选中之后的所有兄弟h1 ~ p选h1后面所有的兄弟p

实战案例:

css

/* 导航栏激活状态(只有直接子级 li.active) */ .nav > li.active { background: red; } /* 文章内,标题后面的第一个段落不需要首行缩进 */ h2 + p { text-indent: 0; }

三、属性选择器(动态精准匹配)

根据元素的属性属性值来选中元素,非常适用于输入框或自定义属性。

写法含义
[attr]只要包含该属性即可
[attr="value"]完全匹配
[attr^="val"]val开头
[attr$="val"]val结尾
[attr*="val"]包含val字符串
[attr~="val"]属性值是用空格隔开的列表,其中包含val

css

/* 选中所有 type="text" 的输入框 */ input[type="text"] { border: 1px solid #ccc; } /* 选中所有 href 以 https 开头的安全链接 */ a[href^="https"] { padding-right: 20px; background: url(lock.svg) no-repeat right; } /* 选中所有下载链接(以 .pdf .zip 等结尾) */ a[href$=".pdf"]::after { content: " [PDF]"; }

四、伪类选择器(基于状态与位置)

伪类以冒号:开头,用于选中处于特定状态的元素。

1. 动态伪类(交互状态)

css

/* 未访问链接 */ a:link { color: blue; } /* 鼠标悬停 */ button:hover { background: darkblue; } /* 点击瞬间 */ a:active { color: red; } /* 获得焦点 */ input:focus { outline: none; box-shadow: 0 0 5px gold; }

2. 结构伪类(重点中的重点)

无需添加额外的class,仅通过元素在DOM树中的位置进行选择。

css

/* 第一个孩子 */ li:first-child { font-weight: bold; } /* 最后一个孩子 */ li:last-child { border-bottom: none; } /* 第3个孩子 (从1开始计数) */ li:nth-child(3) { background: #eee; } /* 偶数行 (2n 或 even) */ tr:nth-child(even) { background: #f9f9f9; } /* 奇数行 (2n+1 或 odd) */ tr:nth-child(odd) { background: #fff; } /* 倒数第2个 */ li:nth-last-child(2) { color: red; } /* 同类型中的第1个(忽略其他类型元素干扰) */ p:first-of-type { font-size: 1.2em; }

注意:nth-child看所有兄弟,nth-of-type只看同标签的兄弟。

3. 表单相关伪类

css

/* 可用与禁用 */ input:enabled { background: white; } input:disabled { background: #eee; cursor: not-allowed; } /* 选中复选框或单选框时 */ input[type="checkbox"]:checked + span { text-decoration: line-through; } /* 输入有效/无效(配合pattern或required使用) */ input:valid { border-color: green; } input:invalid { border-color: red; } /* 必填项 */ input:required { border-left: 3px solid orange; }

4. 其他常用伪类

css

/* 否定伪类:排除某些元素 */ input:not([type="submit"]) { width: 100%; } /* 空元素 */ div:empty { display: none; }

五、伪元素选择器(制造虚拟内容)

伪元素以双冒号::开头,用于创建不在DOM树中的虚拟元素。

伪元素作用
::before在元素内容的最前面插入内容
::after在元素内容的最后面插入内容
::first-line选中块级元素的第一行
::first-letter选中第一个字(用于首字下沉)
::selection用户选中的文字样式

css

/* 经典用法:清除浮动 */ .clearfix::after { content: ""; display: table; clear: both; } /* 首字下沉 */ article p::first-letter { font-size: 3em; font-weight: bold; float: left; margin-right: 5px; } /* 自定义选中颜色 */ ::selection { background: #b0d4ff; color: #000; }

六、优先级规则(救急必看)

当多个选择器作用于同一个元素时,谁说了算?记住这个权重口诀:

内联样式 > ID > 类/属性/伪类 > 标签/伪元素

具体计算方式(4位数字):

  1. 千位:内联样式 (style="...") ——1000

  2. 百位:ID选择器 (#id) ——0100

  3. 十位:类、属性、伪类 (.class,[type],:hover) ——0010

  4. 个位:标签、伪元素 (div,::before) ——0001

css

/* 权重值计算示例 */ * {} /* 0 */ div {} /* 1 */ div p {} /* 2 (两个标签) */ .active {} /* 10 */ .nav li.active {} /* 21 (类+标签+类) */ #header {} /* 100 */

重要提示:!important会打破所有规则,除非是用来覆盖第三方库且你无计可施,否则千万别用

七、实战组合:写出更优雅的代码

css

/* 场景1:表格斑马纹且鼠标划过变高亮 */ tbody tr:nth-child(even):hover { background: #ffe0b3; cursor: pointer; } /* 场景2:除了最后一个按钮,其他的都加右边距 */ .button-group .btn:not(:last-child) { margin-right: 10px; } /* 场景3:自定义数据属性 */ [data-status="completed"] { opacity: 0.6; text-decoration: line-through; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 1:42:33

yz-bijini-cosplay问题解决:常见部署错误与快速排查

yz-bijini-cosplay问题解决:常见部署错误与快速排查 1. 部署前的环境检查 1.1 硬件要求确认 在部署yz-bijini-cosplay镜像前,首先需要确认硬件环境是否符合要求。这个镜像专为RTX 4090显卡优化,最低硬件要求如下: 显卡&#x…

作者头像 李华
网站建设 2026/5/11 1:41:08

golang如何实现Trace上下文传播_golang Trace上下文传播实现思路

Go 的 context.Context 不自带 Trace ID,需通过 context.WithValue 显式注入;必须在入口解析 traceparent 等 header 并用 otel.GetTextMapPropagator().Extract() 提取,失败时 fallback 创建 root span; outbound 请求须手动 Inj…

作者头像 李华
网站建设 2026/5/11 1:41:57

游戏论坛开题答辩全流程解析,Flutter + Ollama:开启本地AI的全平台新纪元 —— 从零剖析一款现代化AI客户端的技术奥秘。

开题答辩全流程解析:以 Puk苍白游戏论坛网为例 答辩准备阶段 1. 项目背景与选题意义 Puk苍白游戏论坛网定位为垂直游戏社区,解决现有平台信息过载、用户交互浅层化问题。选题意义需结合行业痛点: 游戏论坛用户黏性低,缺乏深度内容…

作者头像 李华
网站建设 2026/4/15 5:03:10

避坑!这些毕设太好抄了,3000+毕设案例推荐第1057期

571、基于Java的环保公共服务智慧管理系统的设计与实现(论文+代码+PPT)环保公共服务智慧管理系统主要功能包括:会员管理、通知管理、站内信管理、公告管理、回收站管理、任务管理、文件管理、回复管理、评论管理、投诉管理、建议管理、评价管…

作者头像 李华
网站建设 2026/4/15 5:03:09

如何将高层任务分解为可执行的动作序列?

在企业经营、项目管理或个人工作中,我们常面临“实现年度业绩增长30%”“完成一个新产品上线”“打造高效团队”这类高层任务。这类任务宏大、抽象,若直接落地,很容易陷入“无从下手”的困境,最终导致目标落空。其实,高…

作者头像 李华
网站建设 2026/4/15 5:02:11

如何在phpMyAdmin中处理特殊字符账号名的授权_反引号的正确包裹

反引号是MySQL解析含特殊字符用户名的硬性分隔符,phpMyAdmin不自动添加,需手动在用户名(如dev-2024)、主机名(如%)及GRANT语句中完整包裹,漏掉或误用单引号将导致语法错误或权限失效。phpMyAdmi…

作者头像 李华