如何通过 CSS 为 HTML5 视频中的文本轨道设置样式?

Posted

技术标签:

【中文标题】如何通过 CSS 为 HTML5 视频中的文本轨道设置样式?【英文标题】:How to style text tracks in HTML5 video via CSS? 【发布时间】:2015-11-22 00:15:27 【问题描述】:

是否可以在 html5 视频播放器中设置文本轨道(如字幕和字幕)的样式?

我已经为 Chrome 找到了一种方法:

video::-webkit-media-text-track-container 
    // Style the container


video::-webkit-media-text-track-background 
    // Style the text background


video::-webkit-media-text-track-display 
    // Style the text itself

这似乎让 Safari 有点困惑。它可以工作,但渲染有很多错误。

但更重要的是:Firefox 和 IE 如何做到这一点?

【问题讨论】:

一些基于音频而非视频的相关问题***.com/questions/4126708/…***.com/questions/17129640/… 谢谢。不能解决问题,但无论如何都很有趣...... ;-) 【参考方案1】:

这适用于 chrome,

video::-webkit-media-text-track-container 
    // Style the container


video::-webkit-media-text-track-background 
    // Style the text background



video::-webkit-media-text-track-display 
    // Style the text itself

您还可以从这些链接中获取一些信息。

Link 1

Link 2

【讨论】:

来源没有直接提及该属性,但链接到的跨浏览器web VTT 信息很好,包括插件列表,您可能需要为此更新答案。另见advprog.blogspot.co.uk/2013/07/… 遗憾的是,Firefox 不存在 media-text-track 的东西。链接 1 不包含有关样式的信息,链接 2 中提出的解决方案需要重写字幕/字幕文件。所以这不是一个纯粹的 css 解决方案。【参考方案2】:

将此用于 Chrome:

video::cue 
  // add style here

火狐:

尚不支持。打开错误以实现 ::cue 伪元素 - https://bugzilla.mozilla.org/show_bug.cgi?id=865395

编辑: 提供对 FireFox 的支持,它的工作方式与在 Chrome 和 Opera 中的工作方式类似。但目前还不支持 Edge 或 IE。

【讨论】:

【参考方案3】:

迄今为止我发现的唯一跨浏览器解决方案是:隐藏视频的文本轨道并使用您自己的。

这将允许您创建自己的文本节点,包括类、id 等,然后可以通过 css 简单地设置样式。

为此,您将利用文本提示的 onenter 和 onexit 方法来实现您自己的文本节点。

var video   = document.querySelector(‘YOUR_VIDEO_SELECTOR’)
    tracks  = video.textTracks[0],
    tracks.mode = 'hidden', // must occur before cues is retrieved
    cues    = tracks.cues;

  var replaceText = function(text) 
        $('WHERE_TEXT_GETS_INSERTED').html(text);
      ,

      showText = function() 
        $('WHERE_TEXT_GETS_INSERTED').show();
      ,

      hideText = function() 
        $('WHERE_TEXT_GETS_INSERTED').hide();
      ,

      cueEnter = function() 
        replaceText(this.text);
        showText();
      ,

      cueExit = function() 
        hideText();
      ,

      videoLoaded = function(e) 
        for (var i in cues) 
          var cue = cues[i];
          cue.onenter = cueEnter;
          cue.onexit = cueExit;
        
      ,

      playVideo = function(e) 
        video.play();
      ;


  video.addEventListener('loadedmetadata', videoLoaded);
  video.addEventLister('load', playVideo);
  video.load();

【讨论】:

你摇滚!!作为为 mp3 文件添加字幕的跨浏览器解决方案,这非常棒。【参考方案4】:

我开始将我的字幕设置为黑色背景,并位于 Safari 和 Chrome 的视频下方。我通过以下代码以及使用以下样式编辑 .vtt 文件取得了成功。请注意,您必须将样式添加到 .vtt 文件中,否则在 Safari 中,当视频控件(即使它们被隐藏)出现时,您的字幕会跳来跳去:

4
00:00:09.980 --> 00:00:12.640 line:13 position:50% align:middle 
size:100%
for just the summer but I ended up staying here.

chrome 和 safari 字幕的样式:

Chrome 使用 video::cue 背景颜色和不透明度。

video::cue 
  opacity: 1;
  background-color: black;
  font-size: 20px !important;

Safari 使用 -webkit-media-text-track-display-backdrop 作为背景色。请注意覆盖 Safari 固有样式的 !important。

video::-webkit-media-text-track-display-backdrop 
  background-color: black !important;
  overflow: visible !important;

以下 webkit-media-text-track-display 溢出允许在 Chrome 的标题文本周围进行更多填充:

video::-webkit-media-text-track-display 
  overflow: visible !important;

溢出可见对于 Safari 的以下代码很重要,我正在使用转换设置视频下方的字幕,这依赖于固定的字体大小:

video::-webkit-media-text-track-container 
 overflow: visible !important;
 transform: translateY(30%) !important;

编辑

经过一些调整,我最终将它用于我的项目:

重要提示:从 .VTT 文件中删除所有内联样式。

确定用户使用的是 chrome 还是 safari。

const rootElement = document.getElementById('root');
const M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];

rootElement.className += "web";
if(M[1] === 'chrome')
  rootElement.className += " chrome";
 else 
  rootElement.className += " safari";

然后在 SASS .scss 文件中使用以下样式。注意:如果您不使用 SASS,您可以简单地为视频元素创建一个类并嵌套相应的样式。

.chrome 
  video::cue 
    font-size: 24px;
    opacity: 1;
    background-color: black;
    -webkit-transform: translateY(10%) !important;
    transform: translateY(10%) !important;
  

  video::-webkit-media-text-track-display 
    overflow: visible !important;
    -webkit-box-sizing: border-box;
    background: black;
    padding: 8px;
    border-radius: 16px;
  


  video::-webkit-media-text-track-container 
    overflow: visible !important;
    -webkit-transform: translateY(40%) !important;
    transform: translateY(40%) !important;
    position: relative;
  


.safari 
  video::cue 
    font-size: 24px;
    opacity: 1;
    background-color: black;
  

  video::-webkit-media-text-track-display-backdrop 
    background-color: black !important;
    overflow: visible !important;
  

  video::-webkit-media-text-track-display 
    overflow: visible !important;
    -webkit-box-sizing: border-box;
  

  video::-webkit-media-text-track-container 
    overflow: visible !important;
    -webkit-transform: translateY(20%) !important;
    transform: translateY(20%) !important;
    position: absolute;
  

【讨论】:

以上是关于如何通过 CSS 为 HTML5 视频中的文本轨道设置样式?的主要内容,如果未能解决你的问题,请参考以下文章

如何直接通过文本设置 HTML5 视频字幕?

HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第4章CSS文本样式

回顾html5新标签

如何在 HTML 5 中为音频、视频、css、图像创建预加载器?

如何用 HTML5 CSS 视频替换 div 背景

如何将 CSS 媒体查询应用于视频海报?