CSS3 伪元素与伪类选择器区别、详解与应用实例

在这里插入图片描述

伪元素与伪类两者都是通过在选择器后附加一个特定的关键字来定义,遵循相似的语法规则,并在 CSS 规则块中设置相应的样式。伪元素 能够通过 content 属性添加或替换内容。例如,:before 和 :after 可以插入文本、图像或其他生成的内容。伪类 仅影响元素的样式,而不添加或修改内容。它们基于用户的交互、文档结构或其他逻辑条件来改变元素的表现。主要区别如下:

  • 作用对象

    • 伪类选择器(Pseudo-classes)作用于实际存在的元素,用于描述元素的某种特定状态或关系,如链接的访问状态(:visited)、鼠标悬停状态(:hover)、是否为文档中的第一个子元素(:first-child)等。它们不直接改变元素的结构,而是影响元素在特定条件下的表现样式。
    • 伪元素选择器(Pseudo-elements)则用于创建并选择元素内的某个特定部分或是在元素前后生成新的、虚拟的内容节点。例如,:before:after 可以用来插入额外内容,:first-line:first-letter 分别选择元素首行文本和首字母,:marker 控制列表项标记样式等。这些伪元素并不对应于HTML文档中的实际元素,但可以对其应用样式,如同它们是真实存在的部分一样。
  • 语法标识

    • 伪类 通常使用一个冒号(:)进行标识,如 :hover:focus
    • 伪元素 在 CSS3 中使用两个连续的冒号(::)进行标识,以区分于旧版 CSS 中的伪类。尽管大多数现代浏览器仍接受单冒号表示伪元素(如 :before),但为了符合 W3C 标准和保持最佳实践,建议使用双冒号形式,如 ::before::after
  • 可复用性

    • 伪类 可以在同一选择器中组合使用,如 a:hover:focus 表示同时处于悬停和聚焦状态的链接。
    • 伪元素 由于代表了元素内部的特定部分或生成的新内容,一般不能在同一选择器中重复出现。一个元素在同一时刻只能有一个:before:after伪元素生效。

一、CSS3 伪元素选择器详解与应用实例

CSS3 伪元素是一种特殊的 CSS 选择器,它们允许开发者在不修改 HTML 结构的前提下,通过 CSS 为元素添加或修改特定部分的样式,或者在元素内部或外部生成并控制虚拟内容。以下是对几种常见 CSS3 伪元素的详解以及应用实例:

1、:before:after

:before:after 伪元素分别在所选元素的内容区域之后创建一个新的、无内容的、不可见的“子元素”。然后,通过给这个伪元素设置样式(如内容、尺寸、颜色、背景等),使其变为可见,并在视觉上表现为紧随原元素内容之后的部分。这些内容由 content 属性定义,并且可以应用其他样式。

语法

selector:before {content: "..." /* 或其他值 */;/* 其他样式声明 */
}selector:after {content: "..." /* 或其他值 */;/* 其他样式声明 */
}

其中,content 属性是定义伪元素生成内容的关键。它可以接受以下几种值:

  • 字符串:直接指定要显示的文字。
  • 引号包围的HTML实体:如 content: "—";(破折号)。
  • URL:插入图片资源,如 content: url(image.png);
  • 生成内容关键字:如 content: counter(name);(计数器)或 content: attr(attribute-name);(获取元素属性值)。

应用实例

1.1. 添加装饰性内容

添加引号、图标或其他装饰性元素。

  • 添加引号:
blockquote:before {content: open-quote;font-size: larger;color: #666;
}blockquote:after {content: close-quote;
}
  • 在列表项前/后添加自定义图标:
li:before {content: url(icon-checkmark.svg);margin-right: 0.5em;
}li.completed:after {content: "\2713"; /* Unicode 字符:对勾 */color: green;font-size: 1.5em;vertical-align: super;
}

1.2. 清除浮动

:after 常用于创建一个空的块级元素,配合 clear:both 来清除浮动对后续元素的影响,避免“高度塌陷”问题。

.clearfix:after {content: "";display: table;clear: both;
}

.clearfix 类应用于需要清除内部浮动的容器元素。

1.3. 替代或扩展HTML内容

利用 attr() 函数,可以从元素的属性中提取值作为 :after 的内容,实现动态文本展示。

abbr[title]:after {content: " (" attr(title) ")";font-size: smaller;color: gray;
}

此例中,当鼠标悬停在带有 title 属性的 abbr 元素上时,会显示一个包含 title 属性值的小字号灰色括注内容。

1.4. 实现复杂形状与动画

结合 contentbackgroundborder 等属性以及CSS3的 transformtransitionanimation,可以使用 :after 创建复杂的形状和动画效果。

.button:after {content: "";display: inline-block;width: 0;height: 0;border-top: ⅓em solid transparent;border-right: ⅓em solid transparent;border-bottom: ⅓em solid #007BFF;border-left: ⅓em solid transparent;margin-left: 0.½em;
}.button:hover:after {transform: translateY(-0.1em);transition: transform 0.2s ease-in-out;
}

上述代码在.button元素后创建了一个三角形下拉箭头,并在鼠标悬停时实现平滑的下移动画。

注意事项

  • :after 伪元素必须与 content 属性一起使用,否则不会产生任何效果。
  • 由于 :after 是创建的虚拟元素,无法通过JavaScript进行DOM操作。
  • 虽然 :after 生成的内容可以参与布局,但它不计入DOM,不影响语义,也不影响键盘导航等辅助功能。

总结而言,CSS3 伪元素选择器通过在元素内容后插入自定义内容,极大地丰富了网页设计的表现力,且无需改动HTML结构。熟练运用伪元素与其他CSS技巧,可以帮助开发者构建更加美观、响应迅速且易于维护的网页界面。

2、:first-line:first-letter

:first-line 伪元素选择器用于设置元素内首行文本的样式,而 :first-letter 伪元素则用于设置元素内首字母的样式。

语法

selector:first-line {/* 样式声明 */
}selector:first-letter {/* 样式声明 */
}

应用实例

  • 首行缩进:
article p:first-line {text-indent: 2em;
}
  • 首字母大写与装饰:
article h2:first-letter {font-size: 2em;float: left;margin-right: 0.5em;line-height: 0.8;color: #8A2BE2;background-color: #F8F8FF;padding: 0.⅔em 0.⅓em;border-radius: 0.5em;
}

二、CSS3 伪类选择器详解与实践示例

CSS3 伪类选择器是一种强大的工具,它允许开发者基于元素状态而非其在文档树中的位置或类、ID等固有属性来精确地定位并施加样式。这些选择器以特殊的语法结构描述元素的不同条件状态,如用户交互、位置关系、内容特性等,从而实现动态、响应式的网页设计。以下是CSS3伪类选择器的详细解释及其实际应用示例。

1、静态伪类选择器

:link:visited
  • :link: 用于选择尚未被用户访问过的超链接(<a>元素)。通常用于设置未访问链接的基本样式。

    a:link {color: blue;text-decoration: none;
    }
    
  • :visited: 选择用户已经访问过的链接。用于设置已访问链接的区分样式。

    a:visited {color: purple;
    }
    

2、用户交互伪类选择器

:hover, :focus, :active
  • :hover: 当鼠标指针悬浮在元素上时,匹配该元素。

    button:hover {background-color: #f0f0f0;cursor: pointer;
    }
    
  • :focus: 选择获得焦点的元素,常见于表单控件或可聚焦元素(如<input>, <textarea>, <button>等)。

    input:focus {outline: 2px solid #007BFF;box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
    }
    
  • :active: 用于表示用户正在激活或按下某个元素(通常在鼠标点击或触摸屏上按压时)。

    a:active {color: red;font-weight: bold;
    }
    

3、结构化伪类选择器

:first-child, :last-child, :only-child, :nth-child(n)
  • :first-child: 选择作为其父元素第一个子元素的元素。

    li:first-child {list-style-type: square;
    }
    
  • :last-child: 选择作为其父元素最后一个子元素的元素。

    div > p:last-child {margin-bottom: 0;
    }
    
  • :only-child: 选择没有兄弟元素的元素。

    .message:only-child {border-width: 2px;
    }
    
  • :nth-child(n): 选择其父元素的第n个子元素,其中n可以是数字、关键词(even, odd)或公式(如2n+1)。

    li:nth-child(2n) {background-color: #f9f9f9;
    }
    

4、内容相关伪类选择器

:empty, :target, :enabled, :disabled, :checked
  • :empty: 选择没有任何内容(包括子元素、文本节点等)的元素。

    div.empty:empty {display: none;
    }
    
  • :target: 选择当前URL片段标识符(hash)与该元素ID相匹配的元素。

    #content:target {background-color: lightyellow;
    }
    
  • :enabled:disabled: 分别选择启用状态与禁用状态的表单元素。

    input:enabled {background-color: white;
    }
    input:disabled {opacity: 0.6;cursor: not-allowed;
    }
    
  • :checked: 用于复选框(<input type="checkbox">)、单选按钮(<input type="radio">)或<option>元素处于选中状态时。

    input[type="checkbox"]:checked + label {text-decoration: line-through;
    }
    

5、否定伪类选择器

:not(selector)
  • :not(): 选择不符合括号内指定选择器的元素。

    /* 除了class为"exclude"的所有段落 */
    p:not(.exclude) {color: green;
    }
    

6、其他伪类选择器

:root, :nth-of-type(n), :nth-last-of-type(n), :first-of-type, :last-of-type, :only-of-type
  • :root: 选择文档的根元素(HTML文档中通常是<html>元素)。

    :root {--primary-color: #3498db;
    }
    
  • :nth-of-type(n):nth-last-of-type(n): 类似于:nth-child(n),但仅针对同级元素中特定类型的子元素。

    article:nth-of-type(even) {background-color: #f5f5f5;
    }
    
  • :first-of-type, :last-of-type:only-of-type: 分别选择同级元素中第一个、最后一个或唯一一个特定类型的子元素。

    div > p:first-of-type {font-weight: bold;
    }
    

通过熟练掌握以上CSS3伪类选择器及其应用场景,开发者能够编写出更高效、更具表现力和交互性的CSS代码,提升网站的用户体验和视觉效果。随着CSS标准的不断演进,还可能有更多新的伪类选择器加入到CSS3的行列中,为前端开发提供更为丰富和精细的控制手段。

无论是伪类还是伪元素,都是为了增强 CSS 选择器的功能,使开发者能够在不改动 HTML 结构的情况下,更精细地控制元素的样式和布局。

在这里插入图片描述

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

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

相关文章

Tomcat核心组件深度解析

Server组件 Service组件 连接器Connector组件 容器Container组件

【研发管理】产品经理知识体系-产品创新管理

导读&#xff1a; 产品创新管理对企业的发展具有深远的影响&#xff0c;它不仅是企业保持竞争优势的关键&#xff0c;也是推动企业持续稳定发展的重要动力。因此&#xff0c;企业应高度重视产品创新管理&#xff0c;并采取有效的策略和方法来推动产品创新活动的开展。对于产品经…

第20天:信息打点-红蓝队自动化项目资产侦察企查产权武器库部署网络空间

第二十天 一、工具项目-红蓝队&自动化部署 自动化-武器库部署-F8x 项目地址&#xff1a;https://github.com/ffffffff0x/f8x 介绍&#xff1a;一款红/蓝队环境自动化部署工具,支持多种场景,渗透,开发,代理环境,服务可选项等.下载&#xff1a;wget -O f8x https://f8x.io…

MINIO安装的方法(WindowsLiunx)

2 minio安装教程 注&#xff1a;官方中文文档&#xff1a;MinIO对象存储 Windows — MinIO中文文档 | MinIO Windows中文文档 Liunx 安装方&#xff1a;MinIO对象存储 Linux — MinIO中文文档 | MinIO Linux中文文档 2.1 下载地址 https://dl.min.io/server/minio/…

论文笔记:UrbanGPT: Spatio-Temporal Large Language Models

1 intro 时空预测的目标是预测并洞察城市环境随时间和空间不断变化的动态。其目的是预见城市生活多个方面的未来模式、趋势和事件&#xff0c;包括交通、人口流动和犯罪率。虽然已有许多努力致力于开发神经网络技术&#xff0c;以准确预测时空数据&#xff0c;但重要的是要注意…

springboot是什么?

可以应用于Web相关的应用开发。 选择合适的框架&#xff0c;去开发相关的功能&#xff0c;会有更高的效率。 为什么Spring Boot才是你该学的!学java找工作必会技能!在职程序员带你梳理JavaEE框架_哔哩哔哩_bilibili java工程师的必备技能 Spring是Java EE领域的企业级开发宽…

万兆网络的十字路口:电口还是光模块?

&#x1f335;在构建高速、高效的网络系统时&#xff0c;选择正确的连接技术至关重要。万兆电口&#xff08;10GBASE-T&#xff09;和万兆光模块&#xff08;SFP&#xff09;是目前市场上两种主流的高速网络解决方案。它们各有优势&#xff0c;但在不同的应用场景和需求下&…

稀碎从零算法笔记Day54-LeetCode:39. 组合总和

题型&#xff1a;数组、树、DFS、回溯 链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数…

在PostgreSQL中如何进行全文搜索,以及如何优化全文搜索性能?

文章目录 如何进行全文搜索1. 创建全文搜索向量2. 执行全文搜索查询 如何优化全文搜索性能1. 使用GIN索引2. 限制搜索范围3. 优化文本处理4. 使用并发搜索5. 监控和调整配置 在PostgreSQL中&#xff0c;全文搜索通常通过使用tsvector和tsquery类型&#xff0c;以及to_tsvector和…

安居水站:水站经营秘籍:年入30万不是梦。水站创业指南。

在这个快节奏的社会里&#xff0c;初创企业家们总是在寻找一条明路&#xff0c;以在竞争激烈的市场中立足。为了帮助他们更好地实现这一目标&#xff0c;我根据经验决定制定一份水站经营指导手册。这份手册将详细阐述如何从零起步&#xff0c;如何运营&#xff0c;如何进行市场…

制作一个RISC-V的操作系统十二-定时器中断

文章目录 CLINT定时器中断mtimemtimecmp机制总体框架流程时间节拍系统时钟代码 CLINT 产生软件中断和定时器中断 定时器中断 mtime 类似计数器&#xff0c;按照硬件对应的固定频率递增 上电后会自动复位为0&#xff0c;有硬件自动完成 mtimecmp 需要自己设置&#xff0…

Java 多线程加法求和

Java 多线程加法求和 代码 先上代码再上解析&#xff1a; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger;public class Sum implements …

文件IO总结

标准C库IO函数和Linux系统IO函数对比 标准c库IO函数 标准C库提供了一系列的输入输出&#xff08;IO&#xff09;函数&#xff0c;这些函数主要包括在 <stdio.h> 头文件中。这些函数可以大致分为几类&#xff1a; 文件操作函数&#xff1a; fopen&#xff1a;打开文件fc…

Linux内核之内核通知文件系统创建的路径:fsnotify_create用法实例(五十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【图解计算机网络】从浏览器地址输入到网页显示的整个过程

从浏览器地址输入到网页显示的整个过程 整体流程DHCPhttp协议报文组装DNSTCP协议封装与TCP三次握手IP协议封装与路由表MAC地址与ARP协议交换机路由器 整体流程 从往浏览器输入一个地址到网页的显示&#xff0c;要经过很长的一个流程&#xff0c;中间涉及到计算机网络的许多知识…

*Linux系统的进程和计划任务管理

目录 一、查看进程 1、程序和进程的关系 *2、ps查看静态进程信息 1&#xff09;ps aux 2&#xff09;ps -elf *3、top查看动态进程信息 4、pgrep查看进程信息 5、pstree查看进程树 二、控制进程 1、进程启动方式 2、进程的前后台调度 3、终止进程的运行 三、计划任…

React【Day4】

路由快速上手 1. 什么是前端路由 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候&#xff0c;path 对应的组件会在页面中进行渲染 2. 创建路由开发环境 # 使用CRA创建项目 npm create-react-app react-router-pro# 安装最新的ReactRouter包 …

Git TortoiseGit 安装使用详细教程

前言 Git 是一个免费的开源分布式版本控制系统&#xff0c;是用来保存工程源代码历史状态的命令行工具&#xff0c;旨在处理从小型到非常大型的项目&#xff0c;速度快、效率高。《请查阅Git详细说明》。TortoiseGit 是 Git 的 Windows Shell 界面工具&#xff0c;基于 Tortoi…

第 2 章:FFmpeg简介

2.1 历史 历史 一些相关术语介绍&#xff1a; 容器&#xff08;Container&#xff09;格式&#xff1a;一种文件封装格式&#xff0c;里边主要包含了流&#xff0c;一般会使用一个特定的后缀名标识&#xff0c;例如.mov、.avi、.wav等。流 &#xff08;Stream&#xff09;&am…

政安晨:【Keras机器学习示例演绎】(五)—— 利用视觉变换器进行物体检测

目录 导言 导入和设置 准备数据集 实施多层感知器&#xff08;MLP&#xff09; 实施补丁创建层 显示输入图像的补丁 实施补丁编码层 构建 ViT 模型 运行实验 评估模型 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与…