怎么用css画timeline

html-css09

怎么用css画timeline,第1张

实现思路

在实现上,完全通过 HTML 和 CSS 来实现,没有使用一行的 JS 逻辑代码。主要是用了一些伪类和 CSS 属性来实现。

HTML 部分

<ul class='time-line'>

<li class='timeline-stone is-completed'>

<div class='list-content'>

<div class='title'>HeloWorld</div>

<span class='time'>1993.08.03</span>

</div>

</li>

<li class='timeline-stone is-completed'>

<div class='list-content'>

<div class='title'>HeloWorld</div>

</div>

</li>

<li class='timeline-stone'>

<div class='list-content'>

<div class='title'>HeloWorld</div>

</div>

</li>

</ul>

这部分没什么讲的,主要是一些 <ul>无序列表和子项 <li>以及各自的 css 样式组成的基本结构。这里只是使用 <div>作为条目内容做结构,内部使用了 flex-box 盒子模型来做了 title 和 time 的左右布局。

CSS 部分(核心)

为了方便起见,直接将重用多次的几个值作为变量放到头部。

$purpleBText: #7d5ae7

$darkText: #666666

$lightText: #999999

$darkLine: #eaeaea.time-line {  list-style: none// 不显示列表默认样式(即就是左侧的小黑点或数字)  margin: 0 position: relative top: -18px

// 列表项内容

.list-content {    display: flex   font-size: 12px   padding: 12px 10px 12px 0   margin-left: 10px   position: relative   bottom: -18px

.title {      flex-grow: 1

}    .time {      font-weight: 200     font-size: 12px     color: $lightText

}

}  .timeline-stone {    border-left: $darkLine 1px solid   position: relative   margin-left: -23px   font-weight: 200   color: $darkText

&::before {      content: ''     width: 5px     height: 5px     background-color: $darkLine     border-radius: 50%     position: absolute     bottom: 0     left: -3px

}

&.is-completed {      border-left-color: $purpleBText     z-index: 1     color: $purpleBText     font-weight: 600

&:first-child {        border-left: transparent 1px solid

}

&::before {        width: 11px       height: 11px       background-color: $purpleBText       opacity: 0.4       left: -6px       bottom: -5px

}

&::after {        content: ''       width: 7px       height: 7px       border-radius: 50%       position: absolute       background-color: $purpleBText       left: -4px       bottom: -3px

}

}

}

}

圆点居中

图中绿色的表示<li>每一个子项,而红色则表示条目内容区。可以看到,这里的实现方式是在 list-content内容区采用相对布局将自身向下移动一半列表项高度,将圆点以绝对布局的方式定位到 <li>的底部。

圆点的绘制

这里的圆点均采用 pseudo-class 伪类的方式来添加元素,只需要将 content 设置为空串即可代替常规的 HTML 结点。

共有如下两种状态:

unfinished:  就是一个小灰点,只需要在 timeline-stone 样式上给<li>加 before 伪类即可。

finished:在 is-completed 样式中,使用 before 和 after 搭配绝对布局的方式来绘制已激活状态的小圆点。

小竖线

小竖线同样和小圆点一样都具有两种状态,而它的渲染我们采取了使用小圆点所在的<li>元素的左边框作为时间线,并且通过 first-child 或者 last-child 这两个伪类来实现对第一个或者最后一个边框样式的控制。

实现效果:

在dialog弹出框中实现竖形时间轴,如上图,难点在于左侧的时间和圆点要根据右侧的内容的长度来定位,可根据固定宽度,根据长度/宽度来计算几行,来确定具体的位置。

下面的实现不是上述原理,是规定数据格式,用css样式实现的

数据格式:

detailContent: [

{ code: '已审核待审批 ', des: ' 2019-11-18 09:44', name: 'zhangsan-张三',

detailContents: [

{ code: '审核结论:', des: '0-给付或部分给付' },

{ code: '给付类型:', des: '01-协议给付;' },

{ code: '原因明细:', des: '与出险人协商结果;' },

{ code: '特殊备注:', des: '无;' },

{ code: '案件标识:', des: '11-普通案件;' },

{ code: '审核意见:', des: '根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据' }

] },

{ code: '已立案待审核 ', des: ' 2019-11-18 09:44', name: 'wangwu-王五',

detailContents: [

{ code: '立案结论:', des: '01-立案通过' }

] },

{ code: '审核回退立案 ', des: '2019-11-18 09:44', name: 'zhangsan-张三',

detailContents: [

{ code: '审核结论:', des: 'a-案件回退' },

{ code: '回退原因:', des: '03-受益人身份确认有误或待完善' },

{ code: '特殊备注:', des: '此为重大问题;' },

{ code: '案件标识:', des: '11-普通案件;' },

{ code: '审核意见:', des: '根据根原因根据XXX' }

] },

{ code: '审批回退审核 ', des: '2019-11-18 09:44', name: 'wangwu-王五',

detailContents: [

{ code: '审批结论:', des: '1-不同意' },

{ code: '不同意原因:', des: '05-索赔文件所示事故非有效期限范围;' },

{ code: '不同意依据:', des: '金额理算不正确,烦请确认;' },

{ code: '审批意见:', des: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' }

] },

{ code: '已审核待审批 ', des: '2019-11-18 09:44', name: 'zhangsan-张三',

detailContents: [

{ code: '审核结论:', des: '1-全部拒付' },

{ code: '拒付原因:', des: '03-不如实告知;' },

{ code: '拒付依据:', des: '身份信息虚报;' },

{ code: '特殊备注:', des: '此为重大问题;' },

{ code: '案件标识:', des: '11-普通案件;' },

{ code: '审批意见:', des: '根据根原因根据XXX' }

] },

{ code: '审批回退审核 ', des: '2019-11-18 09:44', name: 'wangwu-王五',

detailContents: [

{ code: '审批结论:', des: '1-不同意' },

{ code: '不同意原因:', des: '05-索赔文件所示事故非有效期限范围;' },

{ code: '不同意依据:', des: '金额理算不正确,烦请确认;' },

{ code: '审批意见:', des: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' }

] },

{ code: '已审核待审批 ', des: '2019-11-18 09:44', name: 'zhangsan-张三',

detailContents: [

{ code: '审核结论:', des: '0-给付或部分给付' },

{ code: '给付类型:', des: '01-协议给付;' },

{ code: '原因明细:', des: '与出险人协商结果;' },

{ code: '特殊备注:', des: '无;' },

{ code: '案件标识:', des: '11-普通案件;' },

{ code: '审核意见:', des: '根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据根原因根据' }

] },

{ code: '已立案待审核 ', des: '2019-11-18 09:44', name: 'zhangsan-张三',

detailContents: [

{ code: '立案结论:', des: '01-立案通过' }

] },

{ code: '已报案待立案 ', des: '2019-11-18 09:44', name: 'zhangsan-张三' }

]

HTML:

<div class="main">

<ul class="cbp_tmtimeline">

<li>

  <div v-for="(item, index) in detailContent" :key="index" :class="{'cbp_div': index === (detailContent.length - 1)}">

<div class="cbp_left">

<span>{{item.code}}</span>

<span>{{item.des}}</span>

</div>

<div class="cbp_tmlabel">

<h3>zhangsan-张三</h3>

<div class="cbp_tmicon"></div>

<div v-for="(item, index) in item.detailContents" :key="index" >

<span>{{item.code}}</span>

<span>{{item.des}}</span>

</div>

</div>

</div>

</li>

</ul>

</div>

style样式:

<style>

.cbp_div {

height: 20px

width:570px

}

.cbp_left {

width: 120px

color: black

font-size: 1.2em

font-weight: 300

line-height: 1.4

margin-bottom: -60px

}

.main

{

width: 90%

max-width: 69em

margin: 0 auto

padding: 0 1.875em 3.125em 1.875em

}

.cbp_tmtimeline

{

width: 570px

margin: 40px 0 0 0

padding: 0

list-style: none

position: relative

}

/* The line */

.cbp_tmtimeline:before

{

content: ''

position: absolute

top: 0

bottom: 0

width: 3px

background: #b8cad6

left: 25%

margin-left: -11px

}

.cbp_tmtimeline >li

{

position: relative

}

.cbp_tmtimeline >li .cbp_tmlabel

{

margin: -65px 0 15px 25%

color: black

padding: 0 1em

font-size: 1.2em

position: relative

border-radius: 5px

}

.cbp_tmtimeline >li .cbp_tmicon

{

width: 18px

height: 18px

font-family: 'ecoico'

font-style: normal

font-weight: normal

font-variant: normal

position: absolute

color: #fff

background: #46a4da

border-radius: 50%

box-shadow: 0 0 0 3px #afdcf8

left: 26%

top: 0

margin: 0 0 0 -130px

}

</style>

第1步:制作菜单外貌

在Dreamweaer 中新建一个文件,绘制一个层,在该层中插入一个表格(如图1),对该表格进行修饰,然后加入菜单项并建立各项的超链接,为了去掉超链接的下划线,可以编辑超链接的CSS样式,在CSS样式面板中通过CSS选择器将“Link”和“Hover”的“Decoration(装饰)”均设置为 “None(无)”,将“Hover”的“Color(颜色)”设置为红色,最后将设置好的样式应用到各个菜单条中(可按“F12”键预览效果)。

第2步:设计菜单的动态效果

1、选定层面,当鼠标变成“十”字形时按住左键将层面拖动到页面右上角(使整个菜单条完全露出但上边缘正好靠拢页面上边界),在窗口菜单中打开时间线面板,选定层面将其拖动到时间线上,Dreamweaer会自动产生一个长度为15帧的动画对象,拖动该动画对象的最后一个关键帧到第30帧,将其长度设置为30帧。然后在第15帧处单击右键,在弹出的快捷菜单中选择“添加关键帧”选项插入一个关键帧,并将层面拖动到适当位置(如图2)。

在时间线窗口中的第15帧处再次单击右键,在弹出的快捷菜单中选择“添加动作”,为该帧添加一个交互行为,Dreamweaer将自动打开行为面板。单击行为面板中的“+”按钮,从弹出的菜单中选择“Timeline/Stop Timeline”,打开“Stop Timeline”对话框,选择“Timeline1”后单击“确定”按钮关闭该对话框。交互行为的事件为“onFrame15”,动作为“Stop Timeline”,这样当时间线运行到第15帧时,动画将停止播放,这样就实现了菜单条弹回的功能。

2、用同样的方法在时间线的第30帧处也添加一个“Stop Timeline”的交互行为,这样就实现了菜单弹出的功能。添加了这两个交互行为后,在时间线窗口的相应帧上面都出现了一个蓝色方块,它代表一个交互行为。选择“自动播放和循环”复选框,使动画能够自动循环播放(如图3)。

3、现在还要设置一个行为让时间线停止后能继续播放。我的设想是这样的:在一般状态下菜单条弹回但仅保留下方的“校园大观”字样,而菜单条再次弹出和弹回则由鼠标是否经过了菜单条上的“校园大观”来控制。如此可以这样继续进行:选定菜单条中的“校园大观”(要确保该字样的超链接地址为“#”,即空链接)字样,单击行为面板中的“+”按钮,在弹出的菜单中选择“Timeline/Play Timeline”,在接着弹出的对话框中选择“Timeline1”后单击确定按钮,这时行为面板中将增加一个行为,在其“Events”下拉列表中选择“onMouseOver”事件,表示当鼠标处于该字样上方时播放动画(如图4)。