应使用语义化 html 标签构建版本日志:每个版本用带 id 的 包裹,内含 vx.y.z 中文日期 和 列出变更项 。

用 <section></section> 包裹每个版本,别用 <div>
<p>每个版本条目必须是独立、可分发的内容单元,<code><section></section> 正好匹配这个语义。它比 <div> 明确表达了“这是一个有主题的区块”,搜索引擎和屏幕阅读器都能识别。错误做法是写 <code><div class="version"> —— 这等于告诉机器“这里有个盒子”,但没说盒子里是什么。
<p>关键细节:</p>
<ul>
<li>
<code><section></section> 应该带 id,比如 id="v2-1-0",方便锚点跳转和自动化脚本定位
<section></section> 而不加标题——<section></section> 要求有明确主题,通常以 <h2></h2> 或 <h3></h3> 开头<section></section>,而不是降级为 <p></p> —— 它仍是版本维度上的一个独立条目用 <details></details> + <summary></summary> 控制展开状态
用户不需要一打开页面就看到全部变更细节。<details></details> 是原生支持折叠/展开的语义化标签,自带状态记忆(刷新后保持展开),且无需 JS 就能工作。写法就是:
<details><summary>v2.1.0 (2024-05-20)</summary>...变更列表...</details><p>常见误区:</p>
- 给
<summary> 加 <code>transition动画:Safari 旧版渲染卡顿,直接去掉更稳 - 在
<details></details>外再套一层<div>:破坏语义层级,也影响 CSS 选择器精度 <li>忽略 <code>datetime属性:日期要用<time datetime="2024-05-20">2024年5月20日</time>,不能只写纯文本 -
datetime属性必须是 ISO 8601 格式(YYYY-MM-DD或YYYY-MM-DDTHH:MM),不可省略年份或用中文格式 - 显示文本可以本地化(如“2024年5月20日”),但
datetime始终保持标准格式 - 别用
<meta>模拟时间信息——它不在 DOM 主流内容流里,辅助技术可能跳过 - 避免
<p><strong>新增</strong> 用户导出功能</p>这种写法——它把结构(列表)和样式(加粗)混在一起,语义断裂 - 如果某条变更含多句说明,可在
<li>内部用<p></p>,但外层必须是<ul></ul>或<ol></ol> - 别给
<ul></ul>加class="changelog-items"就以为解决了问题——类名不提供语义,只是辅助定位
日期必须用 <time></time> 标签,别塞进 <span></span>
<time></time> 不是装饰性标签,它把“2024-05-20”这种字符串转换成机器可读的时间值。这对自动化提取(比如 CI/CD 流水线生成日志页)、SEO 和无障碍访问都关键。写成 <span>2024-05-20</span> 等于丢掉时间语义。
注意点:
变更项列表用 <ul></ul>,别用 <div> 堆 <code><p></p>
每次更新的改动点本质是无序集合:“修复 A”“新增 B”“调整 C”,不是段落叙事。用 <ul></ul> 表达这种并列关系最准确。每个条目用 <li>,语义清晰,CSS 也能自然继承列表样式(比如项目符号、缩进)。
容易被忽略的细节:
真正难的不是写出第一个版本块,而是让第 50 个版本加进来时,不用改结构、不动样式、不碰 JS。语义化标签的价值,就体现在这种“追加即生效”的维护成本上。一旦用了 <section></section>、<time></time>、<details></details> 这套组合,后续每次发版,你只需要复制粘贴一个块,改 id 和日期,填几行 <li> —— 其他所有逻辑都由浏览器原生接管。











