1. 选择器基础概念与分类
选择器是CSS中用于定位和选择HTML元素的模式。它们构成了CSS规则集的第一部分,决定了样式规则将应用于哪些元素。理解选择器的分类和工作原理是编写高效、可维护CSS代码的基础。
1.1 基本选择器类型
CSS选择器可以分为几个主要类别,每种类型针对不同的选择需求:
- 元素选择器:通过HTML标签名选择元素,如
p选择所有<p>元素 - 类选择器:通过class属性选择元素,如
.header选择所有class包含"header"的元素 - ID选择器:通过id属性选择唯一元素,如
#main选择id为"main"的元素 - 通用选择器:
*选择文档中的所有元素 - 属性选择器:通过元素的属性及属性值进行选择,如
[type="text"]
1.2 选择器优先级计算
当多个规则应用于同一个元素时,浏览器使用特定规则确定哪个样式声明具有最高优先级。优先级由选择器的类型和数量决定,计算规则如下:
- 内联样式:1000
- ID选择器:100
- 类/属性/伪类选择器:10
- 元素/伪元素选择器:1
- 通用选择器:0
注意:
!important声明会覆盖所有其他声明,但应谨慎使用,因为它破坏了CSS的级联特性。
2. 组合选择器与关系选择器
组合选择器允许我们基于元素之间的关系进行更精确的选择。
2.1 后代选择器(空格)
选择指定元素的所有后代元素,不论嵌套多深:
article p { color: #333; }这个例子会选择<article>元素内的所有<p>元素,无论它们嵌套在多少层其他元素中。
2.2 子元素选择器(>)
只选择直接子元素,不选择更深嵌套的元素:
ul > li { list-style: none; }这只会选择直接位于<ul>元素下的<li>元素,而不会选择嵌套在其他元素中的<li>。
2.3 相邻兄弟选择器(+)
选择紧接在另一个元素后的兄弟元素:
h2 + p { margin-top: 0; }这选择所有紧跟在<h2>元素后的<p>元素。
2.4 通用兄弟选择器(~)
选择某个元素之后的所有同级元素:
h2 ~ p { font-size: 0.9em; }这会选择与<h2>同级的、位于其后的所有<p>元素。
3. 伪类与伪元素选择器
伪类和伪元素选择器允许基于特定状态或文档结构选择元素。
3.1 常用伪类选择器
- :hover:鼠标悬停时的状态
- :active:元素被激活(如点击)时的状态
- :focus:元素获得焦点时的状态
- :first-child:作为父元素第一个子元素的元素
- :last-child:作为父元素最后一个子元素的元素
- :nth-child():选择特定位置的子元素
a:hover { text-decoration: underline; } tr:nth-child(odd) { background-color: #f5f5f5; }3.2 结构伪类选择器
结构伪类基于元素在文档树中的位置进行选择:
- :root:选择文档的根元素(通常是
<html>) - :empty:选择没有子元素的元素
- :not():否定选择器,选择不匹配指定选择器的元素
div:not(.special) { border: 1px solid #ddd; }3.3 伪元素选择器
伪元素选择器用于选择元素的特定部分:
- ::before:在元素内容前插入生成的内容
- ::after:在元素内容后插入生成的内容
- ::first-letter:选择元素的第一个字母
- ::first-line:选择元素的第一行
p::first-letter { font-size: 2em; float: left; }4. 属性选择器详解
属性选择器提供了基于元素属性及其值进行选择的强大方式。
4.1 基本属性选择器
[attr]:选择带有指定属性的元素[attr=value]:选择属性值完全等于指定值的元素[attr~=value]:选择属性值包含指定词(由空格分隔)的元素[attr|=value]:选择属性值以指定值开头(或后面跟着连字符)的元素
input[type="text"] { border: 1px solid #ccc; } a[href^="https"] { color: green; }4.2 子字符串匹配属性选择器
[attr^=value]:选择属性值以指定值开头的元素[attr$=value]:选择属性值以指定值结尾的元素[attr*=value]:选择属性值包含指定子字符串的元素
img[src$=".png"] { border: 1px solid #ddd; } div[class*="col-"] { float: left; }5. 编写稳定可靠选择器的实践技巧
5.1 选择器性能优化
浏览器从右向左解析CSS选择器,因此右侧的选择器应该尽可能具体:
- 避免过度使用通用选择器
- 避免深层嵌套的选择器(如
body div ul li a) - 尽量使用类选择器而非后代选择器
/* 不推荐 */ div.container ul.nav li a {} /* 推荐 */ .nav-link {}5.2 提高选择器的可维护性
- 使用语义化的类名(如
.primary-button而非.red-button) - 避免过度依赖HTML结构的选择器
- 使用BEM等命名约定保持一致性
- 为选择器添加注释说明其用途
/* 主按钮样式 - 用于主要操作 */ .btn--primary { background-color: #007bff; color: white; }5.3 避免常见的选择器陷阱
- 过度限定选择器:如
div.nav比.nav性能更差 - 滥用ID选择器:ID选择器优先级高,难以覆盖
- 忽略浏览器兼容性:某些新选择器(如
:focus-within)在旧浏览器中不支持 - 选择器特异性过高:导致样式难以复用和覆盖
5.4 响应式设计中的选择器策略
在媒体查询中使用相同的选择器可以保持样式的一致性:
.card { width: 100%; } @media (min-width: 768px) { .card { width: 50%; } }6. 高级选择器技巧与实战案例
6.1 组合使用选择器
通过组合不同类型的选择器可以实现更精确的选择:
/* 选择所有类包含"btn"但不是disabled的按钮 */ button.btn:not(:disabled) { cursor: pointer; } /* 选择表格中不是第一行的奇数行 */ tr:not(:first-child):nth-child(odd) { background-color: #f9f9f9; }6.2 表单元素选择技巧
表单元素通常需要特殊样式,可以使用属性选择器精确控制:
/* 所有文本输入框 */ input[type="text"], input[type="email"], input[type="password"] { padding: 8px; border: 1px solid #ddd; } /* 必填字段 */ input:required { border-left: 3px solid #ff9800; } /* 有效/无效输入 */ input:valid { border-color: #4caf50; } input:invalid { border-color: #f44336; }6.3 创建可复用的工具类
通过组合选择器创建实用工具类:
/* 外边距工具类 */ .mt-0 { margin-top: 0 !important; } .mt-1 { margin-top: 0.25rem !important; } .mt-2 { margin-top: 0.5rem !important; } /* 文本颜色工具类 */ .text-primary { color: #007bff; } .text-success { color: #28a745; } .text-danger { color: #dc3545; } /* 响应式显示工具类 */ .d-none { display: none; } .d-block { display: block; } @media (min-width: 768px) { .d-md-none { display: none; } .d-md-block { display: block; } }7. 选择器在现代化CSS框架中的应用
7.1 CSS自定义属性与选择器
结合CSS变量(自定义属性)和选择器可以实现动态主题切换:
:root { --primary-color: #007bff; --secondary-color: #6c757d; } .theme-dark { --primary-color: #0d6efd; --secondary-color: #5a6268; } .btn-primary { background-color: var(--primary-color); }7.2 现代布局中的选择器应用
在Grid和Flexbox布局中,选择器可以帮助定位特定位置的元素:
/* 选择Grid容器中第一列的所有项目 */ .grid-container > *:nth-child(3n+1) { grid-column: 1; } /* 选择Flex容器中最后一项 */ .flex-container > :last-child { margin-right: 0; }7.3 选择器与CSS动画
通过选择器触发不同的动画效果:
/* 悬停时放大 */ .card:hover { transform: scale(1.05); transition: transform 0.3s ease; } /* 点击时添加脉冲效果 */ .button:active { animation: pulse 0.5s; } @keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.1); } 100% { transform: scale(1); } }8. 选择器最佳实践总结
8.1 选择器编写原则
- 保持简洁:尽可能使用简单的选择器
- 语义化命名:类名应描述功能而非外观
- 适度特异性:避免创建过高特异性的选择器
- 考虑性能:避免过于复杂的选择器结构
- 保持一致性:在项目中采用统一的命名和选择器模式
8.2 选择器组织策略
- 按功能模块组织选择器
- 使用注释分隔不同的样式区块
- 将通用样式与特定样式分开
- 考虑使用CSS预处理器(如Sass)的嵌套功能
/* ====================== 按钮样式 ====================== */ /* 基础按钮样式 */ .btn { display: inline-block; padding: 0.5rem 1rem; border-radius: 4px; } /* 主按钮变体 */ .btn--primary { background-color: #007bff; color: white; } /* 大尺寸按钮 */ .btn--lg { padding: 0.75rem 1.5rem; font-size: 1.25rem; }8.3 未来选择器发展趋势
CSS选择器规范仍在不断发展,一些新兴的选择器包括:
- :has():选择包含特定子元素的父元素
- :focus-within:选择包含获得焦点子元素的元素
- :where():降低选择器特异性
- :is():简化选择器列表
/* 未来可能广泛支持的选择器示例 */ .card:has(img) { border: 1px solid #ddd; } form:focus-within { box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.25); } :where(article, section) h1 { margin-top: 0; }在实际项目中,应根据目标浏览器支持情况谨慎使用这些新选择器,必要时使用特性检测或渐进增强策略。