其中伪类和伪元素的根本区别在于:它们是否创造了新的元素。
伪元素/伪对象:不存在在DOM文档中,是虚拟的元素,是创建新元素。代表某个元素的子元素,这个子元素虽然在逻辑上存在,但却并不实际存在于文档树中。
伪对象选择符
属性 | 描述 | CSS |
---|---|---|
:first-letter | 向文本的第一个字母添加特殊样式。 | 1 |
:first-line | 向文本的首行添加特殊样式。 | 1 |
:before | 在元素之前添加内容。 | 2 |
:after | 在元素之后添加内容。 | 2 |
伪类选择符伪类:存在DOM文档中,逻辑上存在但在文档树中却无须标识的“幽灵”分类。
属性 | 描述 | CSS |
---|---|---|
:active | 向被激活的元素添加样式。 | 1 |
:focus | 向拥有键盘输入焦点的元素添加样式。 | 2 |
:hover | 当鼠标悬浮在元素上方时,向元素添加样式。 | 1 |
:link | 向未被访问的链接添加样式。 | 1 |
:visited | 向已被访问的链接添加样式。 | 1 |
:first-child | 向元素的第一个子元素添加样式。 | 2 |
:lang | 向带有指定 lang 属性的元素添加样式。 | 2 |
再看看W3C中对于二者应用的描述:
伪类:用于向某些选择器添加特殊的效果
(其实根本意思就是就是对那些不能通过class、id等选择元素的补充)
伪元素:用于将特殊的效果添加到某些选择
举个栗子:
<div>
<p>a</p>
<p>b c</p>
</div>
如果我们想要第一个p标签字体颜色变红怎么做呢 使用伪类就会很简单:
p:first-child {
color: red;
}
但是如果不用伪类我们怎么做呢? 这时我们就需要为第一个p标签添加一个类class
<div>
<p class="first-child">a</p>
<p>b c</p>
</div>
p:first-child {
color: red;
}
可以实现同样的效果,但是需要多写一个类
如果使用伪元素该如何实现上述操作呢?
p::first-letter {
color: red;
}
如果不用伪元素我们怎么做呢?
<div>
<p><span>a</span></p>
<p>b c</p>
</div>
p span {
color: red;
}
可以看出二者区别了
伪类的效果可以通过添加实际的类来实现
伪元素的效果可以通过添加实际的元素来实现
所以它们的本质区别就是是否抽象创造了新元素
注意:
伪类只能使用“:”
而伪元素既可以使用“:”,也可以使用“::”
因为伪类是类似于添加类所以可以是多个,而伪元素在一个选择器中只能出现一次,并且只能出现在末尾
相关问题
:after/::after和:before/::before的异同
:after/::after和:before/::before 的主要作用是在元素内容前后加上指定内容,
其下特有的content(可以为空),用于在css渲染中向元素逻辑上的头部或尾部添加内容。
示例:
HTML代码:
<p>你好</p>
CSS代码:
p:before{ content: 'Hello'; color: red; }
p:after{ content: 'Tom'; color: red; }
效果如图:
相同点
都可以用来表示伪元素,用来设置对象前的内容
:before和::before写法是等效的; :after和::after写法是等效的
不同点
:before/:after是Css2的写法,::before/::after是Css3的写法
:before/:after 的兼容性要比::before/::after好 ,
不过在H5开发中建议使用::before/::after比较好
注意:
伪元素要配合content属性一起使用
伪元素不会出现在DOM中,所以不能通过js来操作,仅仅是在 CSS 渲染层加入
伪元素的特效通常要使用:hover伪类样式来激活
eg:当鼠标移在span上时,span前插入”duang”
<style>
span{
background: yellow;
}
span:hover::before{
content:"duang";
}
</style>
<span>222</span>
复选框的实现
<input type="checkbox" id="btn">
input[type="checkbox"] {
width: 16px;
height: 16px;
display: inline-block;
text-align: center;
vertical-align: middle;
line-height: 13px;
position: relative;
}
input[type="checkbox"]::before {
content: "";
position: absolute;
top: 0;
left: 0;
background: #fff;
width: 100%;
height: 100%;
border: 2px solid #d9d9d9;
border-radius: 3px;
}
input[type="checkbox"]:checked::before {
content: "\2714";
background-color: #fff;
color: #1875ff;
position: absolute;
top: 0;
left: 0;
width: 100%;
border: 2px solid #1875ff;
font-size: 18px;
font-weight: bold;
border-radius: 3px;
}
效果展示: