伪类和伪元素(以复选框为例)

其中伪类和伪元素的根本区别在于:它们是否创造了新的元素。

伪元素/伪对象不存在在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;
        }

效果展示:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值