前言
在前端的业务场景中,经常看到有关时间轴的一些样式,通过一条线贯穿头部和尾部,每个节点中有这个节点的相关标记,那么如果我们相关的样式要怎么实现呢?
水平的轴
代码地址:https://codepen.io/robinson90/pen/oNvxBWZ
效果图:

实现思路:
1.顶部的线或者其他轴的效果,通过另外一个div实现
2.与节点相关的样式,包括位置与内容,通过伪元素实现
具体代码:
<div class="crossline"><div class="line"></div><ul class="stepUl"><li class="step">13</li><li class="step">34</li><li class="step">34</li></ul></div>
*{margin:0;padding:0;border:none;}li{list-style:none}.crossline{padding-top:20px;.line{border-bottom:1px dashed gray;}.stepUl{display:flex;margin-top:10px;.step:nth-child(2){&::after{position:absolute;background:#fff;top:-25px;content:'>b';display:inline-block;left:50%;padding:0 5px;background:#fff;}}.step:nth-child(3){margin-right:0;&::after{position:absolute;background:#fff;top:-25px;content:'>c';width:50%;height:20px;display:inline-block;left:50%;background:#fff;}}.step:nth-child(1){&::before{position:absolute;background:#fff;top:-25px;content:'';width:50%;height:20px;display:inline-block;left:0%;background:#fff;}&::after{position:absolute;background:#fff;top:-25px;content:'a';display:inline-block;left:50%;padding:0 5px;background:#fff;}}.step{flex:1;position:relative;margin-right:5px;border:1px solid red;}}}
垂直方向的时间轴
实现效果

实现思路:
整体与上面的思路一致,也是用边框做贯穿轴,然后用每个节点的伪元素去抹去不需要的部分,同时用另一个伪元素去实现节点标记本身。(代码见上面地址)
element-ui 的时间线
组件地址:https://element.eleme.cn/#/zh-CN/component/timeline
样式效果:

实现思路:
1 每个节点包含三个部分,分别用于实现竖线,节点样式,主体内容
2 为了保障向下的间距,每个节点包含了向下的20padding作为间距,这里不使用margin是因为需要使用节点的边框来实现时间轴效果
3 竖线使用绝对定位,拿到盒模型的全部高度,使用灰色线
4 节点样式使用绝对定位,圆角
5 主题内容留出向左间距
代码模拟:
.crossline3{margin-left:30px;.step{position:relative;height:50px;.tail{position: absolute;left: 4px;height: 100%;border-left: 2px solid #e4e7ed;}.dot{position: absolute;background-color: #e4e7ed;border-radius: 50%;display: flex;justify-content: center;align-items: center;left: -1px;width: 12px;height: 12px;}.wrapper{position: relative;padding-left: 28px;top: -3px;}}}
步骤条
由此,大家很容易联想到与时间轴类似的另一个前端样式,步骤条,步骤条在轴的样式上与时间轴相同,不同的只是其不关注内容的部分,只关注自己的样式实现。那么我们不妨也看下element-ui是如何实现这部分的样式的,应用了哪些技巧?
组件地址:https://element.eleme.cn/#/zh-CN/component/steps
效果图:


实现思路:
1.顶部与下面为同宽的div,处于同一个父容器中,所以保持同一个宽度,形成左面对其非常容易
2.顶部的图标覆盖效果:首先定位划线灰色,然后用一个带图标的标签覆盖,背景为白色即可
实现代码:
因为实现的代码比较简单,这里就略过,有兴趣的可以去看下element-ui的源码。
备注:那么它最后一条是如何实现没有划线的呢?技巧也很简单,用同类型的选择器,拿到同同类型的最后一个,划线不显示即可。
.el-step:last-of-type .el-step__line{display:none}
小结
通过本文,希望你能了解到如何实现一些类似时间轴、步骤条,以及目前大部分组件如何处理的思路,本文最开始提供的思路是个人思考所得,更为简单,但可能存在样式不够丰富的问题,毕竟伪元素和元素还是有区别的。
其中特别希望大家注意到的一点是,如果你的内容是变化的,而相关的轴是变化的,那么首先这个轴一定是在所有节点的大容器外层绝对定位实现的,或者像element-ui一样,拿到每个元素的绝对宽高去划线然后拼接的,目前针对这点,还没有更优化的思路。
