CSS 选择器全解析:分组选择器/嵌套选择器,从基础到高级

news2025/6/8 15:02:24

一、CSS 选择器基础:从单个元素到多个元素

CSS 选择器是用来定位 HTML 元素的工具,就像 “元素的地址”。最基础的选择器有:

  1. 元素选择器(按标签名定位)

    css

    p { color: red; }       /* 所有<p>标签 */
    div { background: #f0f0f0; } /* 所有<div>标签 */
    
  2. ID 选择器(按元素 ID 定位,唯一)

    css

    #header { height: 100px; } /* ID为header的元素 */
    
  3. 类选择器(按元素 class 定位,可重复)

    css

    .button { padding: 10px; } /* 所有class包含button的元素 */
    
  4. 属性选择器(按元素属性定位)

    css

    [type="text"] { border: 1px solid #ccc; } /* 所有type="text"的元素 */
    
二、CSS 分组选择器:同时选中多个元素

分组选择器允许你用 ** 逗号 (,)** 将多个选择器组合,为它们应用相同的样式。
语法

css

选择器1, 选择器2, 选择器3 {
  属性: 值;
}

示例 1:同时设置 h1、h2、h3 的字体颜色

css

h1, h2, h3 {
  color: #333;
  font-family: Arial;
}

示例 2:混合不同类型的选择器

css

#header, .nav-item, [type="button"] {
  margin-bottom: 10px;
}

分组选择器的优势

  • 减少 CSS 代码重复
  • 统一管理相似元素的样式
  • 提高代码可读性

三、CSS 嵌套选择器:基于层级关系定位元素

嵌套选择器(也叫组合选择器)通过元素之间的层级关系来定位元素。
常见的嵌套选择器有 4 种:

  1. 后代选择器(用空格分隔)
    选中某个元素内部所有层级的目标元素。

    css

    .container p { color: blue; } /* .container内部的所有<p>元素 */
    
  2. 子选择器(用>分隔)
    只选中某个元素的直接子元素(一级后代)。

    css

    .parent > .child { font-weight: bold; } /* 只选.parent的直接子元素.child */
    
  3. 相邻兄弟选择器(用+分隔)
    选中某个元素紧接其后的同级元素。

    css

    h1 + p { margin-top: 20px; } /* 只选h1后面的第一个<p>元素 */
    
  4. 通用兄弟选择器(用~分隔)
    选中某个元素后面所有同级的目标元素。

    css

    img ~ p { color: gray; } /* 选img后面所有同级的<p>元素 */
    

嵌套选择器示例

html

<div class="container">
  <h2>标题</h2>
  <p>第一段</p>    <!-- 会被选中 -->
  <div>
    <p>第二段</p>  <!-- 会被选中 -->
  </div>
</div>

css

.container p { color: red; } /* 选中所有层级的<p> */
.container > p { color: blue; } /* 只选中直接子级的<p>(第一段) */
四、复杂 CSS 写法:组合多种选择器

实际开发中,我们常将多种选择器组合使用,实现更精准的元素定位。

1. 组合类选择器和元素选择器

css

/* 选中class为btn且是<button>标签的元素 */
button.btn {
  background: #007bff;
  color: white;
}
2. 多层嵌套选择器

css

/* 选中.header内部的.nav列表中的.active菜单项 */
.header .nav .active {
  font-weight: bold;
  color: #ff6600;
}
3. 属性和伪类组合

css

/* 选中所有disabled状态的输入框 */
input[disabled] {
  background: #eee;
  cursor: not-allowed;
}
4. 复杂示例:表单样式

css

/* 选中form中所有type为text的input的父级元素 */
form .form-group > input[type="text"] {
  width: 100%;
  padding: 8px;
  border: 1px solid #ccc;
  border-radius: 4px;
}

/* 选中焦点状态的input,并改变其父级的样式 */
form .form-group input:focus + label {
  color: #007bff;
}
五、伪类和伪元素:特殊状态与特殊位置

伪类伪元素是 CSS 中特殊的选择器,用于选中元素的特定状态特定部分

  1. 常见伪类(用单冒号:表示)

    css

    a:hover { color: red; }       /* 鼠标悬停状态 */
    input:focus { border: 2px solid blue; } /* 获得焦点状态 */
    li:nth-child(odd) { background: #f0f0f0; } /* 奇数行 */
    p:first-child { font-size: 18px; } /* 第一个子元素 */
    
  2. 常见伪元素(用双冒号::表示)

    css

    p::first-letter { font-size: 24px; } /* 首字母 */
    p::before { content: "→ "; } /* 在元素前插入内容 */
    p::after { content: " ←"; } /* 在元素后插入内容 */
    ::selection { background: yellow; } /* 选中的文本 */
    
  3. 伪类与伪元素组合

    css

    /* 选中第一个段落的首字母 */
    p:first-child::first-letter {
      color: red;
      font-size: 32px;
    }
    
六、选择器优先级:谁的样式会生效?

当多个选择器作用于同一元素时,CSS 会根据优先级规则决定使用哪个样式。
优先级从高到低

  1. !important(强制优先级,但不推荐滥用)
  2. 内联样式(直接写在 HTML 元素的 style 属性中)
  3. ID 选择器(#id)
  4. 类 / 属性 / 伪类选择器(.class、[attr]、:hover)
  5. 元素 / 伪元素选择器(p、::before)
  6. 通配符选择器(*)

计算规则

  • ID 选择器:100 分
  • 类 / 属性 / 伪类:10 分
  • 元素 / 伪元素:1 分
  • 通配符:0 分

示例

css

#header { color: red; } /* 100分 */
.header h1 { color: blue; } /* 11分(1个类 + 1个元素) */
h1 { color: green; } /* 1分 */

最终 h1 的颜色是red(100 分优先级最高)。

七、最佳实践:如何写出高效的 CSS 选择器?
  1. 避免过度嵌套
    不要写超过 3 层的嵌套选择器(如.parent .child .grandchild),会降低性能且难以维护。

  2. 优先使用类选择器
    类选择器比元素选择器更灵活,更适合复用。

  3. 减少 ID 选择器的使用
    ID 选择器优先级过高,容易导致样式冲突。

  4. 使用有意义的类名
    .btn-primary.a1更易理解。

  5. 利用组合选择器
    .container > h2代替.container h2,精准定位减少误选。

八、完整示例:电商网站导航栏样式

html

预览

<nav class="main-nav">
  <ul>
    <li><a href="#" class="active">首页</a></li>
    <li><a href="#">商品分类</a></li>
    <li class="has-submenu">
      <a href="#">促销活动</a>
      <ul class="submenu">
        <li><a href="#">限时折扣</a></li>
        <li><a href="#">满减优惠</a></li>
      </ul>
    </li>
  </ul>
</nav>

css

/* 导航栏容器 */
.main-nav {
  background: #333;
  height: 50px;
}

/* 主菜单列表 */
.main-nav > ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

/* 主菜单项 */
.main-nav > ul > li {
  display: inline-block;
  position: relative;
}

/* 主菜单链接 */
.main-nav > ul > li > a {
  display: block;
  color: white;
  padding: 0 15px;
  line-height: 50px;
  text-decoration: none;
}

/* 激活状态的链接 */
.main-nav > ul > li > a.active {
  background: #007bff;
}

/* 鼠标悬停效果 */
.main-nav > ul > li > a:hover {
  background: #555;
}

/* 子菜单容器 */
.has-submenu .submenu {
  display: none;
  position: absolute;
  background: #555;
  width: 150px;
}

/* 子菜单项 */
.has-submenu:hover .submenu {
  display: block;
}

/* 子菜单链接 */
.submenu li a {
  display: block;
  color: white;
  padding: 10px 15px;
  text-decoration: none;
}

/* 子菜单链接悬停 */
.submenu li a:hover {
  background: #777;
}

通过掌握分组选择器、嵌套选择器和复杂组合,你可以精准控制网页中每一个元素的样式。建议多动手实践,在实际项目中加深理解!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2404238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

垂起固定翼无人机应用及技术分析

一、主要应用行业 1. 能源基础设施巡检 电力巡检&#xff1a;适用于超高压输电线路通道的快速巡查&#xff0c;实时回传数据提升智能运检效率。 油田管道监测&#xff1a;利用长航时特性&#xff08;1.5-2小时&#xff09;对大范围管道进行隐患排查&#xff0c;减少人力巡…

vite配置@别名,以及如何让IDE智能提示路经

1.配置路径(vite.config.js) // vite.config.js import { defineConfig } from "vite"; import vue from "vitejs/plugin-vue"; import path from "path";// https://vite.dev/config/ export default defineConfig({server: {port: 8080,},plu…

【Linux】LInux下第一个程序:进度条

前言&#xff1a; 在前面的文章中我们学习了LInux的基础指令 【Linux】初见&#xff0c;基础指令-CSDN博客【Linux】初见&#xff0c;基础指令&#xff08;续&#xff09;-CSDN博客 学习了vim编辑器【Linux】vim编辑器_linux vim insert-CSDN博客 学习了gcc/g【Linux】编译器gc…

RPA+AI:自动化办公机器人开发指南

RPAAI&#xff1a;自动化办公机器人开发指南 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 RPAAI&#xff1a;自动化办公机器人开发指南摘要引言技术融合路径1. 传感器层&#xff1a;多模态数据接入2. 决策层&…

计算矩阵A和B的乘积

根据矩阵乘法规则&#xff0c;编程计算矩阵的乘积。函数fix_prod_ele()是基本方法编写&#xff0c;函数fix_prod_opt()是优化方法编写。 程序代码 #define N 3 #define M 4 typedef int fix_matrix1[N][M]; typedef int fix_matrix2[M][N]; int fix_prod_ele(f…

Houdini POP入门学习05 - 物理属性

接下来随着教程学习碰撞部分&#xff0c;当粒子较为复杂或者下载了一些粒子模板进行修改时&#xff0c;会遇到一些较奇怪问题&#xff0c;如粒子穿透等&#xff0c;这些问题实际上可以通过调节参数解决。 hip资源文件&#xff1a;https://download.csdn.net/download/grayrail…

每日Prompt:双重曝光

提示词 新中式&#xff0c;这幅图像将人体头像轮廓与山水中式建筑融为一体&#xff0c;双重曝光&#xff0c;体现了反思、内心平静以及人与自然相互联系的主题&#xff0c;靛蓝&#xff0c;水墨画&#xff0c;晕染&#xff0c;极简

【LLM】多智能体系统 Why Do Multi-Agent LLM Systems Fail?

note 构建一个成功的 MAS&#xff0c;不仅仅是提升底层 LLM 的智能那么简单&#xff0c;它更像是在构建一个组织。如果组织结构、沟通协议、权责分配、质量控制流程设计不当&#xff0c;即使每个成员&#xff08;智能体&#xff09;都很“聪明”&#xff0c;整个系统也可能像一…

CSS 定位:原理 + 场景 + 示例全解析

一. 什么是CSS定位? CSS中的position属性用于设置元素的定位方式,它决定了元素在页面中的"定位行为" 为什么需要定位? 常规布局(如 display: block)适用于主结构 定位适用于浮动按钮,弹出层,粘性标题等场景帮助我们精确控制元素在页面中的位置 二. 定位类型全…

如何在没有 iTunes 的情况下备份 iPhone

我可以在没有 iTunes 的情况下将 iPhone 备份到电脑吗&#xff1f;虽然 iTunes 曾经是备份 iPhone 的主要方法&#xff0c;但它并不是 iOS 用户唯一的备份选项。您可以选择多种方便的替代方案来备份 iPhone&#xff0c;无需使用 iTunes。您可以在这里获得更灵活、更人性化的备份…

如何把 Mac Finder 用得更顺手?——高效文件管理定制指南

系统梳理提升 Mac Finder 体验的实用设置与技巧&#xff0c;助你用更高效的方式管理文件。文末引出进阶选择 Path Finder。 阅读原文请转到&#xff1a;https://jimmysong.io/blog/customize-finder-for-efficiency/ 作为一个用 Mac 多年的用户&#xff0c;我始终觉得 Finder 虽…

手拉手处理RuoYi脚手架常见文问题

若依前后端分离版开发入门 基础环境&#xff1a;JDK1.8mysqlRedisMavenVue 取消登录验证码 后端 修改ruoyi-ui项目中的login.vue 在ruoyi-ui项目>src>views中找到login.vue文件 1、注释验证码展示及录入部分 2、 注释code必填校验&#xff0c;默认验证码开关为false …

使用柏林噪声生成随机地图

简单介绍柏林噪声 柏林噪声&#xff08;Perlin Noise&#xff09;是一种由 Ken Perlin 在1983年提出的梯度噪声&#xff08;Gradient Noise&#xff09;算法&#xff0c;用于生成自然、连续的随机值。它被广泛用于计算机图形学中模拟自然现象&#xff08;如地形、云层、火焰等…

C++课设:实现简易文件加密工具(凯撒密码、异或加密、Base64编码)

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《编程项目实战》 目录 一、初识文件加密&#xff1a;为什么需要…

H_Prj06_03 8088单板机串口读取8088ROM复位内存

1.8088CPU复位时&#xff0c;CSFFFFH,IP0000H,因此在ROM的逻辑地址FFFF&#xff1a;0000&#xff08;FFF0H&#xff09;处一般要防止一个长跳转指令LJMP&#xff08;机器码位EAH&#xff09; 2.写一个完整的8086汇编程序&#xff0c;通过查询方式检测串口接收符串‘r’&#x…

构建 MCP 服务器:第 3 部分 — 添加提示

这是我们构建 MCP 服务器的四部分教程的第三部分。在第一部分中&#xff0c;我们使用基本资源创建了第一个MCP 服务器&#xff1b;在第二部分中&#xff0c;我们添加了资源模板并改进了代码组织。现在&#xff0c;我们将进一步重构代码并添加提示功能。 什么是 MCP 提示&#…

基于React + FastAPI + LangChain + 通义千问的智能医疗问答系统

&#x1f4cc; 文章摘要&#xff1a; 本文详细介绍了如何在前端通过 Fetch 实现与 FastAPI 后端的 流式响应通信&#xff0c;并支持图文多模态数据上传。通过构建 multipart/form-data 请求&#xff0c;配合 ReadableStream 实时读取 AI 回复内容&#xff0c;实现类似 ChatGPT…

C# 中替换多层级数据的 Id 和 ParentId,保持主从或父子关系不变

在C#中替换多层级数据的Id和ParentId&#xff0c;同时保持父子关系不变&#xff0c;可以通过以下步骤实现&#xff1a; 创建旧Id到新Id的映射&#xff1a;遍历所有节点&#xff0c;为每个旧Id生成唯一的新Id&#xff0c;并存储在字典中。 替换节点的Id和ParentId&#xff1a;…

PG 分区表的缺陷

简介 好久没发文&#xff0c;是最近我实在不知道写点啥。随着国产化进程&#xff0c;很多 oracle 都在进行迁移&#xff0c;最近遇到了一个分区表迁移之后唯一性的问题。oracle 数据库中创建主键或者唯一索引&#xff0c;不需要引用分区键&#xff0c;但是 PG 就不行&#xff…

从Copilot到Agent,AI Coding是如何进化的?

编程原本是一项具有一定门槛的技能&#xff0c;但借助 AI Coding 产品&#xff0c;新手也能写出可运行的代码&#xff0c;非专业人员如业务分析师、产品经理&#xff0c;也能在 AI 帮助下直接生成简单应用。 这一演变对软件产业产生了深远影响。当 AI 逐步参与代码生成、调试乃…