必须是的直接子元素且严格位于所有之后、之前;kind、srclang、label、src四属性缺一不可,值须合法,否则浏览器静默忽略。

直接给结论: <track></track> 必须是 <video></video> 的**直接子元素**,且**严格位于所有 <source></source> 之后、 之前**;缺任意一个必需属性(kind、srclang、label、src),字幕就不会出现在播放器菜单里——浏览器不报错,只静默忽略。
为什么
浏览器对嵌套顺序极其敏感,不是“差不多就行”:
-
<track></track>写在<source></source>前面 → 被忽略 -
<track></track>套在<div> 里或放在 <code><video></video>外 → 被忽略 -
<track></track>和<source></source>之间插了注释、空行或其它标签 → 部分浏览器中断解析 - 正确顺序只有一种:
<video><source> ... <source><track><track></track></track></source></source></video> -
kind="subtitles":必须是完整单词subtitles(不是subtitle、captions或留空) -
srclang="zh":必须是标准 BCP 47 码,如zh-Hans、en-US;ch、chinese、cn全部无效 -
label="中文(简体)":用户在右键菜单或控件栏看到的名字,为空时可能显示(no label),无法区分 -
src="zh.vtt":必须是可访问的相对或绝对路径(Blob URL不支持,file://协议下必失败) - HTTP 状态码不是
200(常见于本地file://直接打开,必须起服务,如python3 -m http.server) - 服务端未配置 MIME 类型:
Content-Type: text/vtt(Nginx/Apache 需手动加) - 文件首行不是严格
WEBVTT(全大写、无空格、无 BOM),且后面必须跟一个空行 - 时间戳格式错误:必须是
00:00:01.234 --> 00:00:04.567(毫秒三位、箭头前后各一个空格) - 同一
kind下只能有一个default,多个时仅第一个生效 -
default只控制初始启用状态,用户手动切换后,其他<track></track>仍处于disabled模式 - 想实现语言切换按钮,必须用 JS 遍历所有
track元素,把目标设为track.mode = "showing",其余设为"disabled" - Safari 默认隐藏字幕菜单,除非至少一个
<track kind="subtitles"></track>带default,否则连开关都看不到
四个必需属性一个都不能少,浏览器不猜、不默认
以下四个属性必须显式写出,值也必须合法:
.vtt 文件本身过不了四关,字幕照样不显示
就算 HTML 写对了,.vtt 文件只要有一项不达标,整个轨道就失效:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
立即学习“前端免费学习笔记(深入)”;
default 属性有隐藏限制,多语言切换得靠 JS
default 看似简单,但实际行为很具体:
最容易被忽略的是:结构顺序 + 四个属性 + .vtt 首行 + MIME 类型,这五点中任一出错,字幕就彻底消失,而且控制台完全沉默。别指望浏览器“尽力而为”,它只认规范。调试时优先检查这五处,比翻 JS 控制逻辑快得多。


















