
track 元素必须放在 video 或 audio 内部,且在任何 source 之后
浏览器只认得嵌套在媒体元素内部的 track,放错位置等于没写。常见错误是把它丢在 body 里,或者放在 video 外面——这时控制台不会报错,但字幕/描述完全不加载。
实操建议:
-
track必须作为video或audio的直接子元素(不能套div) - 顺序很重要:应放在所有
source标签之后、video结束标签之前 - 多个
track可并列,但同一kind(如两个subtitles)只有一条会被启用
kind 属性决定轨道类型,不是随便填的字符串
kind 是强制属性,可选值只有 subtitles、captions、descriptions、chapters、metadata 五种。填错(比如写成 zh-CN 或 subtitle)会导致轨道被忽略,且无提示。
关键区别:
立即学习“前端免费学习笔记(深入)”;
-
subtitles:翻译用,用户可开关;captions:含声音描述(如「[音乐]」「[电话铃声]」),面向听障用户 -
descriptions:供屏幕阅读器读出的音视频内容描述,不显示在界面上 -
chapters:章节导航,需配合 WebVTT 文件中的CHAPTERS类型时间戳
src 指向的 .vtt 文件必须符合 WebVTT 格式,且响应头要正确
哪怕路径对、语法只差一个空格,浏览器也会静默跳过该 track。常见失效原因不是 HTML 写错,而是后端没配 MIME 类型或文件本身有格式问题。
检查要点:
- 文件开头必须是
WEBVTT(全大写,前后无空格) - 每段字幕之间用空行分隔,时间戳格式为
00:00:01.000 --> 00:00:04.000 - 服务器返回的
Content-Type必须是text/vtt,不是text/plain或application/octet-stream - 跨域时,
track的src需服务端允许 CORS(否则控制台会报Failed to load resource)
default 属性不等于“默认启用”,它只影响首次加载时的初始状态
加了 default 的 track 会在页面加载后自动显示(如果 kind 支持显示),但它不锁定用户选择——用户手动关掉后,刷新页面也不会再恢复。而且,default 只能出现在一个 track 上,多写无效。
注意边界情况:
- 如果用户系统语言与
srclang不匹配,即使写了default,浏览器也可能忽略 -
kind="metadata"或"descriptions"的track不受default影响(它们本就不显示) - JavaScript 动态设置
track.mode = "showing"才是真正可靠的启用方式
真正麻烦的是 WebVTT 文件的编码和换行符——UTF-8 无 BOM、LF 换行,这两点本地测试常没问题,一上生产环境就失效。别依赖编辑器“自动保存为 UTF-8”,手动确认下。











