下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

编程语言实现自适应分隔线的N种方法

作者:佚名     来源: 前端教程点击数:590发布时间: 2020-02-29 17:01:55

标签: 编程语言htmlcss

大神带你学编程,欢迎选课

css实现自适应分隔线的N种方法。在过去的几十年间,大量的编程语言被发明、被取代、被修改或组合在一起。尽管人们多次试图创造一种通用的程序设计语言,却没有一次尝试是成功的。之所以有那么多种不同的编程语言存在的原因是,编写程序的初衷其实也各不相同;新手与老手之间技术的差距非常大,而且有许多语言对新手来说太难学;还有,不同程序之间的运行成本(runtime cost)各不相同。

偷偷的看了一下知乎的实现,很显然是用一块白色背景覆盖的,加一点背景就露馅了,下面列举几种更好的实现方式,不会露馅的那种。

实现自适应分隔线的N种方法_编程语言_Java_Javascript_课课家是网页中比较常见的一类设计了,比如说知乎的更多回答

这里的自适应是指两边的横线会随着文字的个数和父级的宽度自适应

偷偷的看了一下知乎的实现,很显然是用一块白色背景覆盖的,加一点背景就露馅了

心想:知乎的前端也不怎么样? 可能别人的重点不在这些上面吧

下面列举几种更好的实现方式,不会露馅的那种

1.伪元素+transform:translateX(-100%);

主要原理是设置文本居中text-align: center;,然后给定两个伪元素,分别绝对定位,那么此时伪元素也是跟随着水平居中的,设置足够的宽度,然后把左边的往左位移100%就可以了,父级记得超出隐藏。

具体实现如下

html结构为

  1. <div class="title">我是分割线</div> 

css样式为

  1. .title{  
  2.     position: relative;  
  3.     text-align: center;  
  4.     overflow: hidden;  
  5.     font-size: 14px;  
  6.     color: #999;  
  7. }  
  8. .title::before,.title::after{  
  9.     content: '';  
  10.     display: inline-block;  
  11.     width: 100%;  
  12.     height: 1px;  
  13.     position: absolute;  
  14.     background: #ccc;  
  15.     top: 50%;  
  16. }  
  17. .title::before{  
  18.     margin-left: -10px;  
  19.     transform: translateX(-100%);  
  20. }  
  21. .title::after{  
  22.     margin-left: 10px;  

CSS分隔线 (伪元素+transform)

2.伪元素+flex

这个比较好理解了,设置display:flex,然后两个伪元素分别铺满剩余空间。

具体实现如下

html结构为

  1. <div class="title">我是分割线</div> 

css样式为

  1. .title{  
  2.     display: flex;  
  3.     align-items: center;  
  4.     font-size: 14px;  
  5.     color: #999;  
  6. }  
  7. .title::before,.title::after{  
  8.     content: '';  
  9.     flex: 1;  
  10.     height: 1px;  
  11.     background: #ccc;  
  12. }  
  13. .title::before{  
  14.     margin-right: 10px; 
  15. }  
  16. .title::after{  
  17.     margin-left: 10px;  

CSS分隔线 (伪元素+flex)

3.伪元素+box-shadow/outline+clip-path

同样利用text-align: center使文本和伪元素居中,然后生成足够大的box-shadow或者outline,由于不支持单个方向,所以用clip-path或者clip裁剪掉

具体实现如下

html结构为

  1. <div class="title">我是分割线</div> 

css样式为

  1. .title{  
  2.     text-align: center;  
  3.     font-size: 14px;  
  4.     color: #999;  
  5.     overflow: hidden;  
  6. }  
  7. .title::before,.title::after{  
  8.     content: '';  
  9.     display: inline-block;  
  10.     width: 0;  
  11.     height: 1px;  
  12.     box-shadow: 0 0 0 9999px #ccc;  
  13.     vertical-align: middle;  
  14. }  
  15. .title::before{  
  16.     margin-right: 10px;  
  17.     clip-path: polygon(0 0, -9999px 0, -9999px 100%, 0 100%);  
  18. }  
  19. .title::after{  
  20.     margin-left: 10px;  
  21.     clip-path: polygon(0 0, 9999px 0, 9999px 100%, 0 100%);  

CSS分隔线 (伪元素+box-shadow/outline+clip-path)

4.伪元素+right:100%

这个实现需要多一层标签,外部仍然是text-align: center,内部文本里添加两个伪元素绝对定位,其中左边的设置距离右边100%(相对于文本标签)即可

具体实现如下

html结构为

  1. <div class="title">  
  2.     <span class="inner">我是分割线</span>  
  3. </div> 

css样式为

  1. .title{  
  2.     text-align: center;  
  3.     font-size: 14px;  
  4.     color: #999;  
  5.     overflow: hidden;  
  6. }  
  7. .inner{  
  8.     position: relative;  
  9. }  
  10. .inner::before,.inner::after{  
  11.     position: absolute;  
  12.     content: '';  
  13.     width: 9999px;  
  14.     height: 1px;  
  15.     background: #ccc;  
  16.     top: 50%;  
  17. }  
  18. .inner::before{  
  19.     right: 100%;  
  20.     margin-right: 10px;  
  21. }  
  22. .inner::after{  
  23.     margin-left: 10px;  

CSS分隔线 (伪元素+right:100%)

5. border+transform

这个思路可以不用到伪元素,不过需要额外的标签,给内部文本左右足够大的1px边框,此时需要设置line-height:1px,由于内部整体以及足够大了(超过父级),可以使用绝对定位和transform: translateX(-50%)居中

具体实现如下

html结构为

  1. <div class="title">  
  2.     <span class="inner">我是分割线</span>  
  3. </div> 

css样式为

  1. .title{  
  2.     position: relative;  
  3.     text-align: center;  
  4.     font-size: 14px;  
  5.     color: #999;  
  6.     overflow: hidden;  
  7.     padding: .6em 0;/**把高度撑起来**/  
  8. }  
  9. .inner{  
  10.     position: absolute;  
  11.     left: 50%;  
  12.     transform: translateX(-50%);  
  13.     white-space: nowrap;  
  14.     line-height: 1px;  
  15.     border-left: 9999px solid #ccc;  
  16.     border-right: 9999px solid #ccc;  
  17.     padding: 0 10px;  

CSS分隔线 (border+transform)

6.伪元素+border+left/right

这个思路只需要一个伪元素,在文本内部生成一个伪元素,利用足够大的border和相同的负值(绝对定位+left/right)还原位置

具体实现如下

html结构为

  1. <div class="title">  
  2.     <span class="inner">我是分割线</span>  
  3. </div> 

css样式为

  1. .title{  
  2.     text-align: center;  
  3.     font-size: 14px;  
  4.     color: #999;  
  5.     overflow: hidden;  
  6. }  
  7. .inner{  
  8.     position: relative;  
  9.     padding: 0 10px;  
  10. }  
  11. .inner::before{  
  12.     content: '';  
  13.     position: absolute;  
  14.     height: 1px;  
  15.     top: 50%;  
  16.     border-left: 9999px solid #ccc;  
  17.     border-right: 9999px solid #ccc;  
  18.     right: -9999px;  
  19.     left: -9999px;  

CSS分隔线 (伪元素+border+left/right)

7.伪元素+table-cell

主要思路为父级设置display:table,伪元素设置display:table-cell,并设置足够大的宽度即可

具体实现如下

html结构为

  1. <div class="title">  
  2.     <span class="inner">我是分割线</span>  
  3. </div> 

css样式为

  1. .title{  
  2.     display: table;  
  3.     font-size: 14px;  
  4.     color: #999;  
  5. }  
  6. .inner{  
  7.     display: table-cell;  
  8.     white-space: nowrap;  
  9.     padding: 0 10px;  
  10. }  
  11. .title::before,.title::after{  
  12.     content: '';  
  13.     display: table-cell;  
  14.     width: 9999px;  
  15.     overflow: hidden;  
  16.     background: linear-gradient(#ccc 0,#ccc) center no-repeat;/**这里用线性渐变生成的,也可以用其他方式**/  
  17.     background-size: 100% 1px;  

CSS分隔线 (伪元素+table-cell)

8.fieldset+legend

利用fieldset和legend标签组合,可以天然实现分隔线效果,参考至张鑫旭的这篇文章

具体实现如下

html结构为

  1. <fieldset class="title">  
  2.     <legend class="inner">我是分割线</legend>  
  3. </fieldset> 

css样式为

  1. .title{  
  2.     font-size: 14px;  
  3.     color: #999;  
  4.     border: 0;  
  5.     border-top: 1px solid #ccc;  
  6.     padding: 0;  
  7. }  
  8. .inner{  
  9.     margin: 0 auto;;  
  10.     padding: 0 10px;  

CSS分隔线 (fieldset+legend)

小结

上面一共列举了8种方式来实现分隔线的效果,每种方法思路各不相同,重要的是可以发散自己的想象力,可能这才是CSS与其他语言所不同的吧~

这里整理了一下,整体效果如下非大家在实际项目中可自行选取所需要的方式

高级语言的出现使得计算机程序设计语言不再过度地依赖某种特定的机器或环境。这是因为高级语言在不同的平台上会被编译成不同的机器语言,而不是直接被机器执行。最早出现的编程语言之一FORTRAN的一个主要目标,就是实现平台独立。

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程