HTML5和Javascript仅在可见时播放视频

Ult*_*lly 15 html javascript video html5 html5-video

我有兴趣设置一个包含多个视频剪辑的HTML页面,这样每个视频剪辑只在可见时播放,然后在视图外时暂停.

我已经找到了一个很好的例子,说明如何用一个剪辑实现它,但是我无法修改代码以使用多个剪辑.也许我需要将此代码转换为一个易于重用的函数?

这是我到目前为止(JS Bin上面链接修改为2个剪辑而不是一个).

此代码似乎仅适用于两个剪辑中的一个.

<!DOCTYPE html>
<html>
    <!--   Created using jsbin.com   Source can be edited via http://jsbin.com/ocupor/1/edit
    -->
    <head>
        <meta charset=utf-8 />
        <title>JS Bin</title>
        <style>
            #right {
                position: absolute;
                top: 2000px;
            }
            #video1 {
                position: absolute;
                left: 2000px;
                top: 2000px;
            }
            #video2 {
                position: absolute;
                left: 2000px;
                top: 3000px;
            }

        </style>

        <style id="jsbin-css">
        </style>
    </head>
    #
    <body style="width: 4000px; height: 4000px;">
        <div id="info"></div>
        <div id="down">
            scroll down please...
        </div>
        <div id="right">
            scroll right please...
        </div>
        <video id="video1">
            <source src="http://video-js.zencoder.com/oceans-clip.mp4"/>

        </video>
        <script>
            var video = document.getElementById('video1'), 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;

                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();
                }
            }

            checkScroll();
            window.addEventListener('scroll', checkScroll, false);
            window.addEventListener('resize', checkScroll, false);
        </script>

        <video id="video2">
            <source src="http://video-js.zencoder.com/oceans-clip.mp4"/>

        </video>
        <script>
            var video = document.getElementById('video2'), 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;

                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();
                }
            } checkScroll();
            window.addEventListener('scroll', checkScroll, false);
            window.addEventListener('resize', checkScroll, false);

        </script>

    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

qwa*_*zix 21

使用isInViewport插件和jQuery,这是我的任务代码

$('video').each(function(){
    if ($(this).is(":in-viewport")) {
        $(this)[0].play();
    } else {
        $(this)[0].pause();
    }
})
Run Code Online (Sandbox Code Playgroud)

  • 因为 OP 没有指定 jQuery 标签,所以投了反对票。可以预料,问题是针对vanilla javascript的。 (2认同)
  • @KalleH.Väravas 2014 年发布此答案时情况并非如此,而且这些深奥的规则只会阻碍贡献。 (2认同)

sai*_*ike 16

好吧,我想,它必须是这样的:

var videos = document.getElementsByTagName("video");

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);
Run Code Online (Sandbox Code Playgroud)

  • 我得到了一个"未定义的分数"ReferenceError,但是一旦我添加了定义,它就能完美地运行:fraction = 0.8; (3认同)

Pie*_*ran 13

以上都不似乎为我工作,但我终于找到了一个办法:你需要visible插件,这一小段代码就在这里:

$(window).scroll(function() {
    $('video').each(function() {
        if ($(this).visible(true)) {
            $(this)[0].play();
        } else {
            $(this)[0].pause();
        }
    })
});
Run Code Online (Sandbox Code Playgroud)

这将允许任何视频仅在进入视口时播放.通过替换visible( true )visible() ,你可以将它发挥只有当整个视频的DOM元素是在口中.

  • 也谢谢你!正是我需要的滚动页面包含多个全屏视频部分,这些部分在 Chrome 和 Mac Safari 中没有表现。使用这个插件和上面的代码修复了一切。再次感谢! (2认同)

Tri*_*ger 9

你们都需要与时俱进并使用 IntersectionObserver (以及适当的 polyfill 或 babeifyl)。当页面滚动进入/退出视图时,此脚本将播放/暂停页面上的所有视频。繁荣。

<script crossorigin="anonymous" src="https://polyfill.io/v3/polyfill.min.js?features=IntersectionObserver%2CIntersectionObserverEntry"></script> 
<script>
    let video = document.querySelector('video');
    let isPaused = false;
    let observer = new IntersectionObserver((entries, observer) => { 
        entries.forEach(entry => {
        if(entry.intersectionRatio!=1  && !video.paused){
            video.pause();
            isPaused = true;
        }
        else if(isPaused) {
            video.play(); 
            isPaused=false}
        });
    }, {threshold: 1});
    observer.observe(video);
</script>
Run Code Online (Sandbox Code Playgroud)

来源


小智 5

需要检查视频在滚动过程中是否可见。

 $(window).scroll(function() {
    $('video').each(function(){
        if ($(this).is(":in-viewport")) {
            $(this)[0].play();
        } else {
            $(this)[0].pause();
        }
    })
});
Run Code Online (Sandbox Code Playgroud)