css:befor :after 伪元素的妙用

1.介绍

CSS中的:befor、:after都会创建一个伪元素,其中:befor创建的伪元素是所选元素的第一个子元素,:after创建的伪元素是所选元素的最后一个子元素。

:befor、:after创建的伪元素默认样式为内联样式

2.语法

/* CSS3 */
selector::before
 
/* CSS2 */
selector:before

CSS3引入了 ::(两个冒号)是用来区分伪类(:一个冒号)和伪元素(::两个冒号)。

伪类:操作元素本身,如 :hover、:first-child、:focus等等。

伪元素:操作元素的子元素,如 ::before、::after、::content等等。

在IE8中只支持:(一个冒号),所以为了兼容这些浏览器也可以使用 :befor、:after。

3.content属性

content 属性表示伪元素填充的内容。

示例:

html:

<div class="test-div">"hello"</div>

css:

.test-div {
    width: 100px;
    height: 100px;
    margin-left: 20px;
    background-color: #eee;
}
 
.test-div::before {
    content: "♥";
    color: red;
}
 
.test-div::after {
    content: "♥";
    color: blue;
}

效果:

 4.可替换元素

可替换元素(replaced element):其展现不由CSS来控制的。这些元素是一类外观渲染独立于CSS的对象。

典型的可替换元素有<iframe>、<img>、 <object>、 <video> 以及 表单元素,如<textarea>、 <input> 。

某些元素只在一些特殊情况下表现为可替换元素,例如 <audio> 和 <canvas> 。

:befor :after 在此类元素内是不生效的。

5.浏览器支持情况

IE9版本才开始完全支持 :befor :after ,Chrome、Firefox现都已全线支持。

IE Edge Firefox Chrome Android Chrome Ios Safari
9 all 2 all all all

 

 

 

6.应用场景

1)支持文本字符

html:

<span class="book">JavaScript 权威指南</span>
<br>
<span class="book">JavaScript 高级程序设计</span>

css:

.book::before {
    content: "《";
    color: red;
}

.book::after {
    content: "》";
    color: blue;
}

效果:

  2)支持iconfont

说明:content属性也支持iconfont字体图表的展示。这也是使用最多的场景。

示例:此示例已引用了阿里iconfont图标库

html:

<link rel="stylesheet" href="//at.alicdn.com/t/font_535317_4pkadolrurdrhpvi.css">
<span class="wechat">微信</span>

css:

.wechat::before {
    content: "\e85b";
    font-family: "iconfont";
    font-size: 15px;
    font-style: normal;
    color: #44b549;
}

效果:

 3.1)进度线

说明::befor :after创建的伪元素可以以线条方式定位在元素周边的指定位置上,如进度线和时间线。

html:

<div class="progress-line-wrapper">
    <div class="item active">
        <span class="title">填写身份信息</span>
        <span class="step">1</span>
    </div>
    <div class="item">
        <span class="title">补充用户资料</span>
        <span class="step">2</span>
    </div>
    <div class="item">
        <span class="title">完成注册</span>
        <span class="step">3</span>
    </div>
</div>

css:

.progress-line-wrapper .item {
width: 120px;
float: left;
text-align: center;
font-size: 14px;
}

.progress-line-wrapper .item .title {
display: block;
color: #d5d5d5;
}

.progress-line-wrapper .item .step {
width: 20px;
height: 20px;
display: inline-block;
position: relative;
background-color: #d5d5d5;
color: #fff;
border-radius: 50%;
text-align: center;
}

.progress-line-wrapper .item .step::before,
.progress-line-wrapper .item .step::after {
content: '';
width: 50px;
height: 4px;
background-color: #d5d5d5;
position: absolute;
top: 8px;
}

.progress-line-wrapper .item .step::before {
right: 20px;
}

.progress-line-wrapper .item .step::after {
left: 20px;
}

/* 激活时样式 */
.progress-line-wrapper .item.active .title {
color: #c12d1e;
}

.progress-line-wrapper .item.active .step {
background-color: #c12d1e;
color: #fff;
}

.progress-line-wrapper .item.active .step::before,
.progress-line-wrapper .item.active .step::after {
background-color: #c12d1e;
}

效果:

 3.2)时间线

html:

<!-- 时间线 -->
<div class="time-line-wrapper">
    <div class="item avtive">
        <span class="title">配送完成</span>
        <span class="time">2018/02/02 18:10</span>
    </div>
    <div class="item">
        <span class="title">开始配送</span>
        <span class="time">2018/02/02 17:40</span>
    </div>
    <div class="item">
        <span class="title">接收订单</span>
        <span class="time">2018/02/02 17:31</span>
    </div>
    <div class="item">
        <span class="title">提交订单</span>
        <span class="time">2018/02/02 17:30</span>
    </div>
</div>

css:

/* 时间线 */

.time-line-wrapper .item {
    position: relative;
    padding-top: 50px;
    margin-left: 20px;
}

.time-line-wrapper .item::before {
    width: 15px;
    height: 15px;
    content: '';
    background-color: #d5d5d5;
    border-radius: 50%;
    position: absolute;
    bottom: 5px;
    left: -20px;
    z-index: 1001;
}

.time-line-wrapper .item::after {
    width: 5px;
    height: 90%;
    content: '';
    background-color: #d5d5d5;
    position: absolute;
    bottom: 15px;
    left: -15px;
    z-index: 1000;
}

/* 时间线的第一个节点,表示目前的状态 */
.time-line-wrapper .item:first-child {
    padding-top: 0px;
}

.time-line-wrapper .item:first-child::before {
    background-color: #3fa6c5;
}

.time-line-wrapper .item:first-child:after {
    display: none;
}

效果:

4)几何图形

说明:通过设置 :befor :after 伪元素的border相关属性,可创建非常多的几何图形;如三角形、多边形、五角星等等。

4.1)矩形

说明:默认情况下,:befor :after 伪元素的border边框属性与其他HTML元素一样。

css:

div::before {
    width: 0px;
    height: 0px;
    content: '';
    position: absolute;
    border-top: 50px solid #f50000;
    border-right: 50px solid #6cc361;
    border-bottom: 50px solid #6167c3;
    border-left: 50px solid #fa00d9;
}

效果:

 

 4.2)三角形

说明:显示某一方位的border,并隐藏左右2边的border(背景设置为透明),可让伪元素显示三角形的形状。

html:

<!-- 三角形 -->
<div class="triangle top"></div>
<div class="triangle right"></div>
<div class="triangle bottom"></div>
<div class="triangle left"></div>

css:

.triangle {
    width: 0px;
    height: 0px;
    display: inline-block;
    margin-right: 100px;
    position: relative;
}

.triangle::before {
    width: 0px;
    height: 0px;
    content: '';
    position: absolute;
}

.triangle.top::before {
    border-top: 0px;
    border-right: 30px solid transparent;
    border-bottom: 30px solid #f50000;
    border-left: 30px solid transparent;
}

.triangle.right::before {
    border-top: 30px solid transparent;
    border-right: 0px;
    border-bottom: 30px solid transparent;
    border-left: 30px solid #f50000;
}

.triangle.bottom::before {
    border-top: 30px solid #f50000;
    border-right: 30px solid transparent;
    border-bottom: 0px;
    border-left: 30px solid transparent;
}

.triangle.left::before {
    border-top: 30px solid transparent;
    border-right: 30px solid #f50000;
    border-bottom: 30px solid transparent;
    border-left: 0px;
}

效果:

 

 7.扩展阅读

MDN ::before:https://developer.mozilla.org/en-US/docs/Web/CSS/::before

MDN ::after:https://developer.mozilla.org/en-US/docs/Web/CSS/::after

::before、::after介绍:https://css-tricks.com/pseudo-element-roundup/

CSS 几何图形:https://css-tricks.com/examples/ShapesOfCSS/

posted @ 2019-12-20 10:49  蝴蝶菲菲  阅读(1099)  评论(0编辑  收藏  举报