滚动到时播放 HTML5 视频

Posted

技术标签:

【中文标题】滚动到时播放 HTML5 视频【英文标题】:Play HTML5 Video when scrolled to 【发布时间】:2013-03-02 00:20:00 【问题描述】:

是否只有当用户在浏览器视口中有视频(或视频的某个百分比)时才自动播放 html5 视频?

【问题讨论】:

你可以有一个不显示的 div...如果那个人的年龄是正确的,那么在 div 中添加带有视频源的视频标签并将显示更改为阻止...。如果这是您想要的,我可以帮助您...简单地告诉我您想要检索访问者年龄的方式,就是这样 xD 【参考方案1】:

简述

假设我们的浏览器窗口 W 当前滚动到 y 位置 scrollTopscrollBottom

当视频的位置在V1V2 时,我们的视频将不会播放,如下图所示。

代码详情

        $(document).ready(function() 
            // Get media - with autoplay disabled (audio or video)
            var media = $('video').not("[autoplay='autoplay']");
            var tolerancePixel = 40;

            function checkMedia()
                // Get current browser top and bottom
                var scrollTop = $(window).scrollTop() + tolerancePixel;
                var scrollBottom = $(window).scrollTop() + $(window).height() - tolerancePixel;

                media.each(function(index, el) 
                    var yTopMedia = $(this).offset().top;
                    var yBottomMedia = $(this).height() + yTopMedia;

                    if(scrollTop < yBottomMedia && scrollBottom > yTopMedia) //view explaination in `In brief` section above
                        $(this).get(0).play();
                     else 
                        $(this).get(0).pause();
                    
                );

                //
            
            $(document).on('scroll', checkMedia);
        );

【讨论】:

请解释你的答案,而不是张贴代码墙。 Mikkel 的解决方案在注释掉的文本中进行了解释。它很优雅,而且很有效。另外,我喜欢它使用 jQuery。谢谢米克尔! 我确实为@MikkelJensen 很好的答案添加了解释 太好了,对我帮助很大!这没什么大不了的,但有没有办法让tolerancePixel 占一个百分比?视频播放完毕后是否可以显示“再次播放”按钮?【参考方案2】:

希望这有帮助,但之前已经回答过

http://jsfiddle.net/jAsDJ/

var videos = document.getElementsByTagName("video"),
fraction = 0.8;
function checkScroll() 

    for(var i = 0; i < videos.length; i++) 

        var video = videos[i];

        var x = video.offsetLeft, y = video.offsetTop, w = video.offsetWidth, h = video.offsetHeight, r = x + w, //right
            b = y + h, //bottom
            visibleX, visibleY, visible;

            visibleX = Math.max(0, Math.min(w, window.pageXOffset + window.innerWidth - x, r - window.pageXOffset));
            visibleY = Math.max(0, Math.min(h, window.pageYOffset + window.innerHeight - y, b - window.pageYOffset));

            visible = visibleX * visibleY / (w * h);

            if (visible > fraction) 
                video.play();
             else 
                video.pause();
            

    



window.addEventListener('scroll', checkScroll, false);
window.addEventListener('resize', checkScroll, false);

【讨论】:

【参考方案3】:

您可以使用window.pageXOffset 和window.pageYOffset 检查您的浏览器窗口垂直和水平滚动的距离。将这些与 window.innerWidthinnerHeight 以及一些基本的几何数学一起使用,以计算可见页面与视频本身重叠的程度。将这一切放在一个函数中,您可以将其附加到窗口对象上的scrollresize 事件,以便在每次滚动更改时运行检查。

这里是一些示例代码:

var video = document.getElementById('video'),
    info = document.getElementById('info'),
    fraction = 0.8;

function checkScroll() 
  var x = video.offsetLeft,
      y = video.offsetTop,
      w = video.offsetWidth,
      h = video.offsetHeight,
      r = x + w, //right
      b = y + h, //bottom
      visibleX,
      visibleY,
      visible;

  if (window.pageXOffset >= r ||
      window.pageYOffset >= b ||
      window.pageXOffset + window.innerWidth < x ||
      window.pageYOffset + window.innerHeight < y
     )     

    info.innerHTML = '0%';
    return;
  

  visibleX = Math.max(0, Math.min(w, window.pageXOffset + window.innerWidth - x, r - window.pageXOffset));
  visibleY = Math.max(0, Math.min(h, window.pageYOffset + window.innerHeight - y, b - window.pageYOffset));

  visible = visibleX * visibleY / (w * h);

  info.innerHTML = Math.round(visible * 100) + '%';

  if (visible > fraction) 
    video.play();
   else 
    video.pause();
  



window.addEventListener('scroll', checkScroll, false);
window.addEventListener('resize', checkScroll, false);

//one time at the beginning, in case it starts in view
checkScroll();

//as soon as we know the video dimensions
video.addEventListener('loadedmetadata', checkScroll, false);

还有一个working example。

此代码假定一个非常简单的页面布局。如果您的视频绝对定位在另一个设置了“位置:相对”的元素内,那么您需要做更多的工作来计算视频的正确位置。 (如果视频已使用 CSS 变换移动,情况也是如此。)

【讨论】:

我假设问题是在下载一定百分比的视频后播放。我猜我没有仔细阅读它 是的。您可以使用$ 代替getElementById,使用$('#video').bind(... 代替addEventListener。如果需要,可以使用“.offset()”。【参考方案4】:

有一个用于此场景的新 API,称为 Intersection_Observer_API,它 Chrome 51+ 和 Edge 15+ 已支持。

var options = 
    root: document.querySelector('.scroll-container'),
    rootMargin: '0px',
    threshold: 1.0 // trigger only when element comes into view completely
;
var ob = new IntersectionObserver((entries, observer) => 
    entries[0].target.classList.toggle('red');
, options);

// observe all targets, when coming into view, change color
document.querySelectorAll('.target').forEach((item) => 
    ob.observe(item);
);

这是一个简单的演示: https://codepen.io/hectorguo/pen/ybOKEJ

【讨论】:

以上是关于滚动到时播放 HTML5 视频的主要内容,如果未能解决你的问题,请参考以下文章

朋友圈滚动播放视频功能

如果定位在视口之外,html5 视频不会在 OSX Safari 中自动播放

基于滚动值的 Flutter Web 视频播放

HTML5 无限循环滚动图片流

网页中视频播放,文字滚动

滚动 UITableView 停止视频播放