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. MySQL Group Replication-MGR集群简介

    简介 MySQL Group Replication(简称MGR)字面意思是mysql组复制的意思,但其实他是一个高可用的集群架构,暂时只支持mysql5.7和mysql8.0版本. 是MySQL官方 ...

  2. MySQL数据分析(7)-试着使用SQL

    (一) 1.1 启动服务器 Windows版命令: net start mysql 或者 C:\mysql-5.5.20-winx64\mysql-5.5.20-winx64\mysql Mac版命令 ...

  3. Robot Framework(十九) 附录

    6附录 6.1测试数据中的所有可用设置 6.1.1设置表 Setting表用于导入测试库,资源文件和变量文件,以及定义测试套件和测试用例的元数据.它可以包含在测试用例文件和资源文件中.请注意,在资源文 ...

  4. Python学习日记(九)—— 模块二(logging、json&pickle、xml、requests、configparser、shutil、subprocess)

    logging模块 用于便捷记录日志且线程安全的模块(便捷的写文件的模块,不允许多个人同时操作文件) 1.单文件日志 import logging logging.basicConfig(filena ...

  5. oracle查询历史执行语句

    SELECT * FROM v$sqlarea WHERE PARSING_SCHEMA_NAME='GAVIN' and SQL_TEXT LIKE '%delete%' ORDER BY LAST ...

  6. Kafka - SASL认证

    kafka SASL认证配置 1.找到kafka安装根目录,在config文件夹下创建kafka_server_jaas.conf,写入 KafkaServer { org.apache.kafka. ...

  7. Apache Flink - 配置依赖,连接器,库

    每个Flink程序都依赖于一组Flink库. 1.Flink核心和应用程序依赖项 Flink本身由一组类和运行需要的依赖组成.所有类和依赖的组合形成了Flink运行时的核心,并且当一个Flink程序运 ...

  8. CTF辅助脚本

    首先推荐这篇文章,网上有多次转载,这是我见过日期比较早的 CTF中那些脑洞大开的编码和加密 凯撒密码 flag='flag{abcdef}' c='' n=20 for i in flag: if ' ...

  9. 图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

    1. 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 1.首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 2.当没有未访问过的顶点时,则回 ...

  10. Colab 实用教程

    Google Colab 是什么? Google Colab 是一个免费的云服务,现在它还支持免费的 GPU! 你可以: 提高你的 Python 语言的编码技能. 使用 Keras.TensorFlo ...