简介:35种款式的HTML5时间轴源码面向Web前端开发者,集中提供横向与纵向两类布局,可快速搭建新闻时间线、项目里程碑、历史事件展示等页面。资源共97个文件,包含37个html演示页、20个css样式表、11个js脚本、15个md说明文档,以及woff、png、svg等字体图标与图片素材,压缩包仅637KB,目录结构清晰便于按需取用。目前已有537人学习下载。时间轴节点、线条、卡片等样式拆分细致,覆盖旋转、缩放、滑出、淡入等动态效果,通过伪元素绘制轴线并使用data-*属性与
这篇文章就结合我实际筛选、改码、踩坑的过程,聊聊HTML5时间轴源码的分类思路、背后那点核心原理,以及几类高复用模板的完整写法。最后再补一批我自己遇到的高频问题,尽量让你拿到源码后能快速改出能用的东西,而不是在调试里耗掉一晚上。
1. 拿到35种源码,先别急着用——分类与选型思路
1.1 按实现方式分:纯CSS、jQuery、原生JS三类
我把35个demo过完第一遍,先按技术栈分了三大类。
第一类是纯CSS实现。这类demo通常只有一个HTML文件加一段style,中线、圆点、卡片全部依赖伪元素和定位完成。优点是结构轻、加载快、改样式非常直观,适合页面结构简单、不需要交互的场景,比如公司的里程碑介绍、个人简历的教育经历。缺点是内容多的时候维护起来费劲,而且所有节点一次性渲染出来,少了一点“随时间推进”的叙事感。
第二类是jQuery插件。老牌时间轴插件里jQuery占比很高,很多demo引了jQuery库再调插件。这类源码的优点是功能完整——折叠展开、滚动加载、左右箭头切换都有现成API,懒人可以直接套。但如果你现在的项目是React或者Vue,塞一个jQuery插件进去会非常别扭,DOM操作和框架的虚拟DOM容易打架,我一般不建议新项目再用。
第三类是原生JavaScript。这类demo用IntersectionObserver、scroll事件或者requestAnimationFrame控制动画,没有外部依赖。35个里真正精致的交互效果,比如节点依次淡入、卡片左右滑入、横向滚动吸附,基本都集中在原生JS这一类。我后面在项目里复用最多的也是这批,因为它们改起来心智负担小,出问题了也方便定位。
1.2 按展示形态分:垂直、水平、折叠、卡片
看完实现方式,再看展示形态。垂直时间轴是最普遍的,一条轴线从上到下贯穿,内容分布在左右两侧;水平时间轴则适合宽屏站点,像一条道路从左向右延展,常常配左右箭头或滚轮滑动;折叠手风琴式是垂直轴线的变体,默认只显示标题,点击后再展开细节,适合放长文案;卡片式则是把时间事件做成一张张卡片,按时间顺序排列,自由度最高,但“轴”的存在感被削弱了。
选型的时候,先问自己一个问题:页面的核心信息密度有多高?如果只是三五个关键时间点,垂直居中时间轴就够了,别整那些花活;如果事件多、文字长,折叠式明显更友好;如果是产品迭代路线图,需要观众一眼看到从旧到新的趋势,横向时间轴更有视觉冲击力。这35个demo正好覆盖了以上所有形态,所以先分类、后选型,比一个一个点开看效率高得多。
2. 时间轴源码背后那点核心原理
2.1 中轴线和节点是怎么画出来的
很多人第一次看时间轴源码,会盯着那一堆 position、::before、::after 发懵。其实原理非常简单:容器设position: relative,中轴线用容器的::before画一条绝对定位的竖线,节点圆点再用每个条目自己的伪元素或者子元素定位到线上。
竖线的经典写法是这样的:
.timeline { position: relative; padding: 40px 0; } .timeline::before { content: ""; position: absolute; left: 50%; top: 0; bottom: 0; width: 2px; background: #e5e7eb; transform: translateX(-50%); }关键点有两个:left: 50%让线居中,transform: translateX(-50%)把线的中心对准容器中点,否则2px的线会被挤到偏右1px,看起来总是不太对。节点圆点同理,也是绝对定位到left: 50%,再translate回来。中线颜色别用死黑,浅灰或渐变效果会和页面融合得更好。
2.2 卡片左右交错布局的关键
垂直时间轴最出效果的是左右交错布局——奇数条内容在左,偶数条在右。很多人以为这很复杂,其实核心就是nth-child配合width: 50%。
.timeline-item { position: relative; width: 50%; padding: 0 40px 48px 0; } .timeline-item:nth-child(odd) { left: 0; text-align: right; } .timeline-item:nth-child(even) { left: 50%; padding: 0 0 48px 40px; }奇数项从左边开始,文字右对齐;偶数项从中间开始,文字左对齐。中间留出40px的padding,就是卡片和中轴线之间的呼吸空间。节点圆点放在每个条目的右边缘(奇数项)或左边缘(偶数项),再各自绝对定位到中轴线上。
这里有个容易被忽略的细节:当某一侧卡片内容特别高,另一侧特别矮时,整条轴线还是连贯的,因为每个条目都是独立的块级元素,高度互不影响,天然就是交错的节奏。这也是为什么时间轴特别适合“事件长短不一”的场景。
2.3 滚动动画到底是怎么触发的
35个demo里,带“滚动到可视区才浮现”效果的源码最受欢迎。很多人以为要监听scroll,然后写一堆getBoundingClientRect判断,其实现在有更干净的方案——IntersectionObserver。
const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('in'); observer.unobserve(entry.target); } }); }, { threshold: 0.15 }); document.querySelectorAll('.timeline-item').forEach(el => observer.observe(el));配合CSS过渡:
.timeline-item { opacity: 0; transform: translateY(30px); transition: opacity .6s ease, transform .6s ease; } .timeline-item.in { opacity: 1; transform: translateY(0); }用IntersectionObserver的好处是性能比scroll监听好得多,浏览器会在元素进入视口时自动回调,而且unobserve能保证动画只执行一次。我在整理这批源码时,发现老一点的项目用scroll + 节流实现的,逻辑繁琐,而且滚动太快时容易闪屏。新写的项目我都直接用上面这套,简单、稳定、省心。
3. 从35种里挑出4类模板,完整拆给你看
3.1 垂直居中时间轴:最常用的简历型写法
如果你只需要一个“不放错”的默认方案,我建议直接用垂直居中交错布局。结构如下:
<div class="timeline"> <article class="timeline-item"> <div class="tl-dot"></div> <div class="tl-card"> <time>2024-06</time> <h3>产品V2.0上线</h3> <p>重构了权限模块,新增数据看板,首月活跃提升40%。</p> </div> </article> <article class="timeline-item"> <div class="tl-dot"></div> <div class="tl-card"> <time>2024-03</time> <h3>用户体量破万</h3> <p>完成社区冷启动,核心用户群初步成型。</p> </div> </article> </div>卡片内部可以用浅底色、圆角、轻阴影做出层次,但别太浮夸。我在实际项目里,阴影一般控制在box-shadow: 0 1px 4px rgba(0,0,0,.06)这个量级,宁可清淡,不要满屏飘着浓重的投影。圆点可以做成空心带描边的样式,视觉上比纯色实心更有质感。这套结构最适合放简历、作品集、发展历程这几类内容,读者扫一眼就能抓住时间脉络。
3.2 加滚动渐入:基础版秒变高级感
基础版太“平”怎么办?给它加上一节里讲的滚动渐入就行。其实你不需要改任何HTML,只要在CSS里加初始隐藏状态和过渡,再用IntersectionObserver添加.in类。
实际的优化点是给每个条目加一点延时,让它们像多米诺骨牌一样依次浮现。可以利用CSS的transition-delay,也可以在JS里按索引设置:
document.querySelectorAll('.timeline-item').forEach((el, index) => { el.style.transitionDelay = `${index * 100}ms`; observer.observe(el); });这里注意一个陷阱:如果页面有十多个时间点,每个延迟100ms,最后一个要等一秒多才开始动画,用户早就滚过去了。我的经验是延迟最多给到前三四个,后面的统一只做淡入不做位移,或者干脆去掉延时。从第5个开始,用户已经进入“快速扫读”状态,动画太多反而耽误事。
3.3 折叠手风琴时间轴:适合放长文案
如果你的每个时间节点下面有三四段文字,或者还有配图,垂直时间轴会显得特别冗长。这时候折叠式是更优解。原生HTML的details和summary标签就能做出不错的效果,不用额外引JS:
<details class="tl-item"> <summary>2023年:产品从0到1</summary> <div class="tl-body"> <p>组建团队、完成市场调研、确定MVP方向,四个月后发布内测版。</p> <img src="roadmap.jpg" alt="产品路线图"> </div> </details>.tl-item { border-left: 2px solid #e5e7eb; padding: 8px 0 8px 24px; margin-bottom: 12px; } .tl-item[open] { border-left-color: #2d7ff9; } .tl-item summary { cursor: pointer; font-weight: 600; outline: none; } .tl-item[open] .tl-body { animation: fadeIn .3s ease; }details的好处是不需要自己管理展开状态,浏览器原生支持,移动端点击也没问题。唯一需要美化的是去掉默认的三角箭头,不同浏览器样式不同,建议统一用summary::-webkit-details-marker { display: none; }和list-style: none隐藏,然后自己加一个旋转的加减号图标。折叠式特别适合产品路线图、大事记、FAQ这类信息密度高的场景,默认所有条目收起,用户按兴趣点开,阅读负担小很多。
3.4 横向时间轴:大屏和移动端都能用
横向时间轴比垂直的难写,因为要处理横向滚动。我筛选下来最稳的方案是Flexbox加自动滚动容器:
.timeline-horizontal { display: flex; gap: 24px; overflow-x: auto; padding: 20px 0; scroll-snap-type: x mandatory; } .timeline-horizontal .tl-item { flex: 0 0 280px; scroll-snap-align: start; }scroll-snap-type让每次滑动都能停在卡片起始位置,体验接近原生App的滑动感。但这套方案有个明显的兼容性问题:老版本浏览器不支持scroll-snap,桌面端鼠标滚轮对横滑也不够顺手。所以我一般在横向时间轴里加一对左右箭头按钮,点击时控制容器平滑滚动:
document.querySelector('.tl-next').addEventListener('click', () => { document.querySelector('.timeline-horizontal').scrollBy({ left: 300, behavior: 'smooth' }); });横向时间轴适合时间跨度大、但每个节点内容不长的场景,比如公司年度大事件、产品版本演进。在移动端,固定280px卡片宽度能保证用户一屏看到一张卡的完整内容,不会出现文字截断的问题。
4. 实际使用中的高频问题与排查技巧
4.1 文字溢出和多行省略号
搜索热词里有个“时间轴省略符号”,确实是高频痛点。卡片宽度固定后,标题太长会撑破布局,正文太长又影响整体高度。单行省略是比较成熟的做法:
.tl-title { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }但单行省略对正文来说太粗暴了,我常用的是多行省略:
.tl-desc { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }-webkit-line-clamp配合-webkit-box可以实现最多显示3行、超出自动打省略号的效果。注意这两个属性是WebKit系的写法,虽然现代浏览器基本都支持,但如果要兼容特别老的浏览器,还是得用JS算高度或者老老实实截字符串。另外千万别忘了给容器设overflow: hidden,很多人写了两行属性就以为完了,结果省略号一直不出来。
4.2 中线断掉或圆点错位
我调试时最常遇到的问题是:单个条目高度不固定,中轴线明明写了top: 0; bottom: 0;,但只覆盖了容器的一部分。原因一般是父容器的高度塌陷,或者某个条目用了浮动没有清除。时间轴里最好不要用浮动布局,全部交给flex或相对定位解决。圆点错位则多半是left: 50%没有配合transform: translateX(-50%),或者父元素没有position: relative,圆点相对更外层定位了。
排查这类问题,我的习惯是先开DevTools把.timeline的伪元素高亮,确认中线实际渲染范围,再逐级检查父元素的position设置。CSS定位问题九成都是“谁是我的定位参照物”这个问题没搞对。
4.3 移动端线条偏移和动效失效
垂直时间轴放到手机上,左右交错布局几乎没法看,因为卡片宽度只有320px左右,再分左右就挤爆了。常规做法是在媒体查询里把布局改成单列:
@media (max-width: 768px) { .timeline::before { left: 12px; } .timeline-item, .timeline-item:nth-child(odd), .timeline-item:nth-child(even) { width: 100%; left: 0; padding: 0 0 32px 36px; text-align: left; } .timeline-item .tl-dot { left: 6px; right: auto; } }也就是把中轴线和圆点都挪到最左侧,所有内容变成左对齐的单一列表。动效失效的另一个常见原因是手机上浏览器默认开启了“减少动态效果”辅助功能,IntersectionObserver依然会触发,但CSS过渡被系统强制关闭了。这种情况不用强求,内容能正常显示就好,别为了动画去对抗用户系统的偏好设置。
4.4 拿到源码后,我自己做的四步整理
回到那35个源码文件。我最终能快速用起来,靠的不是每个都精读,而是先做了一遍粗筛和改造。
第一步,统一解压到一个目录,逐个打开demo文件,看它当前长什么样、有没有正常跑起来。第二步,检查依赖——引了jQuery还是别的库,CDN挂了没,如果有外部图片资源,立刻全部换成本地占位图,否则断网时整个demo等于废的。第三步,把每个源码里可以用变量控制的颜色、间距、字号统一提取出来,改成CSS变量,这样后续换主题就是改一行的事。第四步,删掉demo里无用的注释、广告位、多余样式,瘦身后再归档。做完这四步,35个demo被我压缩成约20个可复用的模板,再按“垂直/水平/折叠/卡片”四类建好索引,之后做项目找参考基本就是翻目录的事。
写在最后的实操心得
整理完这35种HTML5时间轴源码,我最大的收获其实不是代码本身,而是建立了一套挑选和改造的流程。时间轴组件说复杂也复杂,中轴线、节点、卡片、动画、响应式,一环扣一环;说简单也简单,核心思路就那几条——定位要准、宽度要算清楚、动画要克制。我个人在实际使用中,最常用的反而不是那些最花哨的效果,而是纯CSS垂直交错加一个淡入动画,这个组合适合的场景最广,改起来也最快。建议你把基础版的布局吃透,再去看那些带复杂交互的源码,会顺畅很多。如果手头正在做网页设计作业或者官网改版,希望这篇整理能帮你跳过前期筛选的弯路,把时间花在真正重要的内容打磨上。
本文还有配套的精品资源,点击获取