应使用ol+li构建语义化时间轴,每个li含、和可选,配合css伪元素绘制竖线与圆点,通过data-status控制状态色,用intl.datetimeformat本地化时间显示,并动态更新节点以保障无障碍支持。

用 ol + li 构建语义化时间轴结构
物流时间轴本质是按时间顺序排列的事件列表,ol(有序列表)天然符合这一语义,比用 div 堆砌更利于屏幕阅读器识别和 SEO。每个节点用 li 包裹,避免嵌套过深——层级一深,CSS 定位和 JS 交互就容易错位。
- 每个
li内部结构保持一致:时间戳<time></time>+ 状态描述<p></p>+ 可选备注<small></small> -
<time datetime="2024-05-20T14:30">2024-05-20 14:30</time>必须带 ISO 格式datetime属性,否则无法被解析为机器可读时间 - 避免在
li里塞div当“容器”——它没语义,还可能干扰ol的计数逻辑
CSS 实现左侧时间线与圆点标记
纯 CSS 绘制时间线最轻量,不依赖 JS 或额外图标字体。关键在利用 ol 的伪元素 ::before 画竖线,li::before 画圆点,再用 position: relative 控制文字对齐。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
-
ol设position: relative,然后ol::before画一条从顶到底的细竖线(border-left或linear-gradient) - 每个
li设padding-left: 3rem留出空间,li::before用content: ""+position: absolute在左侧生成圆点 - 圆点颜色建议用状态色:
dispatched用蓝,in_transit用橙,delivered用绿——但别写死,最好通过data-status属性动态控制 - 移动端记得把时间线转成横向或折叠,
@media (max-width: 768px)下改用flex-column并隐藏部分细节
处理时间格式与本地化显示
后端返回的时间通常是 ISO 字符串(如 "2024-05-20T08:22:15Z"),直接插进页面会显得生硬。前端需转换,但别用 toLocaleString() 简单粗暴——它受用户系统语言影响,中文用户看到英文月份就懵了。
- 推荐用
Intl.DateTimeFormat显式指定 locale 和 options:new Intl.DateTimeFormat('zh-CN', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }) - 如果后端已返回格式化好的中文字符串(如
"2024年05月20日 08:22"),就别再 parse 再 format——多一次转换就多一个时区坑 - 注意 UTC 时间 vs 本地时间:物流系统通常存 UTC,展示时应转成本地时间,但得明确告诉用户时区(比如加
<small>(UTC+8)</small>)
动态更新与无障碍支持要点
物流状态会变,页面不能只渲染一次。但每次全量重绘 ol 容易闪屏或焦点丢失,尤其对使用读屏软件的用户。
- 只更新变化的
li节点:用data-id或data-timestamp标识每个事件,JS 找到对应节点后仅替换内容,不 replace 整个li - 新增节点时,用
insertBefore插入到正确位置(不是 push 到末尾),并触发aria-live="polite"区域播报新状态 - 每个
li加role="region"和aria-labelledby指向其时间戳,让读屏器能准确读出“2024年5月20日 14:30:包裹已签收” - 别忽略键盘导航:确保所有节点可
tab进入,Enter可展开详情(如有)
时间轴看着简单,但时间格式、语义标签、动态更新、无障碍这四块任意一块没对齐,用户就会卡在某个环节——尤其是老人或视障用户,他们不会告诉你哪里不对,只会直接退出页面。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










