必须位于内且在所有之后,src需同源或配置CORS,VTT文件须为text/vtt类型、UTF-8无BOM编码、严格遵循WEBVTT语法。

track 标签必须放在 video 内部且紧挨 source 之后
浏览器只在 元素内部识别 ,且顺序很重要:必须出现在所有 标签之后、 之前。如果放错位置(比如在 前面或 video 外),字幕不会加载,控制台也不会报错,只是静默失效。
常见错误写法:
这种顺序下,Chrome 和 Firefox 都会忽略该 track。正确顺序示例:
src 指向的 .vtt 文件必须同源或配 CORS
的 src 是一个独立 HTTP 请求,受跨域限制。如果视频在 https://example.com,而字幕文件放在 https://cdn.example.com/zh.vtt,浏览器会因缺少 CORS 响应头拒绝加载,控制台显示类似 Failed to load resource: No 'Access-Control-Allow-Origin' header 的错误。
- 本地开发时直接用 file:// 协议打开 HTML,所有
.vtt加载都会失败(浏览器禁用 file 协议下的跨域请求,即使同目录)——必须起本地服务(如python3 -m http.server) - VTT 文件需返回
Content-Type: text/vtt,Nginx/Apache 要显式配置 MIME 类型,否则部分浏览器(如 Safari)可能解析失败 - 文件路径区分大小写,
zh.vtt和ZH.VTT在 Linux 服务器上是两个不同资源
kind 属性不能写成 "subtitle" 或漏写
kind 是必填属性,合法值为 "subtitles"、"captions"、"descriptions"、"chapters"、"metadata"。注意:
- 写成
kind="subtitle"(少 s)是无效值,浏览器当kind="metadata"处理,字幕不会出现在字幕菜单里 -
kind="subtitles"表示翻译性字幕(含对话+音效说明),适合外语观众;kind="captions"表示面向听障用户的完整音轨描述(含说话人、音乐、环境声),播放器 UI 通常分开显示这两类 - 如果想默认启用,加
default属性即可,但同一kind下只能有一个default;多个default时,仅第一个生效
WebVTT 文件格式稍有偏差就完全不显示
.vtt 不是自由文本,必须以 WEBVTT 开头(顶格、无空格、无 BOM),且时间戳格式严格:00:00:01.234 --> 00:00:04.567。常见失效原因:
立即学习“前端免费学习笔记(深入)”;
- 用记事本保存为 UTF-8 + BOM(Windows 默认),会导致首行实际是
WEBVTT,浏览器解析失败 - 时间戳里用了中文冒号(:)或全角空格,或小数点后位数不是 3 位(如
.12或.1234) - 文本行里用了 HTML 标签但没转义(如
可以,但不支持),或用了 CSS 类名(class="highlight")——WebVTT 不支持自定义 class最小可用 VTT 示例:
WEBVTT 00:00:01.000 --> 00:00:03.000 你好,欢迎观看。 00:00:04.000 --> 00:00:06.000 这是第一句字幕。
字幕功能看着简单,但track的加载时机、MIME 类型、VTT 语法容错率都极低,任意一环出问题都是“无声无息不显示”。调试时优先检查 Network 面板里 .vtt 请求是否 200、响应头是否有Content-Type: text/vtt、响应体开头是否真为WEBVTT。










