【CSS】伪元素与伪类

CSS 伪类与伪元素详解 阅读详情

CSS 伪元素和伪类

1.为什么要引入伪元素和伪类?

在 CSS 的官方文档中,是这样描述的:

CSS introduces the concepts of pseudo-elements and pseudo-classes to permit formatting based on
information that lies outside the document tree.

意思是:CSS 引入伪类和伪元素概念是为了格式化文档树以外的信息。即,伪类和伪元素是用来修饰不在文档树种的部分。CSS 中没有比如:“段落的第一行”、“文章首字母”之类的选择器,而这些部分在一些业务场景中又是需要控制的,这时候就需要用到伪元素和伪类了。

2.伪类和伪元素的概念以及作用

2.1 伪类

伪类是为处于某一状态的已有元素添加相应的样式,而这个状态是根据用户的行为而动态改变的。

伪类一般用于以下场景:

  1. 设置鼠标悬停在元素上的样式
  2. 为已访问和未访问链接设置不同的样式
  3. 设置元素获得焦点时的样式
  4. 为一串元素中的某些特定元素设置样式
  5. …
2.2 伪元素

伪元素是用于创建一些不存在于文档树中的元素,并为其添加指定的样式。即,虽然用户可以看到这些元素,但是这些元素实际上并不存在于文档树中!这一点也是伪元素与伪类之间的本质区别!

伪元素一般用于以下场景:

  1. 设置文本元素首字母、首行的样式
  2. 在元素内容之前或之后插入内容
  3. 设置滚动元素的滚动条样式
  4. …

3.伪类

CSS 中的常用伪类可以分为以下几类:

  • 状态伪类
  • 结构性伪类
  • 表单相关
  • 语言相关
  • 其他

如下图:

在这里插入图片描述

3.1 状态伪类

状态伪类,即元素的样式会根据其状态的不同而呈现不同的样式,当元素处于某一状态时,应用该状态对应的样式,而进入另一状态后,该样式也不再生效。

常见的状态伪类有:

  • :link 应用于未被访问过的链接;
  • :hover 应用于鼠标悬停到的元素;
  • :active 应用于被激活的元素;
  • :visited 应用于被访问过的链接,是一种与:link状态互斥的状态!
  • :focus 应用于拥有键盘输入焦点的元素。

需要注意的是,**这几个伪类同时出现在一个元素的操作上,顺序是固定的,否则很大程度上会产生紊乱,造成效果失效!**具体来说,:hover 必须在 CSS 定义中的 :link 和 :visited 之后,才能生效。:active 必须在 CSS 定义中的 :hover 之后才能生效。

3.2 结构性伪类

结构性伪类是 CSS3 中新加入的元素选择器,它通过对 DOM 树进行元素过滤,用文档结构的相互关系来匹配元素,能够减少 class 和 id 属性的定义,使得文档结构更加简洁!

常见的结构性伪类:

  1. :first-child 选择某个元素的第一个子元素
  2. :last-child 选择某个元素的最后一个子元素;
  3. :nth-child(n) 匹配属于其父元素的第 n 个子元素,不论元素的类型;
  4. :nth-last-child() 从这个元素的最后一个子元素开始算,选匹配属于其父元素的第 n 个子元素,不论元素的类型;
  5. :nth-of-type() 规定属于其父元素的第 n 个指定类型元素;
  6. :nth-last-of-type() 从元素的最后一个开始计算,规定属于其父元素的指定类型元素;
  7. :first-of-type 选择一个上级元素下的第一个同类子元素;
  8. :last-of-type 选择一个上级元素的最后一个同类子元素;
  9. :only-child 选择它的父元素的唯一一个子元素;
  10. :only-of-type 选择一个元素是它的上级元素的唯一一个相同类型的子元素;
  11. :checked 匹配被选中的input元素,这个input元素包括radio和checkbox。
  12. :empty 选择的元素里面没有任何内容。
  13. :disabled 匹配禁用的表单元素。
  14. :enabled 匹配没有设置disabled属性的表单元素。
  15. :valid 匹配条件验证正确的表单元素。
  16. :in-range 选择具有指定范围内的值的 <input> 元素。
  17. :optional 选择不带 required 属性的 <input> 元素。
  18. :focus 选择获得焦点的 <input> 元素。
3.3 表单相关

有些伪类的使用常常与表单向关联:

3.3.1 :checked

:checked — 匹配被选中的 input 元素,这个 input 元素包括 radio 和 checkbox。

例:当复选框被选中时,与其相邻的<label> 元素的背景会变化

HTML

<input type="checkbox"/>
<label>agree</label>

CSS

/* 匹配选中状态input元素的相邻label元素 */
input:checked + label {
    background: yellow;
}
3.3.2 :default

:default — 匹配默认选中的元素

3.3.3 :disabled

:disabled — 匹配禁用的表单元素

例如这里,我们将禁用的 input 元素置为红色

HTML

<input type="text" disabled/>

CSS

input:disabled {
    background-color: red;
}
3.3.4 :empty

:empty — 匹配没有子元素的元素。但凡元素中含有文本节点、HTML 元素或者一个空格,:empty都不能匹配这个元素。

例:

HTML

<div>这个容器里的背景是橙色的</div>
<div>  </div>
<div></div>
<div><!-- 注释不会被视作内容 --></div>

CSS

div {
    background: red;
    height: 30px;
    width: 200px;
}
 
div:empty {
    background: blue;
}

效果如下:

在这里插入图片描述

可以看到,第一个元素中有文本节点,所以其背景不会变成蓝色;第二个元素中有一个空格,有空格则该元素不为空,所以其背景不会变成蓝色;第三个元素中没有任何内容,所以其背景会变成蓝色;第四个元素中只有一个注释,此时该元素是空的,所以其背景会变成蓝色;

3.3.5 :enabled

与:disabled相反,:enabled 匹配没有设置 disabled 属性的表单元素。

3.3.6 :in-range

:in-range 匹配在指定区域内元素。

例如:

HTML

<input type="number" min="5" max="10">

CSS

input[type=number] {
    border: 5px solid orange;
}
 
input[type=number]:in-range {
    border: 5px solid green;
}

效果如下:

在这里插入图片描述

可以看到,当输入的数字在我们设定的范围 5 ~ 10 之间时,边框变为绿色。

3.3.7 :out-of-range

:out-of-range 与 in-range 相反,其用于匹配不在指定区域内的元素。

3.3.8 :indeterminate

indeterminate 的英文意思是“ 不确定的”。当某组中的单选框或复选框还没有选取状态时,:indeterminate 可以匹配到该组中所有的单选框或复选框。

例:

HTML

<ul>
    <li>
        <input type="radio" name="list" id="option1">
        <label for="option1">Option 1</label>
    </li>
    <li>
        <input type="radio" name="list" id="option2">
        <label for="option2">Option 2</label>
    </li>
    <li>
        <input type="radio" name="list" id="option3">
        <label for="option3">Option 3</label>
    </li>
</ul>

CSS

:indeterminate + label {
    background: red;
}

效果如下:

在这里插入图片描述

可以看到,当组中没有一个单选被选中时,所有的单选都处于不确定的状态,因此它们的label背景都为红色;而当有一项被选中后,所有单选的状态都确定了!所以它们的背景都不会被设置为红色。

3.3.9 :valid

:valid 匹配条件验证正确的表单元素。

3.3.10 :invalid

:invalid 与:valid 相反,匹配条件验证错误的表单元素。

3.3.11 :optional

:optional 匹配是具有 optional 属性的表单元素。当表单元素没有设置为 required 时,即为 optional 属性。

3.3.12 :required

:required 与 :optional 相反,匹配设置了 required 属性的表单元素。

3.3.13 :read-only

:read-only 匹配设置了只读属性的元素,表单元素可以通过设置 readonly 属性来定义元素只读。

3.3.14 :read-write

:read-write 可以匹配处于编辑状态的元素。input,textarea 和设置了 contenteditable 的HTML元素获取焦点时即处于编辑状态。

例:

HTML

<input type="text" value="获取焦点时背景变黄"/>
 
<div class="editable" contenteditable>
    <h1>点击这里可以编辑</h1>
    <p>获取焦点时背景变黄</p>
</div>

CSS

:read-write:focus {
    background: yellow;
}

效果如下:

在这里插入图片描述

可以看到,在 input 框获取焦点时,样式作用到了其身上。同时,我们为div设置 contenteditable 属性后,使其获取焦点时,同样可以将样式作用到其身上。

3.3.15 :scope(处于试验阶段)

:scope 匹配处于 style 作用域下的元素。当 style 没有设置 scope 属性时,style 内的样式会对整个 html 起作用。


以上就是常用的三类伪类,至于其他两类,在实际开发中的使用并不多,这里就不作介绍了,需要使用时,可以查阅官方文档。

4.伪元素

常用的伪元素如下:

  1. ::after — 在元素之后插入内容。
  2. ::before — 在元素之前插入内容。
  3. ::first-letter — 选择元素的首字母,只能作用于块级元素!
  4. ::first-line — 选择元素的首行,只能作用于块级元素!
  5. ::selection — 选择用户选择的元素部分。
  6. ::placeholder — 匹配占位符的文本,只有元素设置了 placeholder 属性时,该伪元素才能生效。但需要注意的是,该伪元素不是 CSS 的标准,它的实现可能在将来会有所改变,所以要决定使用时必须谨慎。

下面就拿最为常用的两个伪元素 ::after 和 ::before 来举个例子:

<style lang="less" scoped>
.btn_block {
  position: relative;
  .block {
    position: absolute;
    bottom: 55px;
    left: -40px;
    width: 200px;
    height: 200px;
    background: skyblue;
  }
  .block::after {
    content: '这里是after伪元素';
    position: absolute;
    top: 100%;
    left: 18%;
    // background: orange;
    border-width: 10px;
    border-style: solid;
    border-color: orange transparent transparent transparent;
  }
}
/* 这里用了iview组件库的Modal组件,其类名为 ivu-modal */
:deep(.ivu-modal::before) {
  content: '1111111111111';
  background: skyblue;
}
:deep(.ivu-modal::after) {
  content: url(../../assets/icons/uploadBtn.png);
}
</style>
<template>
<div class="btn_block">
    <button @mouseenter="isShowBlock = true" @mouseleave="isShowBlock = false">
        hover to show block
    </button>
    <div class="block" v-show="true">this is a block!</div>
</div>
<div class="btn_modal">
    <button>click to show modal</button>
    <Modal v-model="isShowModal"> 11111 </Modal>
</div>
</template>
<script>
export default {
    data() {
        return {
            isShowBlock: false,
            isShowModal: false,
        }
    }
}
</script>

效果如下:

在这里插入图片描述

可以看到,我们在这里通过::after 和 ::before能够为元素的前方、后方添加原本不存在于文档流中的元素。另外,需要注意的是,虽然通过这样的方式在元素前后方添加元素很方便,且的确能够向伪元素身上添加事件,但是仍然是比较麻烦的,如果要添加的元素与交互相关,那么尽量还是通过实际元素来实现!而伪元素则用来做一些修饰性的工作。

参考文档

An Ultimate Guide To CSS Pseudo-Classes And Pseudo-Elements

CSS中伪类详解 CSS伪类是特殊选择器,用于选择元素的特定状态或位置,无需修改HTML结构。主要分为用户交互伪类(如:hover、:active)、链接状态伪类(:link、:visited)、表单状态伪类(:checked、:valid)、结构位置伪类(:first-child、:nth-child)等类型。伪类可组合使用,支持参数化选择,在交互反馈、数据表格优化、导航菜单等场景有广泛应用。与伪元素不同,伪类不创建新元素而是选择元素状态。使用时需注意性能影响、浏览器兼容性和可访问性要求。合理运用伪类能提升界面交互体验和视 阅读详情

相关推荐

13. CSS定位与伪类/伪元素

定位选择微调位置用relative固定导航用fixed子元素相对于父元素定位用absolute+relative组合伪类与伪元素伪类用于元素状态变化(如:hover)伪元素用于元素特定部分样式(如::first-letter)显示控制需要保留空间时用visibility不需要保留空间时用display。

bighead的博客 1412

CSS常用伪元素详解

只能用于块级元素。可用的CSS属性为font,color,background,word-spacing,letter-spacing,text-decoration,vertical-align,text-transform,line-height,clear。可用的CSS属性为font,color,background,marin,padding,border,text-decoration,vertical-align,text-transform,line-height,float,clear。

qq_43293207的博客 1万+

ENVI新手避坑指南:手把手教你搞定遥感影像的坐标系转换(附ArcGIS对比)

本文详细解析ENVI与ArcGIS在遥感影像坐标系转换中的关键差异与实战技巧,特别针对新手常见问题提供避坑指南。从基础概念到高级操作,涵盖定义投影、UTM转换等核心步骤,并对比两种软件的处理精度与效率,帮助用户高效完成遥感影像处理任务。

weixin_42531925的博客 377

伪类和伪元素(详细介绍)

CSS种伪类和伪元素的详细介绍

宝子的博客 9177

【FLINK+Kerberos+kafka】在华为云上 bootstrap.server使用IP的GSS initiate failed 问题处理

目前互联网上所有的资料显示都是说没有正确设置KDC之类的,但本博主实际通过java代码低版本 如使用kafka-client 0.11.0 ,2.4.0等版本手动创建kafkaconfig 或者使用华为云的LoginUtils类 都能够正常链接,所以应该是高版本添加了相关配置,或者flink在subtask 创建kafkaAdminClient时 丢弃或使用了默认的一些配置行为,导致了客户端和kdc验证之间出现了principal 不一致导致验证失败。client.dns.lookup配置项作用。

honghanyue1791的博客 574

实战解析:如何通过LTspice仿真优化MOS管缓启动电路,解决上电冲击电流问题

本文详细解析如何通过LTspice仿真优化MOS管缓启动电路,有效解决上电冲击电流问题。文章从问题根源分析入手,介绍LTspice环境搭建、缓启动电路设计原理、参数优化技巧及实际工程问题排查,帮助工程师掌握MOS管电源开关电路的关键设计方法,提升系统可靠性和性能。

weixin_28683689的博客 512

CSS中的伪类和伪元素(详细)

这篇想要跟大家分享的是css中的伪类和伪元素,有任何问题可以私聊我或者评论哦! 首先,我们先来想一下,为什么要引入伪类跟伪元素? css引入伪类和伪元素概念是为了格式化文档树以外的信息。也就是说,伪类和伪元素是用来修饰不在文档树中的部分,比如,一句话中的第一个字母,或是列表中的第一个元素,又或者是鼠标悬停在某个超链接上时要设置的样式。 什么是伪类,伪元素? 伪类:用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。比如说,当用户悬停在指定的元素时,我们可以通过:h

林家小美女的博客 2万+

一个AI Agent顶十个软件,toB赛道正在大洗牌

一个AI Agent顶十个软件,toB赛道正在大洗牌

ith321的博客 1331

CSS伪类与伪元素

为什么要引入伪类与伪元素? css引入伪类和伪元素概念是为了格式化文档树以外的信息。也就是说,伪类和伪元素是用来修饰不在文档树中的部分,比如,一句话中的第一个字母,或是列表中的第一个元素,又或者是鼠标悬停在某个超链接上时要设置的样式。 什么是伪类,伪元素? 伪类:用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。比如说,当用户悬停在指定的元素时,我们可以...

阳光下的冷静的博客 1万+

IPC-7351标准实战:如何用LPWizard_10快速生成PCB封装库(附避坑指南)

本文提供了一份详细的IPC-7351标准实战指南,手把手教你使用LPWizard_10软件快速生成符合行业标准的PCB封装库,并直接导入Cadence Allegro。文章深入解读了IPC-7351密度等级的选择逻辑,并重点分享了软件配置、QFN封装生成实战步骤,以及导出失败、焊盘异常等常见问题的避坑解决方案,旨在帮助硬件工程师提升设计效率和可靠性。

weixin_29207439的博客 153

【STK】手把手教你利用STK进行覆盖分析02-生成详细分析报告和图表

这篇文章主要针对上一篇文章中最后的案例1进行进一步的说明,详细介绍我们可以生成哪些结论性的成果。STK的Coverage模块的生成结果包括分析报告和图表两种样式,每种样式还分为动态和静态两种,也就是说,我们做完一个STK覆盖场景的仿真后,一般可以生成静态分析报告、动态分析报告、静态分析图表和动态分析图表这4种形式的分析成果,下面进行详细介绍。我们在选择了想要分析的区域或者点后,就可以利用CovDef生成分析报告了,覆盖定义的分析报告分为静态报告和动态报告两种,下面分析进行介绍: 首先我们先在左侧目标浏览器C

weixin_44184852的博客 3441

CSS3伪类与伪元素的区别及注意事项

CSS中伪类与伪元素的概念是很容易混淆的 今天就来谈谈伪类与伪元素之间的区别定义首先先来看看伪类与伪元素的定义 w3c中对于它们是这么解释的 伪类:用于向某些选择器添加特殊的效果 伪元素:用于将特殊的效果添加到某些选择器 讲道理,可能我语文不好,我觉得这两句话是等价的 :-) 根本不能看出有什么区别 都是对某些选择器“加特技”标准有这么一句话翻译过来是这样的 CSS 引入伪类和伪元素的概

尐轩web前端网络日志 1万+

高通GAIA V3命令参考手册的研读学习(15):自定制命令的详细工作描述

里的示例一样,手机APP发出这个GetManuFacturer的命令发0x0000,那么耳机回复:0x8000, 同时在回复的playload部分,用最多15个字节的ACSII码来表达制造商信息(因此最多15个字母)。那么这个APP在通过GAIA协议控制这个耳机时,不仅可以通过前面讲过的vendor ID来识别,也可以更进一步通过这个命令来识别这个耳机,到底是不是本公司的。通过这个可变长度的playload,真的是可以传达极多的事先约定的信息,相当的灵活,真是不错!这个命令用来得到设备的制造商信息。

qq_37191547的博客 398

CSS伪元素详解以及伪元素与伪类的区别

CSS伪元素常常被误解为伪类,主要就在于他们的语法比较相似,功能上也都是对选择器的扩展,相似程度太高,所以容易被混淆。 一般用于在元素的内容前后插入新的内容,或者改变首字母、首行的样式等。

jimojianghu的专栏 855

以太网GMAC-RK3568

第 2 章和第 3 章中针对 RMII/RGMII 接口芯片和 USB 以太网两种类型芯片在 SDK 上的配置做详细的描述,第 4 章介绍以太网在 Android 上的相关调用接口。第 5 章提供常见问题的排查建议由于在 RK 系列的 SoC 中内置了以太网 MAC 控制器,所以只需要搭配一颗以太网 PHY 芯片,即可实现以太网卡功能按照规范,即使是不同厂家的 PHY,仍然有一部分寄存器的定义是通用的,只要配置了这些通用的寄存器,基本上 PHY 就可以正常工作代码位置在。

qq_24093081的博客 1942

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

前端CSS:CSS伪类与伪元素

在Web开发中,CSS伪类与伪元素是非常重要的概念,它们扩展了CSS选择器的功能,使得开发者能够更加精细地控制元素的样式。本文将深入探讨CSS伪类与伪元素的基本概念、作用、以及在实际开发中的应用技巧,并通过丰富的代码示例来帮助读者更好地理解和掌握这些技术点。希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。假设我们需要创建一个产品列表,其中每个产品项都包含一个标题和一段描述,当鼠标悬停在产品项上时,产品项的背景颜色会发生变化,并且标题会变粗。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1243

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

CSS 伪类与伪元素

伪类(Pseudo-class)用于选择元素的特定状态或位置。它以冒号()作为前缀标识符,常见的伪类包括动态伪类、结构伪类等。伪元素(Pseudo-element)用于选择元素的特定部分或生成内容。它与伪类的区别在于,伪元素表示元素内部的内容,逻辑上存在但在文档树中并不存在。CSS3 规定伪元素用双冒号()表示。

体系化很难,碎片归纳很简单。 668

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

CSS 伪类与伪元素:提升页面交互与样式的细节

在 CSS 中,伪类与伪元素是两个非常有用的概念,它们帮助开发者在不改变 HTML 结构的前提下,精确地控制页面元素的样式和交互效果。伪类(Pseudo-classes):伪类是用于选择元素在某种状态下应用的样式,它能够让你针对用户的交互动作(如鼠标悬停、输入框获得焦点等)来修改元素样式。伪元素(Pseudo-elements):伪元素允许你在元素的特定位置(如内容前、内容后等)插入虚拟的内容,而不需要额外的 HTML 标签。它通常用于对文本和元素的某些部分进行样式处理。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 1214

CSS伪类与伪元素的区别

概念: 伪类和伪元素都是用来添加一些选择器的特殊效果。 区别: 1.伪类包含两种:状态伪类和结构性伪类。 (1)状态伪类是基于元素当前状态进行选择的。在与用户的交互过程中元素的状态是动态变化的,因此该元素会根据其状态呈现不同的样式。当元素处于某状态时会呈现改样式,而进入另一状态后,该样式也会失去。常见的状态伪类主要包括: :link 应用于未被访问过的链接; :hover 应用于鼠标...

qq_36485978的博客 260

前端CSS:CSS3新增伪类与伪元素

随着Web技术的发展,CSS3引入了一系列新的伪类和伪元素,极大地丰富了Web开发者的工具箱。这些新增的伪类和伪元素不仅增强了网页的表现力,还提供了更多的交互性和可定制性选项。本文将详细介绍CSS3中新增的伪类与伪元素,通过丰富的示例和实用的技巧帮助开发者更好地理解和应用它们。通过本文的学习,你已经掌握了CSS3中新增的伪类与伪元素的基础知识,以及它们在实际开发中的应用方法。/* 选择属于其父元素从后往前数的第2个类型的子元素 *//* 选择属于其父元素的第2个类型的子元素 */

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1422

CSS伪类与伪元素详解

CSS伪类和伪元素是CSS选择器的特殊扩展,用于对文档中某些不可直接通过常规选择器访问的特定状态或结构进行样式化。以下是对CSS伪类与伪元素的详细解释,以及相应的代码示例

大剑师兰特的GIS世界 2267
上一篇: 【JS进阶】纯函数 + 高阶函数 + 函数柯里化
下一篇: 【CSS】transition、transform以及animation
cannotbecounted
博客等级 码龄7年 101粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值