jQuery.extend({ BgImageTransitions: [] }); jQuery.fn.extend({ BgImageTransition: function(src, options) { if( !src ){ return jQuery; } //copy css from the element to the helper element function function copyCSS( from, to ){ jQuery(['border-bottom-color', 'border-bottom-style', 'border-bottom-width', 'border-left-color', 'border-left-style', 'border-left-width', 'border-right-color', 'border-right-style', 'border-right-width', 'border-spacing', 'border-top-color', 'border-top-style', 'border-top-width', 'bottom', 'height', 'left', 'margin-bottom', 'margin-left', 'margin-right', 'margin-top', 'marker-offset', 'max-height', 'max-width', 'min-height', 'min-width', 'opacity', 'outline-color', 'outline-offset', 'outline-width', 'padding-bottom', 'padding-left', 'padding-right', 'padding-top', 'width', 'z-index']).each( function(i,v){ jQuery(to).css( v, jQuery(from).css( v ) ); }); } //make sure there is a zIndex set - we will the helperElement to be *above* the original one if( !this.css('zIndex') ){ this.css('zIndex',1); } //default plugin settings var settings = jQuery.extend({ effect: {opacity: 'toggle'}, duration: 'slow', easing: 'linear', callback: function(){}, helperElementId: this.attr('id')+'2', zindex: parseInt(this.css('zIndex'),10)+1 }, options); //check the bgImageTransition array and see whether there is already a helperElement for the original one. Generate one, if not var helperElement = null; var position = this.position(); if( !jQuery.BgImageTransitions[this.attr('id')] ){ helperElement = this.clone(); copyCSS( this, helperElement ); helperElement.css('zIndex', settings.zindex); helperElement.css('display', 'none'); helperElement.css('position', 'absolute'); helperElement.css('top', position.top); helperElement.css('left', position.left); helperElement.attr('id', settings.helperElementId ); helperElement.insertAfter(this); jQuery.BgImageTransitions[this.attr('id')] = helperElement; } else{ helperElement = jQuery.BgImageTransitions[this.attr('id')]; } //load the image file into cache first, so that we get a nice and fast load. Make the transition when the image has been loaded in cache var tempImage = new Image(); jQuery(tempImage).load( function(){ var newImage = ( helperElement.css('display') == 'block' ) ? jQuery(this) : jQuery(helperElement); newImage.css('backgroundImage', 'url('+tempImage.src+')'); helperElement.animate( settings.effect, settings.duration, settings.easing, settings.callback ); }); tempImage.src = src; return jQuery; } });