CSS3伪类与伪元素的区别及注意事项
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
再多说一句关于它们的优先级
在计算权重的时候
伪类与类优先级相同
伪元素与标签优先级相同
总结
- 伪类与伪元素都是用于向选择器加特殊效果
- 伪类与伪元素的本质区别就是是否抽象创造了新元素
- 伪类只要不是互斥可以叠加使用
- 伪元素在一个选择器中只能出现一次,并且只能出现在末尾
- 伪类与伪元素优先级分别与类、标签优先级相同
CSS3伪类与伪元素的区别及注意事项的更多相关文章
- CSS3伪类和伪元素的特性和区别
前端er们大都或多或少地接触过CSS伪类和伪元素,比如最常见的:focus,:hover以及<a>标签的:link.visited等,伪元素较常见的比如:before.:after等. 其 ...
- CSS3伪类和伪元素的特性和区别尤其是 ::after和::before
伪类和伪元素的理解 官方解释: 伪类一开始单单只是用来表示一些元素的动态状态,典型的就是链接的各个状态(LVHA).随后CSS2标准扩展了其概念范围,使其成为了所有逻辑上存在但在文档树中却无须标识的“ ...
- css3 -- 伪类与伪元素
伪类: 1.结构伪类 A:E : first-child{} E : nth-*(n){} E : first-*(even){} E : first-*(odd){} B:nth-child 是根 ...
- CSS 属性 - 伪类和伪元素的区别
伪类和伪元素皆独立于文档结构.它们获取元素的途径也不是基于id.class.属性这些基础的元素特征,而是在处于特殊状态的元素(伪类),或者是元素中特别的内容(伪元素).区别总结如下: ①写法不一样: ...
- CSS 属性 :before && :after的用法,伪类和伪元素的区别
一::before && :after的用法 :before 如同对伪元素的名称一样,:before 是用来给指定的元素的内容前面插入新的内容.举例说明: .before:before ...
- 详解 CSS 属性 - 伪类和伪元素的区别[转]
首先,阅读 w3c 对两者的定义: CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相关,第二就是添加一些“特殊”的效果 ...
- 详解 CSS 属性 - 伪类和伪元素的区别(再也不用概念盲了!!!)
首先,阅读 w3c 对两者的定义: CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相关,第二就是添加一些“特殊”的效果 ...
- 《转载》详解 CSS 属性 - 伪类和伪元素的区别
首先,阅读 w3c 对两者的定义: CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相关,第二就是添加一些“特殊”的效果 ...
- CSS之 :before && :after的用法,伪类和伪元素的区别
一::before && :after的用法 :before 如同对伪元素的名称一样,:before 是用来给指定的元素的内容前面插入新的内容.举例说明: .before:before ...
随机推荐
- 013_Linux驱动之_poll机制
1. 功能:poll的机制与select相似,与select在本质上没有多大差别.管理多个描写叙述符也是进行轮询,依据描写叙述符的状态进行处理,可是poll没有最大文件描写叙述符数量的限制. 2. 技 ...
- 通过无线网络使用ADB ( Connect to android with ADB over TCP )
之前用USB数据线连接电脑和android手机,用adb操控手机. 后来电脑前面板的USB全坏了,键盘.鼠标.USBKkey.打印机都需USB, 少一个USB口,只得对不常用设备进行插拔切换. 于是 ...
- chrome扩展开发实战入门之二-自动搜索
目标:产生随机数,用于百度搜索:像看电视一样观看搜索结果 参考上一篇,新建目录hellocrx,其中三个文件:manifest.json content_script.js 和jquery-3.4. ...
- 7月清北学堂培训 Day 4
今天是丁明朔老师的讲授~ 图论 图是种抽象结构,这种抽象结构可以表示点与点之间的关系. 最短路: Dijkstra(堆优化) SPFA Floyd 最小生成树: Kruscal 连通性: BFS / ...
- 百度翻译api初使用(很久没写python了,写几行玩玩)
调用free api做做简易的翻译 这个是百度翻译api文档 http://api.fanyi.baidu.com/api/trans/product/apidoc 照着百度api给的文档向web服务 ...
- idea导入项目之后包位置报错
解决办法:
- Pluck CMS 4.7.10远程代码执行漏洞分析
本文首发于先知: https://xz.aliyun.com/t/6486 0x01漏洞描述 Pluck是用php编写的一款的小型CMS影响版本:Pluck CMS Pluck CMS 4.7.10( ...
- Java操作Cookie方法
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- Mybatis 传入多个参数查询数据 (3种方法)
第一种方案 DAO层的函数方法 public User selectUser(String name,String area); 对应的Mapper.xml <select id="s ...
- sed中使用变量及变量中存在特殊字符‘/’处理
sed中使用变量,普通的处理方式无法解析变量 如当前file文件中存在字符串pedis,现将其替换为redis [root@localhost work]# cat file pedis 如下两种替换 ...