前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >纯CSS时间轴列表

纯CSS时间轴列表

作者头像
ayqy贾杰
发布2023-03-15 18:50:43
2.8K0
发布2023-03-15 18:50:43
举报
文章被收录于专栏:黯羽轻扬

一.场景

需要实现时间轴列表,左边一串小圆点,右边是列表内容,需要小圆点位置与列表项对应,最终效果如下:

timeline

二.实现方案

有几个细节:

  • 小圆点要与列表项对齐
  • 首项、末项的时间线不能超出小圆点
  • 列表项之间要有间隔

前两条是对自适应的要求,最后一条是对布局的限制

传统方案是通过列表容器生成一条足够长的竖线,然后列表项自带小圆点,再把小圆点对齐到竖线上。竖线的长度没有办法精确控制(不通过js计算的话),无法满足第二条,那么可以换个方式,让列表项自带同高度的竖线,拼接成完整的时间线

P.S.不用担心拼接出来的竖线会被看出来,一定是完美无缝的,否则浏览器不科学(两个相邻的块级元素之间不能有无法解释的缝隙吧,那么它们的border-left一定能够完美连接起来)

三.具体实现

首先确定结构,因为列表项间隔的限制,列表项需要多套一层

代码语言:javascript
复制
.listItem>.listItemContent>.listItemContent-date+.listItemContent-content

因为用margin实现间隔的话竖线长度不对,接不起来,所以多套一层listItem,把margin换成padding。由listItem携带竖线和小圆点:

代码语言:javascript
复制
/* 列表项间隔padding-top */
.listItem {
   position: relative;
   padding-left: 40px;
   padding-top: 4px;
}
/* 列表项自带竖线 */
.listItem:before {
   content: "";
   display: inline-block;
   position: absolute;
   top: 0;
   left: 0;
   width: 1px;
   height: 100%;
   border-right: 1px solid #f3f3f3;
   left: 19px;
   z-index: 1;
}
/* 列表项自带小圆点 */
.listItem:after {
   content: "";
   display: inline-block;
   position: absolute;
   width: 8px;
   height: 8px;
   background-color: #e0e0e0;
   border-radius: 4px;
   left: 16px;
   top: 50%;
   margin-top: -2px;
   z-index: 1;
}

注意小圆点的margin-top,这个-2px不是目测的,与列表项间隔和小圆点高度有关:

代码语言:javascript
复制
// top 50%, marginTop -50%是小圆点相对于listItem竖直居中
h = listItemContent.height
pt = listItem.paddingTop
ch = 小圆点.height
y = (h + pt)/2 - ch/2
// 我们想要小圆点相对于listItemContent竖直居中
// 要去掉pt带来的向下偏移offsetY = pt/2 所以
top 50%, marginTop -ch/2 + offsetY
top 50%, marginTop -4 + 2
top 50%, marginTop -2

这是marginpadding套一层带来的麻烦

然后加上首项、末项的时间线不能超出小圆点的限制:

代码语言:javascript
复制
.listItem-first:before {
   height: 50%;
   top: 50%;
}
.listItem-last:before {
   height: 50%;
}

最后添上高亮的效果:

代码语言:javascript
复制
/* 高亮小圆点 */
.listItem.highlight:after {
   -webkit-box-sizing: border-box;
   -moz-box-sizing: border-box;
   box-sizing: border-box;
   width: 16px;
   height: 16px;
   background-color: #3d93fd;
   border: 4px solid #88bdfe;
   border-radius: 8px;
   left: 12px;
   -webkit-box-shadow: 0 0 0 3px #d8e9ff;
   box-shadow: 0 0 0 3px #d8e9ff;
   z-index: 2;
}
/* 高亮列表项 */
.listItem.highlight > .listItemContent {
   background-color: #3d93fd;
   color: #fff;
}
/* 高亮列表项内容 */
.listItem.highlight .listItemContent-date{
   color: #fff;
}

四.Demo

在线Demo:http://www.ayqy.net/temp/timeline/index.html

点击列表项高亮,列表项内容支持HTML和图片自适应

写在最后

最近在啃JS动画原理,感谢月影前辈的分享,功力深厚

之前看过几遍了,一直没有理解透彻,直到自己实现才发现数学公式与easing算子的关系

强烈推荐:关于动画,你需要知道的

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端问问 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二.实现方案
  • 三.具体实现
  • 四.Demo
    • 写在最后
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档