[CSS] 用伪元素:after实现分割线和气泡

学习前端网页开发并将其应用于工作中已经两个月了,发现前端包括的内容真的是无比丰富,知识量巨大……漫漫长路远,尚需艰苦努力。作为一只前端开发的菜鸟,写不了特别深刻的关于前端技术性文章,只是想将工作中遇到比较有意思的内容收集整理一下,理解一下,分享一下,希望对自己有所帮助,如果也能给读者带来一些帮助和启发,将不甚荣幸……闲话少说,进入正题。

在网页设计中显示分割线可以使用元素的border单边显示即可,但是这种方法会增大元素的长度或者宽度,在元素需要精细计算以便达到布局效果的情况下,添加border往往会打乱布局。比如下面的html代码,想实现两个horizontal-cell的div水平排列,并且各占父节点的50%的宽度,并且中间要添加分割线。

<div class="content">
    <div class="horizontal-cell" >分割线</div>
    <div class="horizontal-cell separator">显示分割线</div>
</div>

如果我们只是简单在separator类的样式的中添加border-left 属性,虽然也添加了分割线,但是会影响两个horizontal-cell类的div布局将会从横向变成纵向,打乱了布局。为解决这个问题,可以使用伪元素:after,css代码如下:

/*两个元素各占50%的宽度在水平方向显示,添加分割线*/
.horizontal-cell{
    float: left;    
    width: 50%;    
    background: light green;
}
.separator{   
    position: relative;
}
.separator:after{    
   position: absolute;    
   top:0.1em;    
   height: calc(100% - 0.2em);    
   left:0;    
   content: '';    
   width:0;    
   border-left: solid  darkblue 1px;
}
分割线效果图.png

.separator:after 伪元素会浮在horizontal-cell类的元素之上,不会挤用横向的空间,.separator:after中用border-left属性来实现竖直分割线的显示。我们也可以用同样的方法实现水平的分割线。

用类似的方法我们也可以在垂直排列的内部文字需要对齐的列表上打标记。html代码和相应的css代码如下:

<div class="content">
    <div class="cell0 " >不带mark 的 cell0</div>
    <div class="cell0 mark" >带mark 的 cell0(使用:after伪元素方法)</div>
    <div class="cell0 left-border" >带mark 的 cell0(不使用:after伪元素方法,直接用css属性border)</div>
</div>
/*前置色块标记*/
.cell0{    
      padding-left: 1.2em;    
      background: lightgrey;    
      text-align: left;
}
.mark {    
      position: relative;
}
.mark:after{    
      position: absolute;    
      top:0;    
      height: 100%;    
      left:0;    
      content: '';    
      width:0;    
      border-left: solid  #5dd7bf 0.6em;
}
.left-border{    
      border-left: solid  #5dd7bf 0.6em;
}

效果图如下:


加标记效果图.png

效果图中第三行的样式没有使用:after,与第二行对比可以看出,虽然也加了标记,但是却没有与第一行中的文本进行对齐。

:after除了实现分割线、标记色块,还有一个非常有用的应用就是实现类似手机对话框的气泡,可以看如下代码:

<div class="bubble bubble-left">箭头指向左边的气泡</div>
<div class="bubble bubble-right">箭头指向右边的气泡</div>
<div class="bubble bubble-top">箭头指向上边的气泡</div>
<div class="bubble bubble-bottom">箭头指向下边的气泡</div>
/*气泡相关,可以用于显示对话框等等*/
.bubble{    
    position: relative;    
    padding: 0.75em;    
    color: #ffffff;    
    font-size: 0.9em;    
    line-height: 1.3em;    
    text-align: left;    
    border-radius: 0.5em;    
    margin-left: 3.6em;    
    margin-top: 1.2em;    
    margin-bottom: 1.2em;    
    margin-right: 5.2em;    
    float: left;    
    background-color: #60d8ce;    
    height: 4em;
}
.bubble:after {    
    content: '';    
    position: absolute;    
    width: 0;    
    height: 0;    
    border: 15px solid rgba(0, 0, 0, 0);    
    border-left-width: 0;
}
.bubble-left:after {    
    border-right-color: #60d8ce;    
    top: 0%;    
    right: 100%;    
    margin-top: 0.9em;    
    border-left-width: 0.0em;    
    border-right-width: 0.6em;    
    border-bottom-width: 0.4em;    
    border-top-width: 0.4em;
}
.bubble-right:after {    
    border-left-color: #60d8ce;    
    top: 0%;    left: 100%;    
    margin-top: 0.9em;    
    border-right-width: 0.0em;    
    border-left-width: 0.6em;    
    border-bottom-width: 0.4em;    
    border-top-width: 0.4em;
}
.bubble-top:after {    
    border-bottom-color: #60d8ce;    
    left: 0%;    
    bottom: 100%;    
    margin-left: 1.9em;    
    border-top-width: 0.0em;    
    border-bottom-width: 0.6em;    
    border-left-width: 0.4em;    
    border-right-width: 0.4em;
}
.bubble-bottom:after {    
    border-top-color: #60d8ce;    
    left: 0%;    
    top: 100%;    
    margin-left: 1.9em;    
    border-bottom-width: 0.0em;    
    border-top-width: 0.6em;    
    border-left-width: 0.4em;    
    border-right-width: 0.4em;
}

气泡箭头部分的实现与之前例子中的分割线类似,都是用伪元素:after 的border的宽度和颜色透明与否来实现长方形或者三角形箭头的形状,然后通过left、right、top、bottom等等属性调整:after伪元素与圆角对话框元素的相对位置,来实现气泡的形状。

气泡效果图.png

综合来看,以上所提到伪元素:after来实现分割线和气泡,方法是类似的,关键点是元素的CSS的position属性要设置成relative,而与之相应的:after伪元素(用来形成三角形或者矩形)的position属性要设置成absolute,这样:after伪元素才能够调整与元素的相对位置,然后改变:after伪元素的展现的形状,从而实现分割线、标记和气泡等效果。

由于是前端开发的菜鸟,以上关于伪元素:after的应用只是提到了一点皮毛,只是做一点小小的归纳,希望随着自己学习的深入,以后关于前端的技术文章能写得更加深入。以上贴出来的代码部分,已经比较完整,复制粘贴到工程里,完全可以实现以上效果图显示的效果。完整源码下载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,727评论 1 92
  • 各种纯css图标 CSS3可以实现很多漂亮的图形,我收集了32种图形,在下面列出。直接用CSS3画出这些图形,要比...
    剑残阅读 9,472评论 0 8
  • 本文转载自:众成翻译译者:为之漫笔链接:http://www.zcfy.cc/article/239原文:http...
    极乐君阅读 7,348评论 1 62
  • 1、属性选择器:id选择器 # 通过id 来选择类名选择器 . 通过类名来选择属性选择器 ...
    Yuann阅读 1,617评论 0 7
  • 昨晚,借助蓝夜的能量,梦中也正是从上往下看的一个视觉角度,帮我提高了一层思想纬度。 人,出生入死,早晚都是要回“家...
    UnaFung阅读 207评论 0 1