jQuery背景模糊转换打破窗口调整大小

时间:2012-11-05 15:25:06

标签: jquery background resize html5-canvas

我已将以下内容用于背景模糊过渡效果: http://tympanus.net/codrops/2011/11/18/fullscreen-image-blur-effect-with-html5/

该示例可在以下位置找到: http://tympanus.net/Development/FullscreenImageBlurEffect/index3.html 下面的脚本使用'StackBlur'将模糊效果添加到画布。

$(function() {

            var BlurBGImage = (function() {

                var $bxWrapper          = $('#bx-wrapper'),
                    // loading status to show while preloading images
                    $bxLoading          = $bxWrapper.find('div.bx-loading'),
                    // container for the bg images and respective canvas
                    $bxContainer        = $bxWrapper.find('div.bx-container'),
                    // the bg images we are gonna use
                    $bxImgs             = $bxContainer.children('img'),
                    // total number of bg images
                    bxImgsCount         = $bxImgs.length,
                    // current image's index
                    current             = 0,
                    // variation to show the image:
                    // (1) - blurs the current one, fades out and shows the next image
                    // (2) - blurs the current one, fades out, shows the next one (but initially blurred)
                    // speed is the speed of the animation
                    // blur Factor is the factor used in the StackBlur script
                    animOptions         = { speed : 700, variation : 2, blurFactor : 10 },
                    // control if currently animating
                    isAnim              = false,
                    // check if canvas is supported
                    supportCanvas       = Modernizr.canvas,
                    // slideshow
                    slideshow_interval  = 6000,
                    slideshow_time,

                    // init function
                    init                = function() {

                        // preload all images and respective canvas
                        var loaded = 0;

                        $bxImgs.each( function(i) {

                            var $bximg  = $(this);

                            // save the position of the image in data-pos
                            $('<img data-pos="' + $bximg.index() + '"/>').load(function() {

                                var $img    = $(this),
                                    // size of image to be fullscreen and centered
                                    dim     = getImageDim( $img.attr('src') ),
                                    pos     = $img.data( 'pos' );

                                // add the canvas to the DOM
                                $.when( createCanvas( pos, dim ) ).done( function() {

                                    ++loaded;

                                    // all images and canvas loaded
                                    if( loaded === bxImgsCount ) {

                                        // apply style for bg image and canvas
                                        centerImageCanvas();

                                        // hide loading status
                                        $bxLoading.hide();

                                        // initialize events
                                        initEvents();

                                        // start slideshow
                                        startSlideshow();

                                    }

                                });

                            }).attr( 'src', $bximg.attr('src') );

                        });

                    },
                    startSlideshow      = function() {

                        slideshow_time = setTimeout( function() {

                            if( !isAnim ) {

                                var pos = current;
                                ( pos < bxImgsCount - 1 ) ? ++pos : pos = 0;
                                isAnim = true;
                                // show the bg image
                                showImage( pos );
                                startSlideshow();

                            }

                        }, slideshow_interval );

                    },
                    // creates the blurred canvas image
                    createCanvas        = function( pos, dim ) {

                        return $.Deferred( function(dfd) {

                            // if canvas not supported return
                            if( !supportCanvas ) {
                                dfd.resolve();
                                return false;
                            }   

                            // create the canvas element:
                            // size and position will be the same like the fullscreen image
                            var $img    = $bxImgs.eq( pos ),
                                imgW    = dim.width,
                                imgH    = dim.height,
                                imgL    = dim.left,
                                imgT    = dim.top,

                                canvas  = document.createElement('canvas');

                            canvas.className        = 'bx-canvas';
                            canvas.width            = imgW;
                            canvas.height           = imgH;
                            canvas.style.width      = imgW + 'px';
                            canvas.style.height     = imgH + 'px';
                            canvas.style.left       = imgL + 'px';
                            canvas.style.top        = imgT + 'px';
                            canvas.style.visibility = 'hidden';
                            // save position of canvas to know which image this is linked to
                            canvas.setAttribute('data-pos', pos);
                            // append the canvas to the same container where the images are
                            $bxContainer.append( canvas );
                            // blur it using the StackBlur script
                            stackBlurImage( $img.get(0), dim, canvas, animOptions.blurFactor, false, dfd.resolve );

                        }).promise();

                    },
                    // gets the image size and position in order to make it fullscreen and centered.
                    getImageDim         = function( img ) {

                        var $img    = new Image();

                        $img.src    = img;

                        var $win    = $( window ),
                            w_w     = $win.width(),
                            w_h     = $win.height(),
                            r_w     = w_h / w_w,
                            i_w     = $img.width,
                            i_h     = $img.height,
                            r_i     = i_h / i_w,
                            new_w, new_h, new_left, new_top;

                        if( r_w > r_i ) {

                            new_h   = w_h;
                            new_w   = w_h / r_i;

                        }
                        else {

                            new_h   = w_w * r_i;
                            new_w   = w_w;

                        }

                        return {
                            width   : new_w,
                            height  : new_h,
                            left    : ( w_w - new_w ) / 2,
                            top     : ( w_h - new_h ) / 2
                        };

                    },
                    // initialize the events
                    initEvents          = function() {

                        $( window ).on('resize.BlurBGImage', function( event ) {

                            // apply style for bg image and canvas
                            centerImageCanvas();
                            return false;

                        });

                    },
                    // apply style for bg image and canvas
                    centerImageCanvas   = function() {

                        $bxImgs.each( function(i) {

                            var $bximg  = $(this),
                                dim         = getImageDim( $bximg.attr('src') ),
                                $currCanvas = $bxContainer.children('canvas[data-pos=' + $bximg.index() + ']'),
                                styleCSS    = {
                                    width   : dim.width,
                                    height  : dim.height,
                                    left    : dim.left,
                                    top     : dim.top
                                };  

                            $bximg.css( styleCSS );

                            if( supportCanvas )
                                $currCanvas.css( styleCSS );

                            if( i === current ) 
                                $bximg.show();

                        });

                    },
                    // shows the image at position "pos"
                    showImage           = function( pos ) {

                            // current image 
                        var $bxImage        = $bxImgs.eq( current );
                            // current canvas
                            $bxCanvas       = $bxContainer.children('canvas[data-pos=' + $bxImage.index() + ']'),
                            // next image to show
                            $bxNextImage    = $bxImgs.eq( pos ),
                            // next canvas to show
                            $bxNextCanvas   = $bxContainer.children('canvas[data-pos='+$bxNextImage.index()+']');

                        // if canvas is supported
                        if( supportCanvas ) {

                            $bxCanvas.css( 'z-index', 100 ).css('visibility','visible');

                            $.when( $bxImage.fadeOut( animOptions.speed ) ).done( function() {

                                switch( animOptions.variation ) {

                                    case 1  :
                                        $.when( $bxNextImage.fadeIn( animOptions.speed ) ).done( function() {

                                            $bxCanvas.css( 'z-index', 1 ).css('visibility','hidden');
                                            current = pos;
                                            $bxNextCanvas.css('visibility','hidden');
                                            isAnim  = false;

                                        });
                                        break;
                                    case 2  :
                                        $bxNextCanvas.css('visibility','visible');

                                        $.when( $bxCanvas.fadeOut( animOptions.speed * 1.5 ) ).done( function() {

                                            $(this).css({
                                                'z-index'       : 1,
                                                'visibility'    : 'hidden'
                                            }).show();

                                            $.when( $bxNextImage.fadeIn( animOptions.speed ) ).done( function() {

                                                current = pos;
                                                $bxNextCanvas.css('visibility','hidden');
                                                isAnim  = false;

                                            });

                                        });
                                        break;

                                };

                            });

                        }
                        // if canvas is not shown just work with the bg images
                        else {

                            $.when( $bxNextImage.css( 'z-index', 102 ).fadeIn( animOptions.speed ) ).done( function() {

                                current = pos;
                                $bxImage.hide();
                                $(this).css( 'z-index', 101 );
                                isAnim = false;

                            });

                        }

                    };

                return {
                    init    : init
                };

            })();

            // call the init function
            BlurBGImage.init();

        });

问题在于,当我调整浏览器窗口大小时,转换会中断并且不再提供所需的效果。

从我所看到的问题看来,问题似乎与画布的大小有关。 谁能让我知道如何解决它?

非常感谢。

2 个答案:

答案 0 :(得分:0)

在resize事件上调用此函数。请参阅下面的准备文档中的代码我正在绑定resize事件。

$(document).ready(function() {

    $(window).bind('resize', function(e) {
        //call your function here
    });
});

答案 1 :(得分:0)

我使用了相同的脚本Demo 1,因为我想添加自动脚本