css 选择器(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
- 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在网页开发中,CSS 选择器如同设计师手中的画笔,精准地定位 HTML 元素并赋予其样式。无论是初学者还是中级开发者,掌握选择器的逻辑与技巧,都是提升代码效率与页面美观度的关键。本文将通过循序渐进的方式,结合生活化的比喻和代码示例,系统解析 CSS 选择器的核心概念与应用场景,帮助读者构建清晰的思维框架。
基础选择器:元素、类与 ID
元素选择器
元素选择器通过 HTML 标签名称直接匹配元素,例如 div
、h1
或 a
。这类选择器适用于全局样式定义,但优先级最低。
/* 为所有段落添加灰色背景 */
p {
background-color: #f0f0f0;
}
比喻:如同给所有“书架”统一刷漆,简单直接但缺乏针对性。
类选择器与 ID 选择器
类选择器(.
)和 ID 选择器(#
)通过自定义名称定位元素,提供更高的灵活性与优先级。
/* 类选择器:为按钮添加圆角 */
.button {
border-radius: 8px;
}
/* ID 选择器:唯一标识导航栏 */
#navbar {
position: fixed;
top: 0;
width: 100%;
}
关键区别:
- 类选择器可重复使用,适合同类元素的批量样式(如多个按钮);
- ID 选择器必须唯一,适用于页面中唯一存在的元素(如页脚)。
组合选择器:构建元素关系网
组合选择器通过逻辑符号连接多个选择器,实现对元素层级关系的精准控制。
后代选择器(空格)
空格表示“包含”关系,类似于“祖孙”或“父子”元素的关联。
/* 为导航栏内的所有链接设置颜色 */
#navbar a {
color: white;
}
比喻:如同在家庭聚会中,所有“孙子辈”成员都继承“祖辈”的餐桌礼仪规则。
子选择器(>)
>
符号限定直接子元素,避免深层嵌套的样式污染。
/* 仅选中直接子级的列表项 */
ul > li {
padding: 10px;
}
对比案例:
<ul>
<li>一级列表</li>
<li>
<ul>
<li>二级列表</li>
</ul>
</li>
</ul>
若使用后代选择器 ul li
,二级列表也会被选中;而 ul > li
仅影响一级列表项。
相邻兄弟选择器(+)与通用兄弟选择器(~)
+
选择紧邻的下一个兄弟元素,~
选择所有后续兄弟元素。
/* 点击按钮后,显示相邻的输入框 */
button + input {
display: none;
}
/* 鼠标悬停时,高亮所有后续列表项 */
li:hover ~ li {
background: lightblue;
}
比喻:相邻兄弟如同“紧挨着的座位”,而通用兄弟是“同一排后面的所有座位”。
伪类与伪元素:为动态交互赋形
伪类(:
)和伪元素(::
)允许开发者为元素的特定状态或部分定义样式,无需额外 HTML 结构。
常见伪类示例
/* 鼠标悬停时改变链接颜色 */
a:hover {
color: red;
}
/* 未访问过的链接样式 */
a:link {
text-decoration: none;
}
/* 禁用按钮的样式 */
button:disabled {
opacity: 0.5;
}
伪元素的巧妙应用
伪元素通过 ::before
和 ::after
在元素前后插入内容,常用于装饰或布局优化。
/* 在段落前添加图标 */
p::before {
content: "💡 ";
color: orange;
}
/* 创建纯 CSS 三角形 */
.arrow::after {
content: "";
border-style: solid;
border-width: 10px 10px 0 10px;
border-color: black transparent transparent transparent;
position: absolute;
bottom: 0;
left: 50%;
margin-left: -10px;
}
属性选择器:精准匹配元素特征
属性选择器通过元素的 HTML 属性进行筛选,适用于动态内容或需特定条件的场景。
基础匹配与模糊匹配
/* 选择所有带有 target 属性的链接 */
a[target] {
padding: 5px;
}
/* 选择 href 以 ".pdf" 结尾的链接 */
a[href$=".pdf"] {
background-image: url(pdf-icon.png);
}
/* 选择 class 包含 "menu" 的元素 */
div[class*="menu"] {
border: 1px solid #ccc;
}
符号含义:
[attr]
:存在属性;[attr=value]
:精确匹配;[attr^=value]
:以值开头;[attr$=value]
:以值结尾;[attr*=value]
:包含值。
结构化伪类:无需 JavaScript 的动态样式
结构化伪类通过元素在文档中的位置或关系触发样式,常用于替代简单 JavaScript 功能。
常用场景
/* 首个列表项添加背景色 */
ul li:first-child {
background: lightgreen;
}
/* 最后一个子元素居中对齐 */
.container > :last-child {
text-align: center;
}
/* 偶数行条纹效果 */
table tr:nth-child(even) {
background: #f5f5f5;
}
:not() 的逆向选择
通过 :not()
排除特定元素,例如隐藏所有非链接的列表项:
li:not(a) {
display: none;
}
优先级与继承:控制样式的“权力游戏”
CSS 的优先级规则决定了样式最终如何应用,需合理利用以避免冲突。
优先级计算规则
- 内联样式(
style
属性):1000 分; - ID 选择器:100 分;
- 类、属性选择器:1!important 除外;
- 元素选择器:1 分;
!important
:覆盖一切,但需谨慎使用。
继承的双刃剑
某些属性(如 color
)会自动继承父元素样式,而其他属性(如 padding
)则不会。
/* 父级字体大小影响所有文本 */
.container {
font-size: 16px;
}
/* 子级需重置 padding 避免继承 */
.child {
padding: 0;
}
实战案例:构建响应式导航栏
结合上述知识点,实现一个带下拉菜单的导航栏:
/* 基础布局 */
#navbar {
display: flex;
justify-content: space-between;
padding: 1rem;
}
/* 导航项默认样式 */
#navbar a {
padding: 0.5rem;
text-decoration: none;
}
/* 鼠标悬停时显示下拉菜单 */
.dropdown:hover > .submenu {
display: block;
}
/* 子菜单初始隐藏 */
.submenu {
display: none;
position: absolute;
background: white;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
/* 子菜单项间距 */
.submenu li {
padding: 0.5rem;
}
/* 伪元素添加箭头 */
.dropdown::after {
content: "▼";
margin-left: 5px;
}
HTML 结构:
<nav id="navbar">
<a href="/">首页</a>
<div class="dropdown">
<a>产品</a>
<ul class="submenu">
<li><a href="/products/a">产品 A</a></li>
<li><a href="/products/b">产品 B</a></li>
</ul>
</div>
</nav>
结论
CSS 选择器是构建现代化网页的基石,其逻辑如同乐高积木般灵活可组合。从基础到高级的选择器,再到优先级与继承的权衡,开发者需通过实践逐步掌握“精准定位”的艺术。建议读者从简单项目起步,逐步尝试伪类、属性选择器等进阶功能,并养成通过开发者工具调试样式的习惯。记住:选择器的威力不在于复杂度,而在于对场景的精准匹配——正如一把好刀,既可轻柔雕刻,亦能果断劈开难题。