CSS中伪类与伪元素的概念是很容易混淆的 
今天就来谈谈伪类与伪元素之间的区别


定义

首先先来看看伪类与伪元素的定义 
w3c中对于它们是这么解释的

  • 伪类:用于向某些选择器添加特殊的效果
  • 伪元素:用于将特殊的效果添加到某些选择器

讲道理,可能我语文不好,我觉得这两句话是等价的 :-) 
根本不能看出有什么区别 
都是对某些选择器“加特技”

标准有这么一句话翻译过来是这样的

CSS 引入伪类和伪元素的概念是为了实现基于文档树之外的信息的格式化

这话更抽象,其实意思就是对那些我们不能通过class、id等选择元素的补充

区别

这个区别我们需要一个例子来理解

<p>
<em>This</em>
<em>is a text</em>
</p>
  • 1
  • 2
  • 3
  • 4

如果我们想要第一个em标签字体颜色变红怎么做呢 
使用我们熟悉的伪类很简单

em:first-child {
color: red;
}
  • 1
  • 2
  • 3

但是如果不存在伪类我们怎么做呢 
这是我们就需要为第一个em标签添加类

<p>
<em class="first-child">This</em>
<em>is a text</em>
</p>
  • 1
  • 2
  • 3
  • 4
em.first-child {
color: red;
}
  • 1
  • 2
  • 3

可以实现同样的效果


<p>
<em>This</em>
<em>is a text</em>
</p>
  • 1
  • 2
  • 3
  • 4

还是这个例子 
现在我想让这个段落的第一个字母变红 
怎么做呢 
这回我们需要使用伪元素

p::first-letter {
color: red;
}
  • 1
  • 2
  • 3

同样假设伪元素不存在的情况 
这时我们只能嵌套span标签来实现

<p>
<em><span>T</span>his</em>
<em>is a text</em>
</p>
  • 1
  • 2
  • 3
  • 4
p span {
color: red;
}
  • 1
  • 2
  • 3

看到这里,相信大家已经清楚了为什么一个叫做伪类,一个叫做伪元素 
伪类的效果可以通过添加实际的类来实现 
伪元素的效果可以通过添加实际的元素来实现 
它们的本质区别就是是否抽象创造了新元素

历史

伪类最开始的时候只是用来表示元素的动态(典型的锚伪类link、visited、hover、active) 
在CSS2标准中对它进行了扩展让它虽然逻辑存在但不需要在DOM树中标识 
伪元素代表了某个元素的子元素,虽然逻辑存在,但不存在于DOM树

虽然它们的概念很容易被我们混淆 
但是也不影响我们正常使用

我在CSS3选择器介绍及用法总结中说过 
伪类只能使用“:” 
而伪元素既可以使用“:”,也可以使用“::” 
这里我就解释一下为什么


CSS3中的标准是伪类使用单冒号“:” 
而伪元素使用双冒号“::”(避免混淆) 
但是在此之前无论是伪类还是伪元素都使用单冒号“:” 
所以为了保证兼容伪元素两种使用方法都是可以的 
但是低版本IE有双冒号兼容问题 
所以以前编写样式的人们对于伪类和伪元素就干脆统统使用单冒号 
导致这种混淆一直延续下来

注意

在使用伪类和伪元素的时候 
有一点要特别注意 
伪类就像真正的类一样,可以叠加使用 
没有数量上限,只要不是互斥的 
比如这样

em:first-child:hover {
color: red;
}
  • 1
  • 2
  • 3

这是完全可以的 
但注意,这里是“与”的关系 
也就是说既要满足“first-child”第一个子元素 
又要满足“hover”光标悬浮


伪元素就要严格的多 
伪元素在一个选择器中只能出现一次,并且只能出现在末尾 
(这里有同学误会了,所以我作出了修改) 
像下面的样式是无法生效的

p::first-letter:hover {  /*错误的写法:伪元素不是末尾*/
color: red;
}
  • 1
  • 2
  • 3
p::first-letter::selection {  /*错误的写法:伪元素出现了多个*/
color: red;
}
  • 1
  • 2
  • 3

再多说一句关于它们的优先级 
在计算权重的时候 
伪类与类优先级相同 
伪元素与标签优先级相同

总结

  • 伪类与伪元素都是用于向选择器加特殊效果
  • 伪类与伪元素的本质区别就是是否抽象创造了新元素
  • 伪类只要不是互斥可以叠加使用
  • 伪元素在一个选择器中只能出现一次,并且只能出现在末尾
  • 伪类与伪元素优先级分别与类、标签优先级相同

==主页传送门==

版权声明:本文为博主原创文章,转载请添加原文地址 https://blog.csdn.net/q1056843325/article/details/53560588

CSS3伪类与伪元素的区别及注意事项的更多相关文章

  1. CSS3伪类和伪元素的特性和区别

    前端er们大都或多或少地接触过CSS伪类和伪元素,比如最常见的:focus,:hover以及<a>标签的:link.visited等,伪元素较常见的比如:before.:after等. 其 ...

  2. CSS3伪类和伪元素的特性和区别尤其是 ::after和::before

    伪类和伪元素的理解 官方解释: 伪类一开始单单只是用来表示一些元素的动态状态,典型的就是链接的各个状态(LVHA).随后CSS2标准扩展了其概念范围,使其成为了所有逻辑上存在但在文档树中却无须标识的“ ...

  3. css3 -- 伪类与伪元素

    伪类: 1.结构伪类 A:E : first-child{} E : nth-*(n){} E : first-*(even){}  E : first-*(odd){} B:nth-child 是根 ...

  4. CSS 属性 - 伪类和伪元素的区别

    伪类和伪元素皆独立于文档结构.它们获取元素的途径也不是基于id.class.属性这些基础的元素特征,而是在处于特殊状态的元素(伪类),或者是元素中特别的内容(伪元素).区别总结如下: ①写法不一样: ...

  5. CSS 属性 :before && :after的用法,伪类和伪元素的区别

    一::before && :after的用法 :before 如同对伪元素的名称一样,:before 是用来给指定的元素的内容前面插入新的内容.举例说明: .before:before ...

  6. 详解 CSS 属性 - 伪类和伪元素的区别[转]

    首先,阅读 w3c 对两者的定义: CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相关,第二就是添加一些“特殊”的效果 ...

  7. 详解 CSS 属性 - 伪类和伪元素的区别(再也不用概念盲了!!!)

    首先,阅读 w3c 对两者的定义: CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相关,第二就是添加一些“特殊”的效果 ...

  8. 《转载》详解 CSS 属性 - 伪类和伪元素的区别

    首先,阅读 w3c 对两者的定义: CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相关,第二就是添加一些“特殊”的效果 ...

  9. CSS之 :before && :after的用法,伪类和伪元素的区别

    一::before && :after的用法 :before 如同对伪元素的名称一样,:before 是用来给指定的元素的内容前面插入新的内容.举例说明: .before:before ...

随机推荐

  1. ES6模块

    1. ES6模块是什么? ES6在语言层级上出现了“模块”的概念. javascript中一个文件就是一个模块,如果模块中使用了ES6的语法import或者export, 这个文件就是一个ES6模块. ...

  2. 五十五.ansible概述、ansible基础 、ad-hoc、批量配置管理

    1.环境准备 (自动化工具,批量操作) 6台 2cpu,1.5G以上内存,20G硬盘,1网卡 1.1 基础环境准备 1)启动6台虚拟机,ansible.sh   2)真机配置yum仓库 ]# tar ...

  3. 51nod 1412

    考虑到只与深度和点的个数有关$f[n][d]$ 表示 $n$ 个点,深度为 $d$ 的 $AVL$ 树有多少种 枚举左子树大小为 $i$, 进行转移并且深度为 $logn$ 级别 $f[n][d] = ...

  4. 数据结构实验之数组三:快速转置(SDUT 3347)

    Problem Description 转置运算是一种最简单的矩阵运算,对于一个m*n的矩阵M( 1 = < m < = 10000,1 = < n < = 10000 ),它 ...

  5. 【原创】go语言学习(一)

    一.go发展历史 1.1诞生历史 1.诞生于2006年1月下午15点4分5秒 2.2009发布并正式开园 3.2012年第一个正式版本Go1.0发布 4.截止2019年10月8日,Go1.13.1 1 ...

  6. C语言学习笔记5-程序结构

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/50752148 作者:jadeshu   邮箱: jades ...

  7. openpyxl -用于读/写Excel 2010 XLSX/XLSM文件的python库

    openpyxl -用于读/写Excel 2010 XLSX/XLSM文件的python库¶ https://www.osgeo.cn/openpyxl/index.html

  8. New in Python 3.8.0

    Python 3.8.0 发布时间: Oct. 14, 2019 这是一个Python3.8.0的稳定发行版. Python3.8.0是最新的Python编程语言发行版,ta包含了许多新的特征和优化. ...

  9. Cesium中级教程6 - 3D Models 三维模型

    3D Models 三维模型 本教程将教您如何通过Primitive API转换.加载和使用Cesium中的三维模型.如果你是Cesium的新用户,可能需要阅读三维模型部分的(空间数据可视化教程)[h ...

  10. test20190510