HTML的<track>标签kind="chapters"必须使用严格格式的WebVTT文件:首行WEBVTT、每段以CHAPTER开头、时间戳为HH:MM:SS.mmm --> HH:MM:SS.mmm、纯文本章节名、UTF-8无BOM编码;仅Safari原生支持UI渲染,Chrome/Edge部分支持但需服务端支持byte-range请求,移动端基本不可用。

chapters kind 的 track 必须用 WebVTT 格式,且只支持章节元数据
HTML <track> 的 kind="chapters" 不是随便写个字幕文件就能用的——它只接受 WebVTT 格式中带 CHAPTER 类型的文件,且内容必须是章节标题 + 时间戳,不能含普通字幕文本。浏览器靠这个生成视频底部的章节导航条(如 Chrome、Edge 的进度条上方小标签),但不渲染任何文字到画面上。
常见错误:把普通 .vtt 字幕文件直接设为 kind="chapters",结果章节导航不出现,控制台也没报错,只是静默失效。
-
kind="chapters"的<track>必须指向一个合法 WebVTT 文件,开头必须是WEBVTT,且每段 cue 前需加CHAPTER标识(不是STYLE或空行) - cue 时间格式必须是
HH:MM:SS.mmm,起止时间都要写,例如00:00:00.000 --> 00:01:23.456 - cue 内容只能是纯文本章节名,不能有 HTML、换行或空格开头/结尾(否则解析失败,章节消失)
WebVTT 章节文件怎么写才被识别
下面是一个能被正确解析并显示章节导航的最小可用示例:
WEBVTT CHAPTER 00:00:00.000 --> 00:02:15.000 简介 CHAPTER 00:02:15.000 --> 00:05:30.000 安装依赖 CHAPTER 00:05:30.000 --> 00:08:45.000 配置环境变量
注意三点:第一行必须是 WEBVTT(单独一行,后面空行);每段 cue 前必须写 CHAPTER;章节名不能带冒号、括号等特殊符号(部分浏览器会截断或忽略)。
使用 Puppeteer + Chrome 将 HTML 渲染为中文 PDF,自动处理图表等待、Tab 展开、动画、测高、白边消除、防分页,适用于看板、报表、网页和交互图表转 PDF。
立即学习“前端免费学习笔记(深入)”;
- 文件编码必须是 UTF-8 无 BOM,否则中文章节名显示为乱码或整个 track 失效
- 时间区间不能重叠,也不能倒序,否则后续章节可能被跳过
- 如果视频时长 10 分钟,最后一段结束时间建议写成
00:10:00.000而不是00:10:00.000 --> 00:10:00.000(后者会被视为零时长,不显示)
video 元素里怎么挂载 chapters track
直接在 <video> 内部添加 <track> 标签即可,不需要 JS 操作,但必须满足加载顺序和属性要求:
<video controls> <source src="demo.mp4" type="video/mp4"> <track kind="chapters" src="chapters.vtt" srclang="zh" label="章节"> </video>
-
srclang属性必须设置(哪怕只是占位),否则某些浏览器(如 Safari)不触发章节解析 -
label是用户在右键「字幕」菜单里看到的名称,建议用中文但避免空格或符号 -
src路径必须可跨域访问(若视频和 vtt 在不同域名,需服务端配Access-Control-Allow-Origin) - 不要加
default属性——kind="chapters"不支持默认启用,它始终自动激活
为什么 Chrome 显示了章节但点击没反应
章节导航条显示出来,但点击某章不跳转,大概率是视频未启用 seeking 支持或时间戳精度不足。
- 确保视频已完整加载或至少完成 metadata 加载(
loadedmetadata事件触发后才可靠) - 检查视频服务器是否支持 byte-range 请求(否则拖动/跳转失败,章节点击也无效)
- WebVTT 中的时间戳必须精确到毫秒,且与视频实际关键帧对齐——如果章节时间落在 I 帧之间,有些浏览器会卡住或跳到最近 I 帧(导致偏移)
- 移动端 Safari 对
chapters支持极弱,基本不显示导航条,别指望 iOS 用户看到它
真正麻烦的是时间戳校准:用 FFmpeg 查关键帧位置比肉眼估更靠谱,不然用户点“第三章”跳到第二章末尾,就不是前端能解决的问题了。


















