必须用,因其语义明确表达有序事件流,确保读屏器按序导航、SEO正确抓取顺序、打印保留编号;表示无序,完全丢失结构,均不可替代。

必须用 <ol></ol>,不是 <ul></ul> 也不是一堆 <div> 堆出来的“伪时间轴”——否则读屏器乱读、SEO 抓不到顺序、打印出来只剩文字堆叠。
<h3>为什么只能用 <code><ol></ol> 而不能用 <ul></ul> 或 <div>
<p>时间轴本质是「有明确先后顺序的事件流」,<code><ol></ol> 的语义就是 ordered list,浏览器、屏幕阅读器、搜索引擎都按这个逻辑处理:自动编号、键盘 tab 按序跳转、纯文本环境仍保留 1. 2. 3. 的可读性。<ul></ul> 表示无序,一旦后端数据错位或 JS 渲染失败,用户根本意识不到时间线已经崩了;<div> 则完全丢失结构,连“这是个列表”都表达不出来。
<ul>
<li>
<code><ol reversed></ol> 可直接倒序展示“最近 5 条”,不用 JS 排序或后端改 SQL
<li> 内必须用 <time datetime="2024-03-15"></time>,不能只写 <time>2024年3月</time> —— 后者机器无法解析,日历插件、SEO、甚至部分浏览器的“添加到日历”功能都会失效<ol class="timeline"><li>
<time></time><h3></h3>
<p></p>
</li></ol>,别在 <li> 里再套三四层 <div>
<h3>
<code><time></time> 的 datetime 属性怎么填才不翻车
填错 datetime 是最隐蔽也最致命的坑:页面看着正常,但所有依赖时间语义的功能全失效。必须严格遵循 ISO 8601 标准,不能靠肉眼判断“差不多”。
立即学习“前端免费学习笔记(深入)”;
- 年-月-日:必须是
datetime="2024-03-15","2024/03/15"或"2024年3月"是无效值 - 年-月:允许
datetime="2024-03",但"2024-3"(缺零)不行 - 带时分秒:必须补零且含
T,如datetime="2024-03-15T14:30:00";"14:30"或"2:30 PM"不被识别 - 时区要显式声明:
datetime="2024-03-15T14:30:00+08:00","GMT+8"不是标准写法,部分解析器直接忽略 - 后端返回
"2024/03/15"?前端得先转:new Date("2024/03/15").toISOString().split('T')[0]再塞进datetime
CSS 画竖线和圆点,为什么不能用 border-left
给 <ol></ol> 加 border-left: 2px solid #ccc 看似省事,实际会引发三类问题:缩放时竖线偏移、节点悬停左右抖动、打印时整条线错位。因为 border 是盒模型的一部分,会影响所有子元素的布局计算。
- 竖线必须用
<ol>::before</ol>伪元素:设position: absolute; top: 0; left: 50%; transform: translateX(-50%); height: 100%; width: 2px; - 节点圆点用
<li>::after</li>:position: absolute; width: 12px; height: 12px; border-radius: 50%; background: #4a90e2;,定位锚定在中线上,不占空间也不扰流 - IE11 下必须加
zoom: 1触发 hasLayout,否则 zoom=125% 时伪元素可能消失 - 左右交替用
li:nth-child(odd)和li:nth-child(even)控制text-align和内边距,别用 JS 判断奇偶
长列表(100+ 条)时间轴怎么避免滚动卡顿
不是靠“懒加载”,而是控制 DOM 节点数。一次性渲染 100 个 <li> 会明显拖慢首屏,但又不能简单分页——用户需要滑动浏览连续时间流。
- 用原生
IntersectionObserver替代 scroll 监听,轻量且性能好 - 初始只渲染可视区域上下各 2–3 项,其余用
<li class="placeholder">占位 - 共享一个
IntersectionObserver实例,用observe()批量注册,别给每个<li>单独绑实例 - 监听进入视口时,用
fetch()按需加载对应数据并替换占位符,避免预加载全部内容
真正难的不是画出那条线,而是让每个 <li> 在缩放、打印、读屏、IE11、移动端、长列表各种场景下,依然保持位置精准、语义清晰、DOM 干净——这些细节没压住,时间轴就只是个好看但不可靠的装饰品。



















