CSS 选择器全解析:分组选择器/嵌套选择器,从基础到高级
一、CSS 选择器基础:从单个元素到多个元素
CSS 选择器是用来定位 HTML 元素的工具,就像 “元素的地址”。最基础的选择器有:
-
元素选择器(按标签名定位)
css
p { color: red; } /* 所有<p>标签 */ div { background: #f0f0f0; } /* 所有<div>标签 */
-
ID 选择器(按元素 ID 定位,唯一)
css
#header { height: 100px; } /* ID为header的元素 */
-
类选择器(按元素 class 定位,可重复)
css
.button { padding: 10px; } /* 所有class包含button的元素 */
-
属性选择器(按元素属性定位)
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 种:
-
后代选择器(用空格分隔)
选中某个元素内部所有层级的目标元素。css
.container p { color: blue; } /* .container内部的所有<p>元素 */
-
子选择器(用
>
分隔)
只选中某个元素的直接子元素(一级后代)。css
.parent > .child { font-weight: bold; } /* 只选.parent的直接子元素.child */
-
相邻兄弟选择器(用
+
分隔)
选中某个元素紧接其后的同级元素。css
h1 + p { margin-top: 20px; } /* 只选h1后面的第一个<p>元素 */
-
通用兄弟选择器(用
~
分隔)
选中某个元素后面所有同级的目标元素。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 中特殊的选择器,用于选中元素的特定状态或特定部分。
-
常见伪类(用单冒号
:
表示)css
a:hover { color: red; } /* 鼠标悬停状态 */ input:focus { border: 2px solid blue; } /* 获得焦点状态 */ li:nth-child(odd) { background: #f0f0f0; } /* 奇数行 */ p:first-child { font-size: 18px; } /* 第一个子元素 */
-
常见伪元素(用双冒号
::
表示)css
p::first-letter { font-size: 24px; } /* 首字母 */ p::before { content: "→ "; } /* 在元素前插入内容 */ p::after { content: " ←"; } /* 在元素后插入内容 */ ::selection { background: yellow; } /* 选中的文本 */
-
伪类与伪元素组合
css
/* 选中第一个段落的首字母 */ p:first-child::first-letter {color: red;font-size: 32px; }
六、选择器优先级:谁的样式会生效?
当多个选择器作用于同一元素时,CSS 会根据优先级规则决定使用哪个样式。
优先级从高到低:
- !important(强制优先级,但不推荐滥用)
- 内联样式(直接写在 HTML 元素的 style 属性中)
- ID 选择器(#id)
- 类 / 属性 / 伪类选择器(.class、[attr]、:hover)
- 元素 / 伪元素选择器(p、::before)
- 通配符选择器(*)
计算规则:
- 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 选择器?
-
避免过度嵌套
不要写超过 3 层的嵌套选择器(如.parent .child .grandchild
),会降低性能且难以维护。 -
优先使用类选择器
类选择器比元素选择器更灵活,更适合复用。 -
减少 ID 选择器的使用
ID 选择器优先级过高,容易导致样式冲突。 -
使用有意义的类名
如.btn-primary
比.a1
更易理解。 -
利用组合选择器
用.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;
}
通过掌握分组选择器、嵌套选择器和复杂组合,你可以精准控制网页中每一个元素的样式。建议多动手实践,在实际项目中加深理解!
相关文章:
CSS 选择器全解析:分组选择器/嵌套选择器,从基础到高级
一、CSS 选择器基础:从单个元素到多个元素 CSS 选择器是用来定位 HTML 元素的工具,就像 “元素的地址”。最基础的选择器有: 元素选择器(按标签名定位) css p { color: red; } /* 所有<p>标签 */ div { b…...
uniapp 对接腾讯云IM群公告功能
UniApp 实战:腾讯云IM群公告功能 一、前言 在即时通讯场景中,群公告是信息同步的重要渠道。本文将基于uniapp框架,结合腾讯云IM SDK,详细讲解如何实现群公告的发布、修改、历史记录查询等核心功能。 群公告的数据结构设计权限校…...

垂起固定翼无人机应用及技术分析
一、主要应用行业 1. 能源基础设施巡检 电力巡检:适用于超高压输电线路通道的快速巡查,实时回传数据提升智能运检效率。 油田管道监测:利用长航时特性(1.5-2小时)对大范围管道进行隐患排查,减少人力巡…...
Python Robot Framework【自动化测试框架】简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

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…...
c#bitconverter操作,不同变量类型转byte数组
缘起:串口数据传输的基础是byte数组,write(buff,0,num)或者writeline(string),如果是字符串传输就是string变量就可以了,但是在modbus这类hex传递时,就要遇到转换了,拼凑byte数组时需要各种变量的值传递,解…...

【Linux】LInux下第一个程序:进度条
前言: 在前面的文章中我们学习了LInux的基础指令 【Linux】初见,基础指令-CSDN博客【Linux】初见,基础指令(续)-CSDN博客 学习了vim编辑器【Linux】vim编辑器_linux vim insert-CSDN博客 学习了gcc/g【Linux】编译器gc…...

RPA+AI:自动化办公机器人开发指南
RPAAI:自动化办公机器人开发指南 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 RPAAI:自动化办公机器人开发指南摘要引言技术融合路径1. 传感器层:多模态数据接入2. 决策层&…...
daz3d + PBRSkin (MDL)+ SSS
好的,我们来解释一下 Daz3D 中的 PBRSkin (MDL) Shader。 简单来说,PBRSkin (MDL) 是 Daz Studio 中一种基于物理渲染(PBR)技术、专门用于创建高度逼真人物皮肤效果的着色器(Shader)。 它利用 NVIDIA 的材…...
计算矩阵A和B的乘积
根据矩阵乘法规则,编程计算矩阵的乘积。函数fix_prod_ele()是基本方法编写,函数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 - 物理属性
接下来随着教程学习碰撞部分,当粒子较为复杂或者下载了一些粒子模板进行修改时,会遇到一些较奇怪问题,如粒子穿透等,这些问题实际上可以通过调节参数解决。 hip资源文件:https://download.csdn.net/download/grayrail…...

每日Prompt:双重曝光
提示词 新中式,这幅图像将人体头像轮廓与山水中式建筑融为一体,双重曝光,体现了反思、内心平静以及人与自然相互联系的主题,靛蓝,水墨画,晕染,极简...
sendDefaultImpl call timeout(rocketmq)
rocketmq 连接异常 senddefaultimpl call timeout-腾讯云开发者社区-腾讯云 第一种情况: 修改broker 的配置如下,注意brokerIP1 这个配置必须有,不然 rocketmq-console 显示依然是内网地址 caused by: org.apache.rocketmq.remoting.excep…...

【LLM】多智能体系统 Why Do Multi-Agent LLM Systems Fail?
note 构建一个成功的 MAS,不仅仅是提升底层 LLM 的智能那么简单,它更像是在构建一个组织。如果组织结构、沟通协议、权责分配、质量控制流程设计不当,即使每个成员(智能体)都很“聪明”,整个系统也可能像一…...

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

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

如何把 Mac Finder 用得更顺手?——高效文件管理定制指南
系统梳理提升 Mac Finder 体验的实用设置与技巧,助你用更高效的方式管理文件。文末引出进阶选择 Path Finder。 阅读原文请转到:https://jimmysong.io/blog/customize-finder-for-efficiency/ 作为一个用 Mac 多年的用户,我始终觉得 Finder 虽…...
赋能大型语言模型与外部世界交互——函数调用的崛起
大型语言模型 (LLM) 近年来在自然语言处理领域取得了革命性的进展,展现出强大的文本理解、生成和对话能力。然而,这些模型在与外部实时数据源和动态系统交互方面存在固有的局限性 1。它们主要依赖于训练阶段学习到的静态知识,难以直接访问和利…...
04 Deep learning神经网络编程基础 梯度下降 --吴恩达
梯度下降在深度学习的应用 梯度下降是优化神经网络参数的核心算法,通过迭代调整参数最小化损失函数。 核心公式 参数更新规则: θ t + 1 = θ t − η ∇ J ( θ...

手拉手处理RuoYi脚手架常见文问题
若依前后端分离版开发入门 基础环境:JDK1.8mysqlRedisMavenVue 取消登录验证码 后端 修改ruoyi-ui项目中的login.vue 在ruoyi-ui项目>src>views中找到login.vue文件 1、注释验证码展示及录入部分 2、 注释code必填校验,默认验证码开关为false …...
录制mp4
目录 单线程保存mp4 多线程保存mp4 rtsp ffmpeg录制mp4 单线程保存mp4 import cv2 import imageiocv2.namedWindow(photo, 0) # 0窗口大小可以任意拖动,1自适应 cv2.resizeWindow(photo, 1280, 720) url "rtsp://admin:aa123456192.168.1.64/h264/ch1/main…...
Dynamics 365 Finance + Power Automate 自动化凭证审核
🚀 Dynamics 365 Finance Power Automate 自动化凭证审核 📑 目录 🚀 Dynamics 365 Finance Power Automate 自动化凭证审核1. 依赖 🔧2. 目标 🎯3. 系统架构 🏗️4. 凭证审批全流程 🛠️4.1 …...
使用 Python + SQLAlchemy 创建知识库数据库(SQLite)—— 构建本地知识库系统的基础《一》
📚 使用 Python SQLAlchemy 创建知识库数据库(SQLite)—— 构建本地知识库系统的基础 🧠 一、前言 随着大模型技术的发展,越来越多的项目需要构建本地知识库系统来支持 RAG(Retrieval-Augmented Generat…...

使用柏林噪声生成随机地图
简单介绍柏林噪声 柏林噪声(Perlin Noise)是一种由 Ken Perlin 在1983年提出的梯度噪声(Gradient Noise)算法,用于生成自然、连续的随机值。它被广泛用于计算机图形学中模拟自然现象(如地形、云层、火焰等…...
P3 QT记事本(3.4)
3.4 文件选择对话框 QFileDialog 3.4.1 QFileDialog 开发流程 使用 QFileDialog 的基本步骤通常如下: 实例化 :首先,创建一个 QFileDialog 对象的实例。 QFileDialog qFileDialog;设置模式 :根据需要设置对话框的模式&…...

C++课设:实现简易文件加密工具(凯撒密码、异或加密、Base64编码)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、初识文件加密:为什么需要…...

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

构建 MCP 服务器:第 3 部分 — 添加提示
这是我们构建 MCP 服务器的四部分教程的第三部分。在第一部分中,我们使用基本资源创建了第一个MCP 服务器;在第二部分中,我们添加了资源模板并改进了代码组织。现在,我们将进一步重构代码并添加提示功能。 什么是 MCP 提示&#…...
xcode 各版本真机调试包下载
下载地址 https://github.com/filsv/iOSDeviceSupport 使用方法: 添加到下面路径中,然后退出重启xcode /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport...

基于React + FastAPI + LangChain + 通义千问的智能医疗问答系统
📌 文章摘要: 本文详细介绍了如何在前端通过 Fetch 实现与 FastAPI 后端的 流式响应通信,并支持图文多模态数据上传。通过构建 multipart/form-data 请求,配合 ReadableStream 实时读取 AI 回复内容,实现类似 ChatGPT…...