浏览器仅在开始标签后、所有闭合后、前解析;位置错误则静默忽略,且不报错、不加载、Network无请求。

track元素位置写错,浏览器直接忽略
浏览器只在开始标签之后、所有闭合之后、之前这个狭窄区间内解析。放错位置等于没写,且不报错、不加载、Network 面板里都看不到请求。
常见错误包括:
-
写在前面 - 被包在、
或空行里- 动态用 JS
appendChild()插入到已渲染的中(此时解析早已完成)- 放在
外面,哪怕只多一个换行符修复方式:把
作为的**直接子元素**,紧贴在最后一个后面,中间不插任何东西。WebVTT 文件格式或服务端响应不合规
Chrome/Firefox/Safari 对 .vtt 文件解析近乎零容错。漏掉任意一条硬性条件,整个轨道就静默失效——字幕菜单空白,控制台也无提示。
必须同时满足:
- 首行严格为
WEBVTT(顶格、全大写、无空格、无 BOM) - 文件编码为 UTF-8 without BOM(VS Code 右下角选“Save with Encoding” → UTF-8)
- 时间戳格式为
00:00:01.234 --> 00:00:04.567(毫秒必须三位,不能是.23或.2300) - 服务器返回
Content-Type: text/vtt(Nginx/Apache 需手动配置 MIME 类型) - 若跨域,服务端需返回
Access-Control-Allow-Origin: * - 本地开发禁用
file://协议,必须起服务(如python3 -m http.server)
检查方法:打开 Network 面板,点开 .vtt 请求,看 Response Headers 是否含
content-type: text/vtt,再点 Preview 确认内容可读且首行为纯WEBVTT。track 属性缺失或值非法
浏览器不做任何容错推断。
kind、srclang、label、src四者缺一不可,拼写/格式错一位,该轨道就不会出现在右键菜单中。关键校验点:
-
kind必须是"subtitles"或"captions"(不能少字母、不能多空格、不能写"caption") -
srclang必须是合法 BCP 47 码,如"zh-Hans"、"en-US";"chinese"、"zh_CN"、"cn"全部无效 -
label建议带语言变体说明,如label="中文(简体)";为空时显示(no label),多语言场景下无法区分 -
src路径必须可访问,相对路径以 HTML 文件 URL 为基准,不是 JS/CSS 所在目录
注意:
default属性只能在一个上设置,多个会导致行为未定义(多数浏览器只启用第一个)。移动端和流媒体场景下的特殊限制
移动端 Safari 默认隐藏原生字幕按钮,旧版 Android WebView 甚至不触发
video.textTracks列表;而 HLS/DASH 等流媒体播放器完全接管加载逻辑,原生基本不起作用。应对策略:
- 别依赖
video.subtitleEnabled(该属性根本不存在) - 移动端必须自己实现 UI 开关,用 JS 控制
track.mode = "showing",并 fallback 到模拟字幕层- HLS/DASH 场景下,
只是挂壳;真实字幕需由hls.js或dash.js解析后,调用video.addTextTrack()手动注入- 切换语言时,必须先设旧轨道
mode = "disabled",再设新轨道为"showing",否则渲染错乱最易被忽略的一点:JS 操作
track.mode前,必须等track.readyState === 2(即TextTrack.LOADED),而不是靠onload事件——因为onload可能不触发,而readyState是唯一可靠信号。 - HLS/DASH 场景下,
- 动态用 JS
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











