繁体   English   中英

全屏视频在后台

[英]Fullscreen video in background

美好的一天。 我试图找到一种在背景中应用全屏视频的方法,就像此页面上的此处: spotify 我认为可以在HTML5中完成此操作,但是我尝试遵循来自stackoverflow的一些说明,但它对我不起作用。 显然,我不希望视频上有时间轴和其他控件,而只是在后台显示简单的普通视频。 到目前为止,我一直在尝试使用此功能:

代码下面的jsFiddles

<style>
    #body{position:absolute; width:100%; height:100%}
    #myvideo{position:relative; top:0; left:0; width:100%; height:100%; z-index:-999;}
    #fullpage{width:80%; margin:0 auto; background-color:#900; z-index:100;}

</style>


<video width="100%" height="100%" autoplay="autoplay" id="myvideo">
  <source src="http://www.pete.dj/video/video.webm"></source>
  <source src="http://www.pete.dj/video/video.mp4"></source>
</video>


<script language="javascript">
var elem = document.getElementById("myvideo");
if (elem.requestFullscreen) {
  elem.requestFullscreen();
} else if (elem.mozRequestFullScreen) {
  elem.mozRequestFullScreen();
} else if (elem.webkitRequestFullscreen) {
  elem.webkitRequestFullscreen();
}
</script>


<div id="fullpage">
    content goes here
</div>

但效果不佳。 这是错误的地方:

  1. 视频会全屏播放,不会拉伸或调整大小以覆盖屏幕的整个宽度
  2. 视频在chrome上可以正常播放,但在其他浏览器上不能正常播放,这可能是什么原因? 我认为html5可以在所有浏览器上播放。 我觉得这与编解码器或文件本身无关。 可以由编码引起吗? jsFiddle在这里: fiddle1

在我设法解决了视频宽度问题之后-滚动条出现了,它的作用不像背景。 如何消除视频引起的滚动条? 仅在实际的#fullpage需要时才需要它们。 不幸的是,在这种情况下,#fullpage还是在后台背后的……而不是在此之上,这是一个小提琴: fiddle2

实际网站在这里: 视频测试

感谢您的帮助和时间。

好,那是应该做的工作。 将来对某人可能有用。

(function( $ ){

    $.fn.videoBG = function( selector, options ) { 

        var options = {};
        if (typeof selector == "object") {
            options = $.extend({}, $.fn.videoBG.defaults, selector);
        }
        else if (!selector) {
            options = $.fn.videoBG.defaults;
        }
        else {
            return $(selector).videoBG(options);        
        }

        var container = $(this);

        // check if elements available otherwise it will cause issues
        if (!container.length)
            return;

        // container to be at least relative
        if (container.css('position') == 'static' || !container.css('position'))
            container.css('position','relative');

        // we need a width
        if (options.width == 0)
            options.width = container.width();

        // we need a height
        if (options.height == 0)
            options.height = container.height();    

        // get the wrapper
        var wrap = $.fn.videoBG.wrapper();
        wrap.height(options.height)
            .width(options.width);

        // if is a text replacement
        if (options.textReplacement) {

            // force sizes
            options.scale = true;

            // set sizes and forcing text out
            container.width(options.width)
                .height(options.height)
                .css('text-indent','-9999px');
        }
        else {

            // set the wrapper above the video
            wrap.css('z-index',options.zIndex+1);
        }

        // move the contents into the wrapper
        wrap.html(container.clone(true));

        // get the video
        var video = $.fn.videoBG.video(options);

        // if we are forcing width / height
        if (options.scale) {

            // overlay wrapper
            wrap.height(options.height)
                .width(options.width);

            // video
            video.height(options.height)
                .width(options.width);
        }

        // add it all to the container
        container.html(wrap);
        container.append(video);

        return video.find("video")[0];
    }

    // set to fullscreen
    $.fn.videoBG.setFullscreen = function($el) {
        var windowWidth = $(window).width(),
            windowHeight = $(window).height();

        $el.css('min-height',0).css('min-width',0);
        $el.parent().width(windowWidth).height(windowHeight);
        // if by width 
        if (windowWidth / windowHeight > $el.aspectRatio) {
            $el.width(windowWidth).height('auto');
            // shift the element up
            var height = $el.height();
            var shift = (height - windowHeight) / 2;
            if (shift < 0) shift = 0;
            $el.css("top",-shift);
        } else {
            $el.width('auto').height(windowHeight);         
            // shift the element left
            var width = $el.width();
            var shift = (width - windowWidth) / 2;
            if (shift < 0) shift = 0;
            $el.css("left",-shift);

            // this is a hack mainly due to the iphone
            if (shift === 0) {
                var t = setTimeout(function() {
                    $.fn.videoBG.setFullscreen($el);
                },500);
            }
        }

        $('body > .videoBG_wrapper').width(windowWidth).height(windowHeight);

    }

    // get the formatted video element
    $.fn.videoBG.video = function(options) {

        $('html, body').scrollTop(-1);

        // video container
        var $div = $('<div/>');
        $div.addClass('videoBG')
            .css('position',options.position)
            .css('z-index',options.zIndex)
            .css('top',0)
            .css('left',0)
            .css('height',options.height)
            .css('width',options.width)
            .css('opacity',options.opacity)
            .css('overflow','hidden');

        // video element
        var $video = $('<video/>');
        $video.css('position','absolute')
            .css('z-index',options.zIndex)
            .attr('poster',options.poster)
            .css('top',0)
            .css('left',0)
            .css('min-width','100%')
            .css('min-height','100%');

        if (options.autoplay) {
            $video.attr('autoplay',options.autoplay);
        }

        // if fullscreen
        if (options.fullscreen) {
            $video.bind('canplay',function() {
                // set the aspect ratio
                $video.aspectRatio = $video.width() / $video.height();
                $.fn.videoBG.setFullscreen($video);
            })

            // listen out for screenresize
            var resizeTimeout;
            $(window).resize(function() {
                clearTimeout(resizeTimeout);
                resizeTimeout = setTimeout(function() {
                    $.fn.videoBG.setFullscreen($video);
                },100); 
            });
            $.fn.videoBG.setFullscreen($video);
        }


        // video standard element
        var v = $video[0];

        // if meant to loop
        if (options.loop) {
            loops_left = options.loop;

            // cant use the loop attribute as firefox doesnt support it
            $video.bind('ended', function(){

                // if we have some loops to throw
                if (loops_left)
                    // replay that bad boy
                    v.play();

                // if not forever
                if (loops_left !== true)
                    // one less loop
                    loops_left--;
            });
        }

        // when can play, play
        $video.bind('canplay', function(){

            if (options.autoplay)
                // replay that bad boy
                v.play();

        });


        // if supports video
        if ($.fn.videoBG.supportsVideo()) {

            // supports webm
            if ($.fn.videoBG.supportType('webm')){

                // play webm
                $video.attr('src',options.webm);
            }
            // supports mp4
            else if ($.fn.videoBG.supportType('mp4')) {     

                // play mp4
                $video.attr('src',options.mp4);

            //  $video.html('<source src="'.options.mp4.'" />');

            }
            // throw ogv at it then
            else {

                // play ogv
                $video.attr('src',options.ogv);
            }

        }



        // image for those that dont support the video  
        var $img = $('<img/>');
        $img.attr('src',options.poster)
            .css('position','absolute')
            .css('z-index',options.zIndex)
            .css('top',0)
            .css('left',0)
            .css('min-width','100%')
            .css('min-height','100%');

        // add the image to the video
        // if suuports video
        if ($.fn.videoBG.supportsVideo()) {
            // add the video to the wrapper
            $div.html($video);
        }

        // nope - whoa old skool
        else {

            // add the image instead
            $div.html($img);
        }

        // if text replacement
        if (options.textReplacement) {

            // force the heights and widths
            $div.css('min-height',1).css('min-width',1);
            $video.css('min-height',1).css('min-width',1);
            $img.css('min-height',1).css('min-width',1);

            $div.height(options.height).width(options.width);
            $video.height(options.height).width(options.width);
            $img.height(options.height).width(options.width);   
        }

        if ($.fn.videoBG.supportsVideo()) {
            v.play();
        }
        return $div;
    }

    // check if suuports video
    $.fn.videoBG.supportsVideo = function() {
        return (document.createElement('video').canPlayType);
    }

    // check which type is supported
    $.fn.videoBG.supportType = function(str) {

        // if not at all supported
        if (!$.fn.videoBG.supportsVideo())
            return false;

        // create video
        var v = document.createElement('video');

        // check which?
        switch (str) {
            case 'webm' :
                return (v.canPlayType('video/webm; codecs="vp8, vorbis"'));
                break;
            case 'mp4' :
                return (v.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"'));
                break;
            case 'ogv' :
                return (v.canPlayType('video/ogg; codecs="theora, vorbis"'));
                break;          
        }
        // nope
        return false;   
    }

    // get the overlay wrapper
    $.fn.videoBG.wrapper = function() {
        var $wrap = $('<div/>');
        $wrap.addClass('videoBG_wrapper')
            .css('position','absolute')
            .css('top',0)
            .css('left',0);
        return $wrap;
    }

    // these are the defaults
    $.fn.videoBG.defaults = {
            mp4:'',
            ogv:'',
            webm:'',
            poster:'',
            autoplay:true,
            loop:true,
            scale:false,
            position:"absolute",
            opacity:1,
            textReplacement:false,
            zIndex:0,
            width:0,
            height:0,
            fullscreen:false,
            imgFallback:true
        }

})( jQuery );



$(document).ready(function() {


    $('body').videoBG({
        position:"fixed",
        zIndex:0,
        mp4:'http://www.pete.dj/video/video.mp4',
        ogv:'http://www.pete.dj/video/video.ogv',
        webm:'http://www.pete.dj/video/video.webm',
        poster:'http://www.pete.dj/video/video.jpg',
        opacity:1,
        fullscreen:true,
    });

})

jfiddle在这里: jfiddle

body{margin:0;}

我想这是您要查找的CSS代码段。

基本上,您可以听window.onresize事件,然后像:

var elem = document.getElementById("myvideo");

elem.width = window.innerWidth;
elem.height = window.innerHeight;

window.onresize=function(){
    elem.width = window.innerWidth;
    elem.height = window.innerHeight;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM