带封面图片的全屏背景 HTML5 视频

Posted

技术标签:

【中文标题】带封面图片的全屏背景 HTML5 视频【英文标题】:Full screen background HTML5 video with cover image 【发布时间】:2017-10-23 23:27:56 【问题描述】:

我正在尝试将全屏背景视频添加到我的网站。我也想添加封面图片,因为在移动设备上视频无法播放(因为没有用户交互,浏览器不会加载它)。

所以我添加了视频,将其正确定位,然后添加了图像。图像是视频的第一帧。问题来了:视频和图像的位置不一样。所以首先用户看到封面图像,然后过了一会儿视频开始播放,但有一个跳跃,因为视频与图像的位置不同。请注意,您可能需要调整浏览器窗口的大小才能看到问题。在 1920x1080 分辨率下几乎看不到它。

如何正确定位视频和封面图片?

请参阅下面的演示代码。视频在 2 秒后开始播放,因此您可以先看到图像,然后再看到视频。

这是一个demo video,您可以在其中看到图像,然后是暂停的视频,cover image 和 video。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <style>
        html,
        body,
        div,
        video 
            margin: 0;
            padding: 0;
        

        html,
        body 
            height: 100%;
        

        .video 
            position: fixed;
            top: 50%;
            left: 50%;
            z-index: 1;
            min-width: 100%;
            min-height: 100%;
            width: auto;
            height: auto;
            -webkit-transform: translate(-50%, -50%);
            -ms-transform: translate(-50%, -50%);
            transform: translate(-50%, -50%);
        

        .panel-cover 
            position: fixed;
            background-image: url(cover.jpg);
            z-index: 2;
            background-position: center;
            background-repeat: no-repeat;
            background-size: cover;
            width: 100%;
            height: 100%;
        
    </style>
</head>
<body>
    <video id="background-video" class="video" muted loop preload="auto">
        <source src="Palm_Trees.mp4" type="video/mp4">
    </video>
    <div class="panel-cover"></div>
    <script>
        (function () 
            function playVideo(video) 
            setTimeout (function () 
                video.play();
                document.querySelector(".panel-cover").style.background = 'none';
                , 2000);
            

            window.onload = function () 
                var video = document.querySelector("#background-video");
                video.addEventListener("canplay", function () 
                    playVideo(video);
                , false);

                if (video.readyState > 3) 
                    playVideo(video);
                
            
        )();
    </script>
</body>
</html>

【问题讨论】:

【参考方案1】:

我在我的一个网站上进行了这项工作,因此只需将完整代码粘贴给您,您可以根据自己的需要进行调整。

<div class="bgBox">
    <div class="bgBox__cover cover_60"></div>
    <div class="bgBox__holder" style="background-image: url('PATH/TO/IMAGE/COVER');">

        <video loop="" muted="" autoplay="" class="bgBox__video">
            <source type="video/mp4" src="PATH/TO/VIDEO">
        </video>

    </div>
</div>

还有 CSS:

.bgBox 
    position: fixed;
    z-index: -1;


.bgBox__cover 
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    width: 100%;
    height: 100%;
    z-index: 2;
    margin: 0;
    padding: 0;


.cover_60 
    background-color: rgba(0,0,0,.6);


.bgBox__holder 
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    width: 100%;
    height: 100%;
    z-index: 1;
    margin: 0;
    padding: 0;
    background-size: cover;
    background-repeat: no-repeat;
    background-position: center center;


.bgBox__video 
    -webkit-transition: opacity 1s ease;
    -khtml-transition: opacity 1s ease;
    -moz-transition: opacity 1s ease;
    -ms-transition: opacity 1s ease;
    -o-transition: opacity 1s ease;
    transition: opacity 1s ease;
    filter: alpha(opacity=100);
    -ms-filter: "alpha(Opacity=100)";
    -webkit-opacity: 1;
    -khtml-opacity: 1;
    -moz-opacity: 1;
    -ms-opacity: 1;
    -o-opacity: 1;
    opacity: 1;
    position: fixed;
    top: 50%;
    left: 50%;
    z-index: 1;
    min-width: 100%;
    min-height: 100%;
    width: auto;
    height: auto;
   transform: translate(-50%,-50%);

希望对你有帮助。

图片需要与视频具有相同的宽高比。

【讨论】:

很遗憾这不能正常工作,请看这个演示视频:youtube.com/watch?v=dAWktz9doy4。第一个是封面图片,然后您会看到视频的第一帧。显然不一样,有“跳”。 这很尴尬。这是视频和图像s000.tinyupload.com/index.php?file_id=37298396476495665943 的完整示例,所有代码都在我上面粘贴的代码中 - 所以这可能是图像或视频纵横比或类似问题的问题。 好的,谢谢!不幸的是,它不适用于我的视频:youtube.com/watch?v=3hbCeILh_1U。首先我说明问题:你看到“跳跃”了吗?然后我显示图像和视频,因为我看到它们是相同的。你的视频的宽高比是 4:3 我想,我的是 16:9?也许这就是问题所在......【参考方案2】:

我最终使用了一个简单的解决方法:慢慢淡出封面图片:

.panel-cover 
    ...
    transition: opacity 1s;


document.querySelector(".panel-cover").style.opacity = 0;

【讨论】:

【参考方案3】:

问题实际上是视频的纵横比。不是 1:1,而是 16:9。

所以:

    删除了 javascript,添加了 autoplay 属性。该视频是封面图像 div 的子项。如果视频开始播放,封面图片将不可见,否则,封面图片将可见。 视频和封面图片的宽度/高度。这取决于视频的纵横比和浏览器窗口。所以一旦你需要width: 100%; height: auto;,而在其他情况下你需要相反的:width: auto; height: 100%;

因此我添加了适当的@media 查询:

@media (min-aspect-ratio: 16/9)
@media (max-aspect-ratio: 16/9)

如果您有一个简单的 1:1 视频,那么也许这并不重要。

最终解决方案:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <style>
        html,
        body,
        div,
        video 
            margin: 0;
            padding: 0;
        

        html,
        body 
            height: 100%;
        

        .video 
            position: fixed;
            top: 50%;
            left: 50%;
            z-index: -100;
            min-width: 100%;
            min-height: 100%;
            -webkit-transform: translate(-50%, -50%);
            -ms-transform: translate(-50%, -50%);
            transform: translate(-50%, -50%);
        

        .video-cover 
            position: fixed;
            z-index: -200;
            min-width: 100%;
            min-height: 100%;
            width: 100%;
            height: 100%;
            background-image: url(cover.jpg);
            background-position: center;
            background-repeat: no-repeat;
            background-size: cover;
        

        @media (min-aspect-ratio: 16/9) 
            .video 
                width: 100%;
                height: auto;
            
        

        @media (max-aspect-ratio: 16/9) 
            .video 
                width: auto;
                height: 100%;
            
        
    </style>
</head>
<body>
    <div class="video-cover">
        <video class="video" muted loop autoplay preload="auto">
            <source src="Palm_Trees.mp4" type="video/mp4">
        </video>
    </div>
</body>
</html>

【讨论】:

以上是关于带封面图片的全屏背景 HTML5 视频的主要内容,如果未能解决你的问题,请参考以下文章

无 JS 的全屏 HTML5 视频背景

不使用 Flash 的全屏视频背景

css Cordova Chrome Apps中的全屏背景,使用背景大小:封面

HTML5全屏背景视频与 CSS 和 JS(插件或库)

HTML5 body设置全屏背景图片 如何让body的背景图片自适应整个屏----实战经验

webview上的Html5视频缺少棒棒糖上的全屏按钮