track 元素的 default 属性仅控制字幕默认显示(mode="showing"),与自动播放无关;必须添加 default 且位置正确,否则浏览器默认禁用字幕;src 错误、MIME 类型不符、WebVTT 格式错误或视频未就绪均导致字幕不显示;推荐用 JS 在 loadedmetadata 后主动设 track.mode = "showing" 并兜底延时处理。

track 元素本身不控制“自动播放”,只控制是否默认启用
很多人误以为 track 有类似 autoplay 的行为,其实没有。track 的 default 属性只是告诉浏览器:这个轨道在页面加载后、用户未手动切换语言前,应处于 mode = "showing" 状态——也就是字幕可见。它和视频是否自动播放无关,也不影响字幕的“触发时机”。字幕显示完全由浏览器根据视频当前时间点和 WebVTT cue 时间轴自动匹配。
必须加 default 才可能默认显示字幕
如果漏掉 default,哪怕写了 <track src="zh.vtt" kind="subtitles" srclang="zh" label="中文"></track>,绝大多数浏览器(Chrome、Firefox、Safari)都会默认把该轨道设为 mode = "disabled",字幕压根不出现。
- 一个
<video></video>中只能有一个track带default;多个会全部失效 -
default必须写在<source></source>之后、之前,否则被忽略 - 即使加了
default,若视频未加载成功或 WebVTT 文件解析失败,字幕仍不会显示
常见导致字幕不显示的硬性条件
就算 default 写对了,以下任一问题都会让字幕“静默消失”:
-
src路径错误或返回 404 —— 浏览器不报错,但textTracks[0].mode会是"disabled" - 服务器没配对 MIME 类型:
.vtt文件必须返回Content-Type: text/vtt,否则 Firefox 直接拒载 - WebVTT 文件开头缺
WEBVTT标识行,或时间格式非法(如用英文逗号代替小数点) - 视频还没开始播放(
readyState ),此时 <code>textTracks可能为空或未就绪
想确保字幕一定出现?用 JS 主动设置 mode
靠 HTML 属性不够稳,尤其在动态加载或 H5 播放器场景下。更可靠的做法是等视频元数据加载完成后再手动启用:
立即学习“前端免费学习笔记(深入)”;
const video = document.querySelector('video');
video.addEventListener('loadedmetadata', () => {
const track = video.textTracks[0];
if (track && track.kind === 'subtitles') {
track.mode = 'showing'; // 强制显示,绕过 default 的脆弱性
}
});
注意:textTracks 是实时集合,track.mode 改变后立即生效;但若视频尚未加载任何字幕轨道(比如 <track></track> 标签本身被 JS 动态插入太晚),仍需确保 DOM 已就位且文件可访问。
最易被忽略的一点:移动端 WebView 或某些定制内核(如旧版微信 X5)会直接忽略 default,也不触发 loadedmetadata 后的字幕初始化——这时候必须用 JS 显式调 track.mode = "showing",且最好加个短延时兜底。



















