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

news2024/11/28 10:34:47

在这里插入图片描述

伪元素与伪类两者都是通过在选择器后附加一个特定的关键字来定义,遵循相似的语法规则,并在 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.coloradmin.cn/o/1603591.html

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

相关文章

Go 单元测试之Mysql数据库集成测试

文章目录 一、 sqlmock介绍二、安装三、基本用法四、一个小案例五、Gorm 初始化注意点 一、 sqlmock介绍 sqlmock 是一个用于测试数据库交互的 Go 模拟库。它可以模拟 SQL 查询、插入、更新等操作&#xff0c;并且可以验证 SQL 语句的执行情况&#xff0c;非常适合用于单元测试…

数据赋能(58)——要求:数据赋能实施部门能力

“要求&#xff1a;数据赋能实施部门能力”是作为标准的参考内容编写的。 在实施数据赋能中&#xff0c;数据赋能实施部门的能力体现在多个方面&#xff0c;关键能力如下图所示。 在实施数据赋能的过程中&#xff0c;数据赋能实施部门应具备的关键能力如下。 理性思维与逻辑分…

ES源码四:网络通信层流程

听说ES网络层很难&#xff1f;今天来卷它&#x1f604; 前言 ES网络层比较复杂&#xff0c;分为两个部分&#xff1a; 基于HTTP协议的REST服务端基于TCP实现的PRC框架 插件化设计的网络层模块&#xff08;NetworkModule&#xff09; 入口还是上一章的创建Node构造方法的地方…

如何爬出 Kotlin 协程死锁的坑?

作者&#xff1a;悬衡 一、前言 在 Java 中有一个非常经典的死锁问题, 就是明明自己已经占用了线程池, 却还继续去申请它, 自己等自己, 就死锁了, 如下图和代码: // 这段代码将死锁到天荒地老final ExecutorService executorService Executors.newSingleThreadExecutor();exe…

4月27日复旦大学-华盛顿大学EMBA项目教授分享暨招生说明会

复旦大学-华盛顿大学EMBA项目2024年4月27日精彩看点&#xff1a;      国际视野助推商业价值&#xff0c;“她力量”赋能管理      数字营销浪潮中&#xff0c;如何重新定义价值创造      主讲嘉宾    复旦大学-华盛顿大学EMBA项目教授分享暨招生说明会     …

Redmi Turbo 3新品发布,天星金融(原小米金融)优惠加持护航新机体验

Redmi新十年使命不变&#xff0c;挑战不断升级。Redmi Turbo 3&#xff0c;作为Turbo系列的开篇之作&#xff0c;将自身定位为新生代性能旗舰&#xff0c;决心重塑中端性能新格局。据悉&#xff0c;Redmi Turbo 3于4月10日已正式发布。预售期间更是连续数日&#xff0c;蝉联小米…

C++:文件内容完全读入

在上一篇文章中我留下了一点小坑&#xff1a;使用>> 运算符&#xff0c;这个运算符默认将空格作为分隔符&#xff0c;所以在文件内容读取的时候发现在读到空格时就会停止读取&#xff0c;导致读取内容不完整&#xff0c;这显然不符合日常的使用用能&#xff0c;那么今天就…

科学突破可能开创6G通信新时代

格拉斯哥大学开发的火柴盒大小的天线可以为全息通话、改进自动驾驶和更好的医疗保健的世界铺平道路。 格拉斯哥大学表示&#xff0c;这种创新的无线通信天线将超材料的独特特性与复杂的信号处理相结合&#xff0c;有助于构建未来的 6G 网络。 数字编码动态超表面天线&#xf…

python-flask结合bootstrap实现网页小工具实例-半小时速通版

参考&#xff1a; Python之flask结合Bootstrap框架快速搭建Web应用_支持bootstrap的python软件-CSDN博客 https://blog.csdn.net/lovedingd/article/details/106696832 Bootstrap 警告框 | 菜鸟教程 https://www.runoob.com/bootstrap/bootstrap-alert-plugin.html flask框架…

机器学习实验二-----决策树构建

决策树是机器学习中一种基本的分类和回归算法&#xff0c;是依托于策略抉择而建立起来的树。本文学习的是决策树的分类 1. 构建决策树流程 选择算法&#xff1a;常用的算法包括ID3、C4.5、CART等。 划分节点&#xff1a;根据数据特征和算法选择&#xff0c;递归地划分节点&…

C++算法题 - 矩阵

目录 36. 有效的数独54. 螺旋矩阵48. 旋转图像73. 矩阵置零289. 生命游戏 36. 有效的数独 LeetCode_link 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现…

Linux安装和使用Android Debug Bridge(ADB)

目录 1、开发环境和工具 2、ADB是什么&#xff1f; 3、安装ADB 3.1、使用包管理器安装 ADB 3.2、手动安装 ADB 4、使用ADB 4.1、连接设备 4.2、执行shell命令 4.3、安装应用程序 4.4、截取屏幕截图 4.5、模拟按键和手势 4.6、上传文件到Android设备 4.7、从Android设备下载文件…

el-table 表格列里添加 树

<el-table-column label"部门名称" align"center"><template slot-scope"scope"><el-cascader filterable :disabled"type 3 ? true : false" :show-all-levels"false":ref"provinceTree scope.row.…

【机器学习300问】72、神经网络的隐藏层数量和各层神经元节点数如何影响模型的表现?

评估深度学习的模型的性能依旧可以用偏差和方差来衡量。它们反映了模型在预测过程中与理想情况的偏离程度&#xff0c;以及模型对数据扰动的敏感性。我们简单回顾一下什么是模型的偏差和方差&#xff1f; 一、深度学习模型的偏差和方差 偏差&#xff1a;衡量模型预测结果的期望…

[Meachines][Easy] Usage

Main # nmap -sV -sC 10.10.11.18 --min-rate 1000 # echo 10.10.11.18 usage.htb admin.usage.htb >> /etc/hosts 在/forget-password发现存在SQL注入 emailmaptnh%40log.comAND5212%3dBENCHMARK(5000000,MD5(0x62434473))--NKGG $ sqlmap -r request.txt --level 5 -…

js: UrlDecode解码、UUID和GUID、阿拉伯数字转为中文数字

UrlDecode解码&#xff1a; UrlDecode 是一个 JavaScript 函数&#xff0c;用于将经过 URL 编码的字符串转换为普通字符串。 URL 编码是将特殊字符转换为它们的百分比编码表示形式的过程。这些特殊字符包括空格、斜线、井号&#xff08;#&#xff09;等。UrlDecode 函数将这些…

【C++杂货铺】继承

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 继承的概念和定义 &#x1f4c2; 概念 &#x1f4c2; 定义 &#x1f4c1; 基类和派生类对象赋值转换 &#x1f4c1; 继承中的作用域 &#x1f4c1; 派生类的默认成员函数 构造函数 析构函数 拷贝构造函数 赋值重载…

html select 支持内容过滤列表 -bootstrap实现

实现使用bootstrap-select插件 http://silviomoreto.github.io/bootstrap-select <!DOCTYPE html> <html> <meta charset"UTF-8"> <head><title>jQuery bootstrap-select可搜索多选下拉列表插件-www.daimajiayuan.com</title>&…

【Pytorch】Conv1d

conv1d 先看看官方文档 再来个简单的例子 import torch import numpy as np import torch.nn as nndata np.arange(1, 13).reshape([1, 4, 3]) data torch.tensor(data, dtypetorch.float) print("[data]:\n", data) conv nn.Conv1d(in_channels4, out_channels1…

ARM作业day8

温湿度数据采集应用&#xff1a; 由上图可知&#xff1a; 控制温湿度采集模块的引脚是PF14&#xff08;串行时钟线&#xff09;和PF15&#xff08;串行数据线&#xff09;&#xff1a;控制温湿度采集模块的总线是AHB4&#xff0c;通过GPIOF串口和RCC使能完成初始化操作。 控制…