track元素必须严格符合位置、属性、格式要求才能生效:必须为video直接子元素且位于source之后,kind/srclang/label/src四属性缺一不可,VTT文件需UTF-8无BOM、首行为WEBVTT加空行、时间戳毫秒三位,动态切换需JS控制mode。

track 元素不是“加了就能出字幕”,它只要错一个位置、漏一个属性、文件格式差一位,浏览器就静默忽略——连控制台错误都不会报。
track 必须是 video 的直接子元素且位置严格固定
浏览器只在 开始标签之后、所有 闭合之后、 之前这个狭窄区间内解析 track。放错等于没写。
-
track写在前面 → 被忽略,video.textTracks.length为 0 -
track包在或里 → 不发起网络请求,Network 面板看不到 .vtt 加载- 用 JS 动态
appendChild插入到已渲染的video中 → 失效(DOM 已完成解析,不会再扫描新增track)- 多个
track之间插了 HTML 注释()或空行 → Safari 可能中断后续所有轨道解析四个属性缺一不可:
kind、srclang、label、src浏览器不做任何容错:漏任一,该轨道就不会出现在右键字幕菜单中,UI 上压根没有选项。
-
kind="subtitles":必须全小写、无空格、拼写完整;kind="caption"、kind="subtitles "(末尾空格)均无效 -
srclang:必须是合法 BCP 47 码,如"zh"、"zh-Hans"、"en-US";"chinese"、"zh_CN"、空值全部被忽略 -
label:用户实际看到的菜单名,建议含变体说明,如label="中文(简体)";为空时显示(no label),多语言场景下无法区分 -
src:必须是相对或绝对 URL,不支持 Blob URL(blob:http://...会被静默忽略);本地开发用file://协议时,多数浏览器因 CORS 拒绝加载,务必起本地服务(如python3 -m http.server)
VTT 文件格式容错率近乎为零
哪怕只错一个字符,Chrome/Firefox 就丢弃整条轨道。控制台不报错、Network 面板看不出失败、字幕菜单空白——你只能靠肉眼比对规范。
- 首行必须是
WEBVTT(全大写,无空格,无 BOM),后面必须紧跟一个空行 - 时间戳格式严格为
HH:MM:SS.mmm --> HH:MM:SS.mmm,毫秒必须三位,箭头前后各一个空格 - 错误示例:
00:01:02.5 --> 00:01:04.8(毫秒少一位)→ 整个 cue 被跳过 - 中文 VTT 文件必须为 UTF-8 无 BOM 编码,否则 Firefox 可能乱码或空白
- VTT 中不要写
等 HTML 标签——它们会被原样输出,不是渲染;需样式请用 CSS 控制::cue
动态切换字幕不能只靠 HTML,得用 JS 控制
modeHTML 中写多个
track是基础,但用户点击切换语言时,浏览器不会自动生效——必须手动设置track.mode。- 初始只给一个
track加default,其余保持默认disabled - 切换时遍历
video.textTracks,把目标设为track.mode = "showing",其余设为"disabled" -
mode改变后,浏览器不会自动滚动到当前时间点字幕;如需精确同步,要监听timeupdate手动匹配 - Safari 要求
video带controls属性,否则字幕菜单根本不出现;Chrome 则默认支持右键开启
最常被忽略的其实是服务端响应:跨域时,.vtt 文件必须由服务端返回
Access-Control-Allow-Origin: *和Content-Type: text/vtt,否则 Firefox/Edge 静默失败——连 Network 请求都看不到。 - 用 JS 动态
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











