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 标签名称直接匹配元素,例如 divh1a。这类选择器适用于全局样式定义,但优先级最低。

/* 为所有段落添加灰色背景 */
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 选择器是构建现代化网页的基石,其逻辑如同乐高积木般灵活可组合。从基础到高级的选择器,再到优先级与继承的权衡,开发者需通过实践逐步掌握“精准定位”的艺术。建议读者从简单项目起步,逐步尝试伪类、属性选择器等进阶功能,并养成通过开发者工具调试样式的习惯。记住:选择器的威力不在于复杂度,而在于对场景的精准匹配——正如一把好刀,既可轻柔雕刻,亦能果断劈开难题。

最新发布