/** * @projectDescription Scalable Background Image * @author Matt Hobbs (http://nooshu.com/) * @version 0.1 * * Takes an IMG tag you want as a page / container background * and scales the image up / down depending on page size */ (function($){ $.fn.backgroundScale = function(customOptions){ //Merge default and user options var options = $.extend({}, $.fn.backgroundScale.defaultOptions, customOptions); return this.each(function(i){ var $this = $(this); var $bgImage = $(options.imageSelector); //Set some basic CSS positioning rules $this.css({position: "absolute"}); $bgImage.css({position: "absolute"}); //Define out vars var containerWidth, containerHeight, containerRatio; var imageWidth, imageHeight, imageRatio; //Manipulation function var imageManipulation = function(){ //Set the container details containerWidth = $this.width() + options.containerPadding; containerHeight = $this.height() + options.containerPadding; containerRatio = containerWidth / containerHeight; //Set the image details imageWidth = $bgImage.width(); imageHeight = $bgImage.height(); imageRatio = imageWidth / imageHeight; //Center the image within the container? if(options.centerAlign){ $bgImage.css({ left: '50%', top: '50%', marginLeft: -(containerWidth/2), marginTop: -(containerHeight/2) }); } //Decide what to do with the image if(imageRatio < containerRatio){//Width less than height $bgImage.css({ width: containerWidth, height: containerWidth * (1/imageRatio) }); } else if(imageRatio > containerRatio){//Height less than width $bgImage.css({ width: containerHeight * imageRatio, height: containerHeight }); } else if(imageRatio == containerRatio){//Unlikely event ratios are equal //Image width less or equal to height, choose width as it's shorter if(imageWidth <= imageHeight){ $bgImage.css({ width: containerWidth, height: containerWidth * (1/imageRatio) }); } else {//Else choose shorter height $bgImage.css({ width: containerHeight * imageRatio, height: containerHeight }); } } } //Fire on page load imageManipulation(); //Add the browser resize event $(window).bind("resize.backgroundScale", function(){ imageManipulation(); }) }); } //Set our plugin defaults $.fn.backgroundScale.defaultOptions = { imageSelector: "#bgImage", centerAlign: true, containerPadding: 80 }; })(jQuery);