浏览器默认仅启用带 default 属性的 subtitles 轨道,无 default 则全部 disabled;srclang 仅用于手动选择和辅助技术,不触发自动启用;真自动需 JS 通过 textTracks API 匹配 navigator.language 并设 mode。

浏览器怎么决定默认启用哪个 track
浏览器不会“自动启用指定语言”,它只做两件事:加载所有 track 元素,然后按规则选一个设为 showing 模式。这个规则很简单——看有没有带 default 属性的 subtitles 轨道;有,就启用它;没有,全部保持 disabled。系统语言、srclang 值、用户历史偏好,都不影响首次加载时的默认行为。
为什么加了 srclang="zh" 还不自动显示中文
srclang 只是语言标识,不是触发开关。它只在两个场景起作用:一是用户手动从字幕菜单里点选“中文”时,浏览器靠它匹配对应 track;二是辅助技术(如屏幕阅读器)识别内容语义。它不会让浏览器主动“检测用户系统语言 → 查找匹配的 srclang → 启用该 track”。
- Chrome 和 Edge 会在右键菜单中把
srclang="zh"的轨道显示为“中文”,但不会自动勾选 - Safari 更严格:如果没设
default,连字幕菜单项都可能不出现 - 即使用户系统语言是中文,
<track srclang="en"></track>也不会被跳过或禁用——它只是安静地待在那里
想真正“自动启用指定语言”,得靠 JavaScript
纯 HTML 无法实现按用户语言环境动态启用某条字幕,必须用 textTracks API 手动控制 mode。核心逻辑是:读取 navigator.language 或 document.documentElement.lang,遍历 video.textTracks,找到匹配 srclang 的那个,设 mode = "showing",其余设为 "disabled"。
- 注意
srclang值要规范:用zh、zh-Hans、zh-Latn,别用chinese或zh-pinyin - 必须等
video加载完成(loadedmetadata事件后),textTracks才可用 - 跨域
.vtt文件需服务端返回Access-Control-Allow-Origin: *,否则textTracks列表为空 - 示例片段:
video.addEventListener('loadedmetadata', () => { const userLang = navigator.language || 'en'; for (const track of video.textTracks) { if (track.kind === 'subtitles' && track.srclang === userLang) { track.mode = 'showing'; } else { track.mode = 'disabled'; } } });
default 属性的隐藏限制
default 看似简单,但有三个容易忽略的约束:
立即学习“前端免费学习笔记(深入)”;
- 只能有一个
track带default,多写也只认第一个 - 仅对
kind="subtitles"或"captions"有效;kind="metadata"加了也没用 - 一旦用户手动切换过字幕,刷新页面后仍保留上次选择,
default不会重新生效——这是浏览器设计,不是 bug
所以,如果你希望每次打开页面都强制启用中文,default 不可靠,必须配合 JS 在 loadedmetadata 里重置 mode。最易出错的是忘了检查 track.kind,直接遍历所有轨道设 mode,结果把 chapters 或 descriptions 也误启用了。



















