Created
July 7, 2012 17:35
-
-
Save ekstinehickorysnippets/3067344 to your computer and use it in GitHub Desktop.
JavaScript: Image Background AnyStretch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
jQuery Anystretch | |
Anystretch is a jQuery plugin that allows you to add a dynamically-resized background image to any page or block level element. | |
The image will stretch to fit the page/element, and will automatically resize as the window size changes. | |
Demo | |
An example is provided within this package. To see it in action go to: http://wearyoubelong.com | |
Options | |
positionX | |
This parameter controls how we position the image on the X axis. (type=String, options=left|center|right, default=center) | |
positionY | |
This parameter controls how we position the image on the Y axis. (type=String, options=top|center|bottom, default=center) | |
speed | |
This is the speed at which the image will fade in, after downloading is complete. Integers are accepted, as well as standard jQuery speed strings (slow, normal, fast). (type=Integer, default=0) | |
elPosition (only when not used on the body) | |
This is the css position given to the containing element when used on anything except the body. (type=String, default=relative) | |
Setup | |
Include the jQuery library and Anystretch plugin files in your webpage (preferably at the bottom of the page, before the closing BODY tag): | |
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> | |
<script type="text/javascript" src="/jquery.anystretch.min.js"></script> | |
Note: The example above uses the Google hosted version of jQuery; there is also a jQuery source file included with this distribution, if you would like to host it yourself. | |
<script type="text/javascript"> | |
$.anystretch("/path/to/image.jpg", {speed: 150}); | |
</script> | |
Want to change the image after Anystretch has been loaded? No problem, just call it again! | |
<script type="text/javascript"> | |
$.anystretch("/path/to/image.jpg", {speed: 150}); | |
// Perhaps you'd like to change the image on a button click | |
$(".button").click(function() { | |
$.anystretch("/path/to/next_image.jpg"); | |
}); | |
</script> | |
If you require Anystretch to work on one or more elements inside the page, rather than the page itself, simply call it on the element: | |
<script type="text/javascript"> | |
$('#myDiv').anystretch("/path/to/image.jpg", {speed: 150}); | |
</script> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<script> | |
$('.div01').anystretch("img01.jpg"); | |
$('.div02').anystretch("img02.jpg"); | |
$('.div03').anystretch("img03.jpg"); | |
</script> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> | |
<script type="text/javascript" src="/jquery.anystretch.min.js"></script> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* jQuery Anystretch | |
* Version 1.1 | |
* https://github.com/danmillar/jquery-anystretch | |
* | |
* Add a dynamically-resized background image to the body | |
* of a page or any other block level element within it | |
* | |
* Copyright (c) 2012 Dan Millar (@danmillar / decode.uk.com) | |
* Dual licensed under the MIT and GPL licenses. | |
* | |
* This is a fork of jQuery Backstretch (v1.2) | |
* Copyright (c) 2011 Scott Robbin (srobbin.com) | |
*/ | |
;(function($) { | |
$.fn.anystretch = function(src, options, callback) { | |
var isBody = this.selector.length ? false : true; // Decide whether anystretch is being called on an element or not | |
return this.each(function(i){ | |
var defaultSettings = { | |
positionX: 'center', // Should we center the image on the X axis? | |
positionY: 'center', // Should we center the image on the Y axis? | |
speed: 0, // fadeIn speed for background after image loads (e.g. "fast" or 500) | |
elPosition: 'relative' // position of containing element when not being added to the body | |
}, | |
el = $(this), | |
container = isBody ? $('.anystretch') : el.children(".anystretch"), | |
settings = container.data("settings") || defaultSettings, // If this has been called once before, use the old settings as the default | |
existingSettings = container.data('settings'), | |
imgRatio, bgImg, bgWidth, bgHeight, bgOffset, bgCSS; | |
// Extend the settings with those the user has provided | |
if(options && typeof options == "object") $.extend(settings, options); | |
// Just in case the user passed in a function without options | |
if(options && typeof options == "function") callback = options; | |
// Initialize | |
$(document).ready(_init); | |
// For chaining | |
return this; | |
function _init() { | |
// Prepend image, wrapped in a DIV, with some positioning and zIndex voodoo | |
if(src) { | |
var img; | |
if(!isBody) { | |
// If not being added to the body set position to elPosition (default: relative) to keep anystretch contained | |
el.css({position: settings.elPosition, background: "none"}); | |
} | |
// If this is the first time that anystretch is being called | |
if(container.length == 0) { | |
container = $("<div />").attr("class", "anystretch") | |
.css({left: 0, top: 0, position: (isBody ? "fixed" : "absolute"), overflow: "hidden", zIndex: (isBody ? -999999 : -999998), margin: 0, padding: 0, height: "100%", width: "100%"}); | |
} else { | |
// Prepare to delete any old images | |
container.find("img").addClass("deleteable"); | |
} | |
img = $("<img />").css({position: "absolute", display: "none", margin: 0, padding: 0, border: "none", zIndex: -999999}) | |
.bind("load", function(e) { | |
var self = $(this), | |
imgWidth, imgHeight; | |
self.css({width: "auto", height: "auto"}); | |
imgWidth = this.width || $(e.target).width(); | |
imgHeight = this.height || $(e.target).height(); | |
imgRatio = imgWidth / imgHeight; | |
_adjustBG(function() { | |
self.fadeIn(settings.speed, function(){ | |
// Remove the old images, if necessary. | |
container.find('.deleteable').remove(); | |
// Callback | |
if(typeof callback == "function") callback(); | |
}); | |
}); | |
}) | |
.appendTo(container); | |
// Append the container to the body, if it's not already there | |
if(el.children(".anystretch").length == 0) { | |
if(isBody) { | |
$('body').append(container); | |
} else { | |
el.append(container); | |
} | |
} | |
// Attach the settings | |
container.data("settings", settings); | |
img.attr("src", src); // Hack for IE img onload event | |
// Adjust the background size when the window is resized or orientation has changed (iOS) | |
$(window).resize(_adjustBG); | |
} | |
} | |
function _adjustBG(fn) { | |
try { | |
bgCSS = {left: 0, top: 0}; | |
bgWidth = _width(); | |
bgHeight = bgWidth / imgRatio; | |
// Make adjustments based on image ratio | |
// Note: Offset code provided by Peter Baker (http://ptrbkr.com/). Thanks, Peter! | |
if(bgHeight >= _height()) { | |
bgOffset = (bgHeight - _height()) /2; | |
if(settings.positionY == 'center' || settings.centeredY) { // | |
$.extend(bgCSS, {top: "-" + bgOffset + "px"}); | |
} else if(settings.positionY == 'bottom') { | |
$.extend(bgCSS, {top: "auto", bottom: "0px"}); | |
} | |
} else { | |
bgHeight = _height(); | |
bgWidth = bgHeight * imgRatio; | |
bgOffset = (bgWidth - _width()) / 2; | |
if(settings.positionX == 'center' || settings.centeredX) { | |
$.extend(bgCSS, {left: "-" + bgOffset + "px"}); | |
} else if(settings.positionX == 'right') { | |
$.extend(bgCSS, {left: "auto", right: "0px"}); | |
} | |
} | |
container.children("img:not(.deleteable)").width( bgWidth ).height( bgHeight ) | |
.filter("img").css(bgCSS); | |
} catch(err) { | |
// IE7 seems to trigger _adjustBG before the image is loaded. | |
// This try/catch block is a hack to let it fail gracefully. | |
} | |
// Executed the passed in function, if necessary | |
if (typeof fn == "function") fn(); | |
} | |
function _width() { | |
return isBody ? el.width() : el.innerWidth(); | |
} | |
function _height() { | |
return isBody ? el.height() : el.innerHeight(); | |
} | |
}); | |
}; | |
$.anystretch = function(src, options, callback) { | |
var el = ("onorientationchange" in window) ? $(document) : $(window); // hack to acccount for iOS position:fixed shortcomings | |
el.anystretch(src, options, callback); | |
}; | |
})(jQuery); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* jQuery Anystretch | |
* Version 1.1 | |
* https://github.com/danmillar/jquery-anystretch | |
* | |
* Add a dynamically-resized background image to the body | |
* of a page or any other block level element within it | |
* | |
* Copyright (c) 2012 Dan Millar (@danmillar / decode.uk.com) | |
* Dual licensed under the MIT and GPL licenses. | |
* | |
* This is a fork of jQuery Backstretch (v1.2) | |
* Copyright (c) 2011 Scott Robbin (srobbin.com) | |
*/ | |
;(function($){$.fn.anystretch=function(src,options,callback){var isBody=this.selector.length?false:true;return this.each(function(i){var defaultSettings={positionX:'center',positionY:'center',speed:0,elPosition:'relative'},el=$(this),container=isBody?$('.anystretch'):el.children(".anystretch"),settings=container.data("settings")||defaultSettings,existingSettings=container.data('settings'),imgRatio,bgImg,bgWidth,bgHeight,bgOffset,bgCSS;if(options&&typeof options=="object")$.extend(settings,options);if(options&&typeof options=="function")callback=options;$(document).ready(_init);return this;function _init(){if(src){var img;if(!isBody){el.css({position:settings.elPosition,background:"none"})}if(container.length==0){container=$("<div />").attr("class","anystretch").css({left:0,top:0,position:(isBody?"fixed":"absolute"),overflow:"hidden",zIndex:(isBody?-999999:-999998),margin:0,padding:0,height:"100%",width:"100%"})}else{container.find("img").addClass("deleteable")}img=$("<img />").css({position:"absolute",display:"none",margin:0,padding:0,border:"none",zIndex:-999999}).bind("load",function(e){var self=$(this),imgWidth,imgHeight;self.css({width:"auto",height:"auto"});imgWidth=this.width||$(e.target).width();imgHeight=this.height||$(e.target).height();imgRatio=imgWidth/imgHeight;_adjustBG(function(){self.fadeIn(settings.speed,function(){container.find('.deleteable').remove();if(typeof callback=="function")callback()})})}).appendTo(container);if(el.children(".anystretch").length==0){if(isBody){$('body').append(container)}else{el.append(container)}}container.data("settings",settings);img.attr("src",src);$(window).resize(_adjustBG)}}function _adjustBG(fn){try{bgCSS={left:0,top:0};bgWidth=_width();bgHeight=bgWidth/imgRatio;if(bgHeight>=_height()){bgOffset=(bgHeight-_height())/2;if(settings.positionY=='center'||settings.centeredY){$.extend(bgCSS,{top:"-"+bgOffset+"px"})}else if(settings.positionY=='bottom'){$.extend(bgCSS,{top:"auto",bottom:"0px"})}}else{bgHeight=_height();bgWidth=bgHeight*imgRatio;bgOffset=(bgWidth-_width())/2;if(settings.positionX=='center'||settings.centeredX){$.extend(bgCSS,{left:"-"+bgOffset+"px"})}else if(settings.positionX=='right'){$.extend(bgCSS,{left:"auto",right:"0px"})}}container.children("img:not(.deleteable)").width(bgWidth).height(bgHeight).filter("img").css(bgCSS)}catch(err){}if(typeof fn=="function")fn()}function _width(){return isBody?el.width():el.innerWidth()}function _height(){return isBody?el.height():el.innerHeight()}})};$.anystretch=function(src,options,callback){var el=("onorientationchange"in window)?$(document):$(window);el.anystretch(src,options,callback)}})(jQuery); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<script type="text/javascript"> | |
$.anystretch("/path/to/image.jpg", {speed: 150}); | |
</script> | |
// Want to change the image after Anystretch has been loaded? No problem, just call it again! | |
<script type="text/javascript"> | |
$.anystretch("/path/to/image.jpg", {speed: 150}); | |
// Perhaps you'd like to change the image on a button click | |
$(".button").click(function() { | |
$.anystretch("/path/to/next_image.jpg"); | |
}); | |
</script> | |
// If you require Anystretch to work on one or more elements inside the page, rather than the page itself, simply call it on the element: | |
<script type="text/javascript"> | |
$('#myDiv').anystretch("/path/to/image.jpg", {speed: 150}); | |
</script> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment