当前位置: 首页 > news >正文

CSS 选择器完全指南:从基础到高级的全面解析

CSS 选择器是样式表的核心组成部分,它决定了样式规则应用到哪些 HTML 元素上。掌握各种选择器的用法,能够让你更精准、更高效地编写 CSS 代码。本文将从基础到高级,全面解析 CSS 选择器的使用方法和应用场景。

一、基础选择器

基础选择器是 CSS 中最常用、最简单的选择器,它们构成了更复杂选择器的基础。

1. 元素选择器

元素选择器直接匹配 HTML 元素的标签名,是最基本的选择器类型。

/* 匹配所有<p>元素 */
p {color: #333;line-height: 1.6;
}/* 匹配所有<div>元素 */
div {margin-bottom: 1rem;
}

2. ID 选择器

ID 选择器使用#前缀,匹配具有特定 ID 属性的元素。ID 在文档中应该是唯一的。

/* 匹配id为"header"的元素 */
#header {background-color: #f5f5f5;padding: 1rem;
}/* 匹配id为"logo"的元素 */
#logo {font-size: 1.5rem;font-weight: bold;
}

3. 类选择器

类选择器使用.前缀,匹配具有特定 class 属性的元素。一个类可以应用到多个元素上。

/* 匹配所有class为"btn"的元素 */
.btn {display: inline-block;padding: 0.5rem 1rem;border-radius: 4px;cursor: pointer;
}/* 匹配所有class为"highlight"的元素 */
.highlight {background-color: #fff3cd;border-left: 4px solid #ffeeba;
}

4. 通配符选择器

通配符选择器使用*,匹配文档中的所有元素。

/* 重置所有元素的默认边距和内边距 */
* {margin: 0;padding: 0;box-sizing: border-box;
}

二、组合选择器

组合选择器允许你通过元素之间的关系来选择元素,使选择更加精准。

1. 后代选择器

后代选择器使用空格分隔两个选择器,匹配第一个选择器的后代中符合第二个选择器的元素。

/* 匹配<div>内所有<p>元素(包括嵌套的) */
div p {margin-bottom: 0.5rem;
}/* 匹配class为"article"的元素内所有class为"title"的元素 */
.article .title {font-size: 1.2rem;color: #2c3e50;
}

2. 子元素选择器

子元素选择器使用>分隔,只匹配第一个选择器的直接子元素中符合第二个选择器的元素。

/* 匹配<ul>的直接子元素<li> */
ul > li {list-style: none;margin-bottom: 0.3rem;
}/* 匹配<div>的直接子元素中class为"content"的元素 */
div > .content {padding: 1rem;
}

3. 相邻兄弟选择器

相邻兄弟选择器使用+分隔,匹配第一个选择器后面紧邻的、符合第二个选择器的兄弟元素。

/* 匹配<h2>后面紧邻的<p>元素 */
h2 + p {font-weight: bold;color: #7f8c8d;
}/* 匹配class为"active"的元素后面紧邻的<div>元素 */
.active + div {border-top: 2px solid #3498db;
}

4. 通用兄弟选择器

通用兄弟选择器使用~分隔,匹配第一个选择器后面所有符合第二个选择器的兄弟元素。

/* 匹配<h3>后面所有的<p>兄弟元素 */
h3 ~ p {text-indent: 2rem;
}/* 匹配id为"intro"的元素后面所有class为"item"的兄弟元素 */
#intro ~ .item {margin-left: 1rem;
}

三、属性选择器

属性选择器根据元素的属性或属性值来选择元素,提供了强大的选择能力。

1. 基本属性选择器

匹配具有指定属性的元素,无论属性值是什么。

/* 匹配所有具有title属性的元素 */
[title] {border: 1px dotted #3498db;
}/* 匹配所有具有data-id属性的<div>元素 */
div[data-id] {position: relative;
}

2. 精确属性值选择器

匹配属性值精确等于指定值的元素。

/* 匹配type属性值为"text"的<input>元素 */
input[type="text"] {width: 200px;padding: 0.3rem;
}/* 匹配rel属性值为"nofollow"的<a>元素 */
a[rel="nofollow"] {color: #95a5a6;
}

3. 部分属性值选择器

 [attr~=value]:匹配属性值包含指定单词的元素(单词以空格分隔)

 [attr|=value]:匹配属性值以指定值开头或等于指定值的元素(适合处理语言代码)

 [attr^=value]:匹配属性值以指定值开头的元素

 [attr$=value]:匹配属性值以指定值结尾的元素

 [attr*=value]:匹配属性值包含指定值的元素

/* 匹配class属性包含"button"单词的元素 */
[class~="button"] {border: none;
}/* 匹配href属性以"https"开头的<a>元素 */
a[href^="https"] {background: url('lock-icon.png') no-repeat right center;padding-right: 18px;
}/* 匹配src属性以".png"结尾的<img>元素 */
img[src$=".png"] {border: 2px solid #ecf0f1;
}/* 匹配data-info属性包含"user"的元素 */
[data-info*="user"] {background-color: #f8f9fa;
}

四、伪类选择器

伪类选择器用于选择处于特定状态的元素,通常以:开头。

1. 动态伪类

动态伪类根据用户与元素的交互状态来选择元素。

/* 未访问的链接 */
a:link {color: #3498db;
}/* 已访问的链接 */
a:visited {color: #9b59b6;
}/* 鼠标悬停时的元素 */
a:hover {text-decoration: underline;
}/* 被激活的元素(点击时) */
button:active {transform: translateY(1px);
}/* 获得焦点的元素 */
input:focus {outline: 2px solid #3498db;border-color: #3498db;
}

2. 结构伪类

结构伪类根据元素在文档树中的位置来选择元素。

/* 匹配第一个子元素 */
ul li:first-child {font-weight: bold;
}/* 匹配最后一个子元素 */
ul li:last-child {margin-bottom: 0;
}/* 匹配第n个子元素(n从1开始) */
table tr:nth-child(2n) {background-color: #f8f9fa;
}/* 匹配第n个-last子元素 */
ul li:nth-last-child(3) {color: #e74c3c;
}/* 匹配唯一的子元素 */
div:only-child {margin: 0 auto;max-width: 800px;
}/* 匹配第一个某种类型的子元素 */
.container p:first-of-type {font-size: 1.1rem;
}/* 匹配最后一个某种类型的子元素 */
.container p:last-of-type {margin-bottom: 0;
}

3. 其他常用伪类

/* 匹配为空的元素 */
div:empty {height: 20px;background-color: #ecf0f1;
}/* 匹配包含指定文本的元素 */
p:contains("重要") {color: #e74c3c;font-weight: bold;
}/* 匹配被禁用的元素 */
input:disabled {background-color: #ecf0f1;cursor: not-allowed;
}/* 匹配被选中的元素(如下拉列表中的选项) */
option:checked {background-color: #3498db;color: white;
}

五、伪元素选择器

伪元素选择器用于选择元素的特定部分,通常以::开头(CSS3 规范)。

/* 匹配元素内容的第一个字母 */
p::first-letter {font-size: 2rem;float: left;line-height: 0.8;margin-right: 0.2rem;
}/* 匹配元素内容的第一行 */
p::first-line {font-weight: bold;
}/* 在元素内容前插入内容 */
h2::before {content: "►";margin-right: 0.5rem;color: #3498db;
}/* 在元素内容后插入内容 */
h2::after {content: "";display: block;height: 2px;width: 50px;background-color: #3498db;margin-top: 0.5rem;
}/* 匹配选中的文本 */
::selection {background-color: #3498db;color: white;
}/* 匹配输入框中的占位文本 */
input::placeholder {color: #95a5a6;font-style: italic;
}

六、选择器的优先级

当多个选择器匹配同一个元素时,CSS 会根据选择器的优先级来决定应用哪个样式。优先级规则如下:

  1. 内联样式(style属性)优先级最高

  2. ID 选择器的优先级高于类选择器、属性选择器和伪类

  3. 类选择器、属性选择器和伪类的优先级高于元素选择器和伪元素

  4. 通配符选择器优先级最低

  5. 可以使用!important强制提升样式优先级(谨慎使用)

计算优先级的简化方法:

        每个 ID 选择器:+100

        每个类选择器、属性选择器或伪类:+10

        每个元素选择器或伪元素:+1

例如:

  p:优先级 1

  .class:优先级 10

  #id:优先级 100

  div.class:优先级 1 + 10 = 11

  #id .class:优先级 100 + 10 = 110

七、实际应用技巧

  1. 保持选择器简洁:过复杂的选择器会降低性能并难以维护

    /* 不推荐 */
    body > div.container:nth-child(3) > ul.list > li.item:nth-of-type(2) {/* 样式 */
    }/* 推荐 */
    .list .item.highlight {/* 样式 */
    }
    
  2. 合理组织选择器顺序:将通用样式放在前面,特殊样式放在后面

  3. 利用继承减少重复:让子元素继承父元素的样式,而不是重复定义

  4. 使用组合选择器减少类的使用

    /* 代替为每个警告按钮添加.warning类 */
    .btn[type="button"][data-type="warning"] {background-color: #f39c12;
    }
    
  5. 使用伪类和伪元素减少不必要的 HTML 元素

    /* 用伪元素代替额外的分隔线元素 */
    .nav-item:not(:last-child)::after {content: "";display: inline-block;width: 1px;height: 16px;background-color: #ddd;margin: 0 10px;
    }
    

总结

CSS 选择器是前端开发的基础知识,从简单的元素选择器到复杂的组合选择器,每种选择器都有其特定的应用场景。掌握选择器的使用不仅能让你写出更简洁、更高效的 CSS 代码,还能提高开发效率,减少不必要的 HTML 元素和类名。

随着 CSS 的不断发展,新的选择器也在不断出现,如 CSS4 中引入的:has()伪类,进一步增强了选择器的能力。作为开发者,我们需要不断学习和实践,才能更好地运用这些工具,创建出既美观又高效的网页。

希望本文能帮助你全面了解 CSS 选择器,并在实际项目中灵活运用。如有任何疑问或补充,欢迎在评论区留言讨论!

http://www.dtcms.com/a/361016.html

相关文章:

  • lesson51:CSS全攻略:从基础样式到前沿特性的实战指南
  • 面试常考css:三列布局实现方式
  • 前端必看:为什么同一段 CSS 在不同浏览器显示不一样?附解决方案和实战代码
  • LangChain开源LLM集成:从本地部署到自定义生成的低成本落地方案
  • 开源 React 脚手架推荐
  • LeetCode每日一题,2025-09-01
  • 视频提取文字用什么软件好?分享6款免费的视频转文字软件!
  • vizard-将长视频变成适合社交的短视频AI工具
  • (3dnr)多帧视频图像去噪 (二)
  • 统计学的“尝汤原理”:用生活案例彻底理解中心极限定理
  • Linux初始——Vim
  • 前端静态资源缓存与部署实践总结
  • 云手机为什么会受到广泛关注?
  • 【算法基础】链表
  • (Arxiv-2025)VACE:一体化视频创作与编辑
  • uniApp App 嵌入 H5 全流程:通信与跳转细节拆解
  • 【菜狗学聚类】聚类的一些评估指标——20250901
  • 交互体验升级:Three.js在设备孪生体中的实时数据响应方案
  • 飞牛nas修改crontab计划默认编辑器
  • RPA背后的核心技术有哪些?
  • 【论文阅读】Sparse4D v3:Advancing End-to-End 3D Detection and Tracking
  • 基于Hadoop与层次聚类技术的电子游戏销售分析系统的设计与实现
  • wpf之WrapPanel
  • 了解软件测试之软件测试技能
  • 第六章:健壮Go应用:工程实践与生产就绪之测试
  • Spring Bean生命周期的完全指南
  • 警告:OPENCV_FFMPEG_READ_ATTEMPTS (current value is 4096)
  • Altium Designer中的Net-Tie:解决多网络合并与电气隔离的利器
  • Spring中bean的作用域
  • [Godot] C#使用Json进行数据结构的保存与加载