必须使用video::cue伪元素定制webvtt字幕样式,因其不暴露为dom元素,常规css选择器无效;需确保track kind为subtitles/captions、vtt文件以webvtt开头且utf-8编码、字幕处于启用状态,支持color、background-color、text-shadow等有限属性,不支持position或布局控制。

video 的 track 字幕样式无法直接用 CSS 选中 <track></track>
浏览器对 <track></track> 标签生成的字幕(尤其是 WebVTT)不暴露为常规 DOM 元素,所以你写 .caption 或 track { color: red; } 完全无效。这不是你 CSS 写错了,是根本没地方挂——字幕由浏览器内置的“字幕渲染层”绘制,绕过了标准样式流。
必须用 ::cue 伪元素控制字幕外观
::cue 是唯一被广泛支持的、用于定制 WebVTT 字幕样式的 CSS 伪元素。它作用于字幕文本的每一行(或 cue block),但只在字幕启用时生效。
实操要点:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 必须写在
<style></style>或外部 CSS 中,不能内联;style属性对::cue无效 - 仅支持有限属性:
color、background-color、opacity、font-family、font-size、text-shadow、text-align、line-height、white-space(部分浏览器支持有限) - 不支持
font-weight或font-style在所有浏览器中稳定生效;iOS Safari 对font-family支持极弱,建议 fallback 到系统默认字体如"Helvetica Neue", sans-serif - 示例:
video::cue {
color: #ff6b6b;
background-color: rgba(0, 0, 0, 0.7);
font-family: "SF Pro Display", -apple-system, sans-serif;
font-size: 1.2rem;
text-shadow: 1px 1px 2px black;
}
遇到字幕不响应样式?检查这三件事
常见失效不是代码问题,而是环境或格式卡点:
-
<track></track>必须设kind="subtitles"或kind="captions",kind="metadata"或kind="chapters"不触发::cue - VTT 文件头部必须有合法的
WEBVTT声明,且编码为 UTF-8(BOM 可能导致解析失败) - Chrome / Edge 需要字幕处于“启用”状态(用户手动开启或 JS 调用
track.mode = "showing"),否则::cue规则不激活
想更灵活控制?只能用 JS + canvas 模拟字幕
如果需要动画、逐字高亮、多语言切换样式、或兼容老 IE,::cue 就不够用了。这时得放弃原生 <track></track>,改用 JS 解析 VTT,把字幕文本抽出来,动态插入 <div> 或 <code><span></span> 到 video 上层容器里,再用常规 CSS 控制。
代价明显:
- 需自己处理时间轴同步(监听
timeupdate、做二分查找) - 失去原生字幕的无障碍支持(如屏幕阅读器识别)
- 移动端双指缩放可能影响 overlay 定位
除非业务强依赖定制能力,否则优先用 ::cue —— 它轻量、标准、且足够覆盖 90% 的品牌字体/颜色需求。










