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

【CSS-7】深入解析CSS伪类:从基础到高级应用

CSS伪类是前端开发中不可或缺的强大工具,它们允许我们根据文档树之外的信息或简单选择器无法表达的状态来样式化元素。本文将全面探讨CSS伪类的各种类型、使用场景和最佳实践。

1. 伪类基础概念

1.1 什么是伪类?

伪类(Pseudo-class)是CSS中的一种特殊关键字,用于选择元素的特定状态或特征。它们以冒号(:)开头,可以附加到选择器末尾来定义元素在特定状态下的样式。

/* 语法 */
selector:pseudo-class {property: value;
}/* 示例 - 链接悬停状态 */
a:hover {color: #ff4500;
}

1.2 伪类与伪元素的区别

  • 伪类:选择元素的特定状态(如:hover、:focus)
  • 伪元素:选择元素的特定部分(如::before、::first-line)

2. 常用伪类详解

2.1 用户交互伪类

2.1.1 :hover - 鼠标悬停状态
button:hover {background-color: #4CAF50;transform: translateY(-2px);
}
2.1.2 :active - 激活状态(元素被点击时)
button:active {transform: translateY(1px);
}
2.1.3 :focus - 获得焦点状态
input:focus {outline: 2px solid #2196F3;box-shadow: 0 0 5px rgba(33, 150, 243, 0.5);
}
2.1.4 :focus-visible - 键盘焦点状态
button:focus-visible {outline: 2px dashed #000;
}

2.2 结构伪类

2.2.1 :first-child / :last-child
/* 列表首项样式 */
li:first-child {border-top-left-radius: 5px;border-top-right-radius: 5px;
}/* 列表末项样式 */
li:last-child {border-bottom-left-radius: 5px;border-bottom-right-radius: 5px;
}
2.2.2 :nth-child() - 强大的序号选择
/* 隔行变色 */
tr:nth-child(even) {background-color: #f2f2f2;
}/* 选择前3项 */
li:nth-child(-n+3) {font-weight: bold;
}/* 复杂模式:3n+1 (1,4,7...) */
div:nth-child(3n+1) {margin-right: 0;
}
2.2.3 :nth-of-type() - 按类型选择
/* 每第三个段落 */
p:nth-of-type(3n) {color: #e91e63;
}
2.2.4 :not() - 反向选择
/* 选择所有不是.disabled的按钮 */
button:not(.disabled) {cursor: pointer;
}/* 复合使用 */
li:not(:first-child):not(:last-child) {padding: 8px 0;
}

2.3 表单相关伪类

2.3.1 :checked - 选中状态
input[type="checkbox"]:checked + label {color: #4CAF50;font-weight: bold;
}
2.3.2 :disabled / :enabled
input:disabled {background-color: #ebebe4;cursor: not-allowed;
}input:enabled {border-color: #66afe9;
}
2.3.3 :valid / :invalid
input:valid {border-color: #4CAF50;
}input:invalid {border-color: #f44336;
}
2.3.4 :placeholder-shown
input:placeholder-shown {font-style: italic;color: #999;
}

2.4 其他实用伪类

2.4.1 :target - URL片段标识的目标元素
section:target {background-color: #fffde7;animation: highlight 1s ease;
}
2.4.2 :empty - 空元素
div.empty:empty {display: none;
}div.empty:not(:empty) {padding: 15px;
}
2.4.3 :root - 文档根元素
:root {--primary-color: #4285f4;--base-font-size: 16px;
}

3. CSS Level 4新增伪类

3.1 :is() - 简化选择器列表

/* 传统写法 */
header h1, header h2, header h3 {font-family: 'Roboto', sans-serif;
}/* 使用:is() */
header :is(h1, h2, h3) {font-family: 'Roboto', sans-serif;
}

3.2 :where() - 低特异性选择

/* 特异性为0,0,1 */
article :where(h1, h2, h3) {margin-top: 1em;
}

3.3 :has() - 父元素选择器(最强大)

/* 选择包含img的article */
article:has(img) {background: #f5f5f5;
}/* 选择后面跟着p的h2 */
h2:has(+ p) {margin-bottom: 0;
}

4. 伪类的高级应用技巧

4.1 组合使用伪类

/* 悬停且获得焦点的按钮 */
button:hover:focus {box-shadow: 0 0 0 3px rgba(33, 150, 243, 0.5);
}/* 非第一个且非最后一个列表项 */
li:not(:first-child):not(:last-child) {padding: 8px 0;
}

4.2 动画与过渡结合

.menu-item {transition: transform 0.3s ease;
}.menu-item:hover {transform: scale(1.05);
}.menu-item:active {transform: scale(0.98);
}

4.3 自定义表单控件

/* 自定义复选框 */
input[type="checkbox"] {opacity: 0;position: absolute;
}input[type="checkbox"] + label::before {content: "";display: inline-block;width: 18px;height: 18px;border: 2px solid #ccc;margin-right: 8px;vertical-align: middle;
}input[type="checkbox"]:checked + label::before {background-color: #4CAF50;border-color: #4CAF50;
}input[type="checkbox"]:disabled + label {color: #aaa;
}

4.4 响应式设计增强

/* 鼠标设备与触摸设备区分 */
@media (hover: hover) {/* 只在支持悬停的设备上应用 */.card:hover {transform: translateY(-5px);box-shadow: 0 10px 20px rgba(0,0,0,0.1);}
}@media (hover: none) {/* 触摸设备专用样式 */.card:active {transform: scale(0.98);}
}

5. 性能与最佳实践

5.1 性能优化

  • 避免过度复杂的伪类组合
  • 优先使用类选择器替代结构性伪类(如:nth-child)
  • 注意:hover在移动设备上的表现

5.2 可访问性考虑

  • 不要仅依赖颜色变化表示状态
  • 确保:focus状态明显可见
  • 为自定义控件提供适当的ARIA属性

5.3 浏览器兼容性

  • 使用特性检测(如@supports)处理新伪类
  • 为关键功能提供渐进增强方案
  • 考虑使用PostCSS或Autoprefixer处理前缀

6. 伪类的未来

CSS选择器Level 4规范正在引入更多强大的伪类:

/* 匹配包含特定数量子元素的父元素 */
.container:has(> .item:nth-child(5)) {grid-template-columns: repeat(5, 1fr);
}/* 方向性伪类 */
:dir(rtl) {text-align: right;
}/* 范围伪类 */
p:read-only {background-color: #f5f5f5;
}

7. 结语

CSS伪类为我们提供了强大的工具来创建动态、交互式和响应式的用户界面。从简单的悬停效果到复杂的结构选择,伪类能够帮助我们以更少的代码实现更多的功能。随着CSS标准的不断发展,伪类的功能也在不断增强,如:has()选择器将彻底改变我们选择元素的方式。

记住,良好的伪类使用应该:

  1. 增强用户体验而非干扰
  2. 保持代码的可维护性
  3. 考虑所有用户和设备
  4. 渐进增强,优雅降级

通过掌握这些伪类技术,你将能够创建更加精致、响应迅速且易于访问的网页界面。

相关文章:

【CSS-7】深入解析CSS伪类:从基础到高级应用

CSS伪类是前端开发中不可或缺的强大工具,它们允许我们根据文档树之外的信息或简单选择器无法表达的状态来样式化元素。本文将全面探讨CSS伪类的各种类型、使用场景和最佳实践。 1. 伪类基础概念 1.1 什么是伪类? 伪类(Pseudo-class&#x…...

QT的工程文件.pro文件

文章目录 QT的工程文件.pro文件QT5中的基本模块Qt CoreQt GUIQt WidgetsQt QMLQt QuickQt NetworkQt SQLQt MultimediaQt ConcurrentQt WebEngineQt TestLib TARGET 可选择的模版CONFIG的配置项 QT的工程文件.pro文件 每一个QT项目都至少有一个.pro文件,用来配置项目…...

用 DeepSeek 高效完成数据分析与挖掘

一、DeepSeek 是什么? DeepSeek 是由深度求索推出的智能助手(当前版本 DeepSeek-R1),具备强大的自然语言理解、代码生成与数据分析能力。它支持 128K超长上下文,可处理复杂数据文档,并直接生成可运行的 Python 数据分析代码,是数据工作者的“AI副驾驶”。 二、DeepSeek…...

安科瑞防逆流方案落地内蒙古中高绿能光伏项目,筑牢北疆绿电安全防线

一、项目概况 内蒙古阿拉善中高绿能能源分布式光伏项目,位于内蒙古乌斯太镇,装机容量为7MW,采用自发自用、余电不上网模式。 用户配电站为35kV用户站,采用两路电源单母线分段系统。本项目共设置12台35/0.4kV变压器,在…...

stress 服务器压力测试的工具学习

一、stress 工具介绍 tress 是一种工具,可以对符合 POSIX 标准的操作系统施加可配置数量的 CPU、内存、I/O 或磁盘压力,并报告其检测到的任何错误。 stress 不是一个基准测试。它是由系统管理员用来评估其系统扩展性的工具,由内核程序员用来…...

在本地电脑中部署阿里 Qwen3 大模型及连接到 Elasticsearch

在今天的文章中,我将参考文章 “使用 Elastic 和 LM Studio 的 Herding Llama 3.1” 来部署 Qwen3 大模型。据测评,这是一个非常不错的大模型。我们今天尝试使用 LM Studio 来对它进行部署,并详细描述如何结合 Elasticsearch 来对它进行使用。…...

八股---7.JVM

1. JVM组成 1.1 JVM由哪些部分组成?运行流程? 难易程度:☆☆☆ 出现频率:☆☆☆☆ Java Virtual Machine:Java 虚拟机,Java程序的运行环境(java二进制字节码的运行环境)好处:一次编写,到处运行;自动内存管理,垃圾回收机制程序运行之前,需要先通过编译器将…...

C++性能优化指南

思维导图(转载) https://www.processon.com/view/5e5b3fc5e4b03627650b1f42 第 1 章 优化概述 1.1 优化是软件开发的一部分 优化更像是一门实验科学。 1.2 优化是高效的 1.3 优化是没有问题的 **90/10 规则:**程序中只有 10% 的代码…...

数据集-目标检测系列- 猴子 数据集 monkey >> DataBall

贵在坚持! * 相关项目 1)数据集可视化项目:gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2)数据集训练、推理相关项目:GitHub - XIAN-HHappy/ultralytics-yolo-webui: ultralytics-yo…...

【RAG召回】bge实现向量相似度索引

sentence-transformers 是一个非常强大的 Python 框架,它可以将句子或段落转换成高质量、高信息密度的数字向量(称为“嵌入”或 Embeddings)。它厉害的地方在于,语义上相似的句子,其向量在空间中的距离也更近。 这使得…...

算法-数论

C-小红的数组查询(二)_牛客周赛 Round 95 思路:不难看出a数组是有循环的 d3,p4时,a数组:1、0、3、2、1、0、3、2....... 最小循环节为4,即最多4种不同的数 d4,p6时,a数组:1、5、3、…...

原型对象(Prototype)详解

原型对象(Prototype)详解 一、核心概念 本质:每个 JavaScript 对象(除 null 外)都有的内置属性作用:实现对象间的属性/方法继承(原型继承)存储位置:[[Prototype]] 内部属性(通过 __proto__ 或 Object.getPrototypeOf() 访问)二、关键特性图示 对象实例 (obj)│├─…...

MongoDB账号密码笔记

先连接数据库,新增用户密码 admin用户密码 use admin db.createUser({ user: "admin", pwd: "yourStrongPassword", roles: [ { role: "root", db: "admin" } ] })用户数据库用户密码 use myappdb db.createUser({ user: &…...

SQL导出Excel支持正则脱敏

SQL to Excel Exporter 源码功能特性核心功能性能优化安全特性 快速开始环境要求安装运行 API 使用说明1. 执行SQL并导出Excel2. 下载导出文件3. 获取统计信息4. 清理过期文件 数据脱敏配置支持的脱敏类型脱敏规则配置示例 配置说明应用配置数据库配置 测试运行单元测试运行集成…...

05.查询表

查询表 字段显示可以使用别名: col1 AS alias1, col2 AS alias2, … WHERE子句:指明过滤条件以实现“选择"的功能: 过滤条件: 布尔型表达式算术操作符:,-,*,/,%比较操作符:,<>(相等或都为空),<>,!(非标准SQL),>,>,<,<范围查询: BETWEEN min_num …...

基于深度强化学习的智能机器人导航系统

前言 随着人工智能技术的飞速发展&#xff0c;机器人在日常生活和工业生产中的应用越来越广泛。其中&#xff0c;机器人导航技术是实现机器人自主移动的关键。传统的导航方法依赖于预设的地图和路径规划算法&#xff0c;但在复杂的动态环境中&#xff0c;这些方法往往难以适应。…...

【第三十九周】ViLT

ViLT 摘要Abstract文章信息介绍提取视觉特征的方式的演变模态融合的两种方式四种不同的 VLP 模型Q&A 方法模型结构目标函数Whole Word Masking&#xff08;WWM&#xff09; 实验结果总结 摘要 本篇博客介绍了ViLT&#xff08;Vision-and-Language Transformer&#xff09;…...

代码随想录算法训练营第60期第六十天打卡

大家好&#xff0c;今天因为有数学建模比赛的校赛&#xff0c;今天的文章可能会简单一点&#xff0c;望大家原谅&#xff0c;我们昨天主要讲的是并查集的题目&#xff0c;我们复习了并查集的功能&#xff0c;我们昨天的题目其实难度不小&#xff0c;尤其是后面的有向图&#xf…...

数据结构——D/串

一、串的定义和基本操作 &#xfeff; 1. 串的定义 &#xfeff; &#xfeff; 1&#xff09;串的概念 &#xfeff; &#xfeff; 组成结构: 串是由零个或多个字符组成的有限序列&#xff0c;记为 &#xfeff;S′a1a2⋯an′Sa_1a_2\cdots a_nS′a1​a2​⋯an′​&#x…...

瀚文机械键盘固件开发详解:HWKeyboard.cpp文件解析与应用

&#x1f525; 机械键盘固件开发从入门到精通&#xff1a;HWKeyboard模块全解析 作为一名嵌入式开发老司机&#xff0c;今天带大家拆解一个完整的机械键盘固件代码。即使你是单片机小白&#xff0c;看完这篇教程也能轻松理解机械键盘的工作原理&#xff0c;甚至自己动手复刻一…...

Nginx+Tomcat负载均衡与动静分离架构

目录 简介 一、Tomcat基础部署与配置 1.1 Tomcat应用场景与特性 1.2 环境准备与安装 1.3 Tomcat主配置文件详解 1.4 部署Java Web站点 二、NginxTomcat负载均衡群集搭建 2.1 架构设计与原理 2.2 环境准备 2.3 Tomcat2配置&#xff08;与Tomcat1对称&#xff09; 2.4…...

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月8日第102弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。 (1)定…...

LeetCode--25.k个一组翻转链表

解题思路&#xff1a; 1.获取信息&#xff1a; &#xff08;1&#xff09;给定一个链表&#xff0c;每k个结点一组进行翻转 &#xff08;2&#xff09;余下不足k个结点&#xff0c;则不进行交换 2.分析题目&#xff1a; 其实就是24题的变题&#xff0c;24题是两两一组进行交换&…...

css | class中 ‘.‘ 和 ‘:‘ 的使用 | 如,何时用 .is-selected{ ... } 何时用 :hover{...}?

省流总结&#xff1a;交互时的短暂视觉反馈 → 用 :hover&#xff0c;状态需要记录或切换 → 用类名如 .is-selected。 &#x1f9e0; 本质区别&#xff1a; 写法触发方式用途&.is-selected依赖 class 切换需要 JavaScript 控制状态&#xff0c;如选中、激活&:hover鼠…...

【第九篇】 SpringBoot测试补充篇

简介 本文介绍了SpringBoot测试中的五项关键技术&#xff1a;测试类专用属性加载、 测试类专用Bean配置、 表现层测试方法、测试类事务回滚控制、配置文件随机数据设置&#xff09;。这些技术可以有效隔离测试环境&#xff0c;确保测试数据不影响生产环境&#xff0c;同时提供了…...

springcloud SpringAmqp消息队列 简单使用

这期只是针对springBoot/Cloud 在使用SpringAmqp消息队列的时候遇到的坑。 前提 如果没有安装RabbitMQ是无法连接成功的&#xff01;所以前提是你要安装好RabbitMQ。 docker 安装命令 # 拉取docker镜像 docker pull rabbitmq:management# 创建容器 docker run -id --namera…...

Framework开发之IMS逻辑浅析1--关键线程及作用

关键线程:EventHub,InputReader,InputDispatcher EventHub: 由于Android继承Linux,Linux的思想是一切皆文件,而输入的类型不止一种(触碰&#xff0c;写字笔&#xff0c;键盘等)&#xff0c;每种类型都对应一种驱动设备&#xff0c;而每个硬件驱动设备又对应Linux的一个目录文件…...

The Quantization Model of Neural Scaling

文章目录 摘要1引言2 理论3 概念验证&#xff1a;一个玩具数据集3.1 “多任务稀疏奇偶校验”数据集3.2 幂律规模和新兴能力 4 拆解大型语言模型的规模定律4.1 单token损失的分布4.2 单基因&#xff08;monogenic&#xff09;与多基因&#xff08;polygenic&#xff09;的规模曲…...

数据源指的是哪里的数据,磁盘中还是内存中

在 MyDB 项目中&#xff0c;特别是这段缓存框架代码&#xff1a; T obj getForCache(key);以及它的上下文&#xff1a; AbstractCache 是一个抽象类&#xff0c;内部有两个抽象方法&#xff0c;留给实现类去实现具体的操作&#xff1a; protected abstract T getForCache(lon…...

系统思考:跳出症状看全局

明天将为华为全球采购认证管理部的伙伴们带来一场关于系统思考的深度课程&#xff01;通过经典的啤酒游戏经营决策沙盘&#xff0c;一起沉浸式体验如何从全局视角看待问题&#xff0c;发现单点最优并不等于全局最优。 这不仅是一次简单的课程&#xff0c;更是一次洞察系统背后…...