Skip to content

Instantly share code, notes, and snippets.

@levymetal
Last active November 1, 2022 01:22
Show Gist options
  • Save levymetal/5083909 to your computer and use it in GitHub Desktop.
Save levymetal/5083909 to your computer and use it in GitHub Desktop.
Tutorial on how to use jQuery resize to parent plugin, full post available @ http://christianvarga.com/jquery-resize-image-to-parent-container-plugin/
$('#myImage').resizeToParent();
/*
* Plugin Name: Resize Image to Parent Container
*
* Author: Christian Varga
* Author URI: http://christianvarga.com
* Plugin Source: https://github.com/levymetal/jquery-resize-image-to-parent/
*
*/
(function($) {
$.fn.resizeToParent = function(opts) {
var defaults = {
parent: 'div',
delay: 100
}
var opts = $.extend(defaults, opts);
function positionImage(obj) {
// reset image (in case we're calling this a second time, for example on resize)
obj.css({'width': '', 'height': '', 'margin-left': '', 'margin-top': ''});
// dimensions of the parent
var parentWidth = obj.parents(opts.parent).width();
var parentHeight = obj.parents(opts.parent).height();
// dimensions of the image
var imageWidth = obj.width();
var imageHeight = obj.height();
// step 1 - calculate the percentage difference between image width and container width
var diff = imageWidth / parentWidth;
// step 2 - if height divided by difference is smaller than container height, resize by height. otherwise resize by width
if ((imageHeight / diff) < parentHeight) {
obj.css({'width': 'auto', 'height': parentHeight});
// set image variables to new dimensions
imageWidth = imageWidth / (imageHeight / parentHeight);
imageHeight = parentHeight;
}
else {
obj.css({'height': 'auto', 'width': parentWidth});
// set image variables to new dimensions
imageWidth = parentWidth;
imageHeight = imageHeight / diff;
}
// step 3 - center image in container
var leftOffset = (imageWidth - parentWidth) / -2;
var topOffset = (imageHeight - parentHeight) / -2;
obj.css({'margin-left': leftOffset, 'margin-top': topOffset});
}
// run the position function on window resize (to make it responsive)
var tid;
var elems = this;
$(window).on('resize', function() {
clearTimeout(tid);
tid = setTimeout(function() {
elems.each(function() {
positionImage($(this));
});
}, opts.delay);
});
return this.each(function() {
var obj = $(this);
// hack to force ie to run the load function... ridiculous bug
// http://stackoverflow.com/questions/7137737/ie9-problems-with-jquery-load-event-not-firing
obj.attr("src", obj.attr("src"));
// bind to load of image
obj.on('load', function() {
positionImage(obj);
});
// run the position function if the image is cached
if (this.complete) {
positionImage(obj);
}
});
}
})( jQuery );
$('#myImage').resizeToParent({parent: '.parentContainer'});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment