var flexiBackground = function(){ /** CONFIGURATION: Define the size of our background image */ var bgImageSize = { width : 800, height : 600 }; /** Declare and define variables */ var $window, $body, imageID = "expando", tallClass = 'tall', wideClass = 'wide', $bgImage, $wrapper, img, url, imgAR; /** Are we dealing with ie6? */ var ie6 = ($.browser.msie && parseInt($.browser.version, 10) <= 6); /** Set up the action that happens on resize */ var resizeAction = function() { var win = { height : $window.height(), width : $window.width() }; // The current aspect ratio of the window var winAR = win.width / win.height; // Determine if we need to show the image and whether it needs to stretch tall or wide if (win.width < bgImageSize.width && win.height < bgImageSize.height) { $body .removeClass(wideClass) .removeClass(tallClass); } else if ((win.w < bgImageSize.width && win.height >= bgImageSize.height) || (winAR < imgAR)) { $body .removeClass(wideClass) .addClass(tallClass); // Center the image $bgImage.css('left', Math.min(((win.width - bgImageSize.width) / 2), 0)); } else if (win.width >= bgImageSize.width) { $body .addClass(wideClass) .removeClass(tallClass); $bgImage.css('left', 0); } // Need to fix the height of the wrapper for IE6 if (ie6) { $wrapper.css('height', win.height); } }; return { /* Sets up the basic functionality */ initialize : function() { // No need for any of this if the screen isn't bigger than the background image if (screen.availWidth <= bgImageSize.width || screen.availHeight <= bgImageSize.height) { return; } // Grab elements we'll reference throughout $window = $(window); $body = $('body'); // Parse out the URL of the background image and drop out if we don't have one url = $body.css('background-image').replace(/^url\(("|')?|("|')?\);?$/g, '') || false; if (!url || url === "none" || url === "") { return; } // Get the aspect ratio of the image imgAR = bgImageSize.width / bgImageSize.height; // Create a new image element $bgImage = $('') .attr('src', url) .attr('id', imageID); // Create a wrapper and append the image to it. // The wrapper ensures we don't get scrollbars. $wrapper = $('
') .css({ 'overflow' : 'hidden', 'width' : '100%', 'height' : '100%', 'z-index' : '-1' }) .append($bgImage) .appendTo($body); // IE6 Doesn't do position: fixed, so let's fake it out. // We'll apply a class which gets used in the CSS to emulate position: fixed // Otherwise, we'll simply used position: fixed. if (ie6) { $wrapper.addClass('ie6fixed'); } else { $wrapper.css({ 'position' : 'fixed', 'top' : 0, 'left' : 0 }); } // Set up a resize listener to add/remove classes from the body $window.bind('resize', resizeAction); // Set it up by triggering a resize $window.trigger('resize'); } }; }(); $(document).ready(flexiBackground.initialize);