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. Win内核原理与实现学习笔记2-现代操作系统的基本结构

    1.操作系统本属于软件的范畴,但它需要紧密的跟硬件打交道,它为上层应用软件或应用系统提供了一层抽象,专门负责硬件资源的管理和分配.(应用程序不需要跟硬件打交道,它们利用操作系统提供的功能来实现各种任务 ...

  2. 内存管理3- @property 参数详解

    @property ----------------- Create two classes: Book & Student ------------------- book.m #impor ...

  3. 爬虫之解析库Xpath

    简介 XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言. XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力.起初XPat ...

  4. hive安装运行hive报错通解

    参考博文:https://blog.csdn.net/lsxy117/article/details/47703155 大部分问题还是hadoop的配置文件的问题: 修改配置文件hadoop/conf ...

  5. 2018-2019-2 20165210《网络对抗技术》Exp9 Web安全基础

    2018-2019-2 20165210<网络对抗技术>Exp9 Web安全基础 实验目的 本实践的目标理解常用网络攻击技术的基本原理. 实验内容 安装Webgoat SQL注入攻击 - ...

  6. TNetHttpClient的用法

    TNetHttpClient的用法 TNetHttpClient是DELPHI XE8新增加的控件. 在之前,我们一般都是使用IDHTTP控件,但在安卓.IOS等非WINDOWS平台,IDHTTP访问 ...

  7. dd 命令

    dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: if=文件名:输入文件名 ...

  8. 【NetDevops】网络自动化运维--1获取用户基本信息

     版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.  之前博客的云主机到期了没续费,被删啦最重要的是没有备份!此处省略几个字.....      ...

  9. 从零搭建配置Cuckoo Sandbox

    1.安装依赖 $ sudo apt-get install git mongodb libffi-dev build-essential python-django python python-dev ...

  10. opencv C++ mask_rcnn

    #include <fstream> #include <sstream> #include <iostream> #include <string.h> ...