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. 06_检测本机当前用户是否为超级管理员,如果是管理员,则使用 yum 安装 vsftpd,如果不是,则提示您非管理员(使用子串对比版本)

    #!/bin/bashif [ $USER == "root" ];then #或者 if [ $UID -eq 0 ];then    yum -y install vsftpd ...

  2. WIN10环境下点击通知栏图标时自动切换输入法导致图标位置变动

    这个问题由来已久,每当点击系统右下角任务栏中的按钮时,原本是搜狗输入法就会自动变成“US [ 中文(简体,中国) ]”,图标会自动错位,导致响应的是其他功能. 假设上图是正常的环境,此时我点击电池图标 ...

  3. 本地项目文件通过git提交到GitHub上

    参考:https://blog.csdn.net/kongying19910218/article/details/50515834 步骤: 1.初始化git,假如我们要提交test文件夹下的所有目录 ...

  4. mybatis参数形式

    1 使用map <select id="selectRole" parameterType="map" resultType="RoleMap& ...

  5. spaCy 第二篇:语言模型

    spaCy处理文本的过程是模块化的,当调用nlp处理文本时,spaCy首先将文本标记化以生成Doc对象,然后,依次在几个不同的组件中处理Doc,这也称为处理管道.语言模型默认的处理管道依次是:tagg ...

  6. Truffle测试框架

    Truffle测试框架 2018年06月08日 19:01:19 tianlongtc 阅读数 1000   Truffle 有一个标准的自动化测试框架,让你可以非常方便地测试您的合约.这个框架允许您 ...

  7. 使用 pip wheel 实现 Python 依赖包的离线安装

    pip python 依赖 安装 有时候, 需要部署 Python 应用的服务器没有网络连接, 这时候, 你就要把整个 Python 应用做成离线安装包. 借助 wheel, 很容易就可以实现. 首先 ...

  8. 最新react-native(Expo)安装使用antd-mobile-rn组件库

    1\安装antd-mobile-rn 库 npm install antd-mobile-rn --save 2.按需加载 npm install babel-plugin-import --save ...

  9. Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in 解决方案:$sql = ...

  10. mongodb MongoDB C#/.NET driver version

    The first column lists the driver version(s). C#/.NET Driver Version MongoDB 2.6 MongoDB 3.0 MongoDB ...