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

track 标签必须放在 video 内部且紧挨 source 之后
浏览器只在 <video></video> 元素内部识别 <track></track>,且顺序很重要:必须出现在所有 <source></source> 标签之后、 之前。如果放错位置(比如在 <source></source> 前面或 video 外),字幕不会加载,控制台也不会报错,只是静默失效。
常见错误写法:
<video> <track kind="subtitles" src="zh.vtt" srclang="zh" label="中文"> <source src="video.mp4" type="video/mp4"> </video>这种顺序下,Chrome 和 Firefox 都会忽略该 track。
正确顺序示例:
<video controls> <source src="video.mp4" type="video/mp4"> <track kind="subtitles" src="zh.vtt" srclang="zh" label="中文" default> <track kind="subtitles" src="en.vtt" srclang="en" label="English"> </video>
src 指向的 .vtt 文件必须同源或配 CORS
<track></track> 的 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 标签但没转义(如
<b></b>可以,但<div> 不支持),或用了 CSS 类名(<code>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。










