147 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
(function( $ ) {
 | 
						|
	$.fn.muImageResize = function( params ) {
 | 
						|
		var _defaultSettings = {
 | 
						|
			width:300,
 | 
						|
			height:300,
 | 
						|
			wrap_fix:true // Let image display like in-line.
 | 
						|
		};
 | 
						|
		var _set = $.extend(_defaultSettings, params); 
 | 
						|
		var isIE7 = $.browser.msie && (7 == ~~ $.browser.version);
 | 
						|
 | 
						|
		//var anyDynamicSource = $(this).attr("src");
 | 
						|
		//$(this).attr("src",anyDynamicSource+ "?" + new Date().getTime());
 | 
						|
 | 
						|
		// Just bind load event once per element.
 | 
						|
		return this.one('load', function() {
 | 
						|
			// Remove all attributes and CSS rules.
 | 
						|
			this.removeAttribute( "width" );
 | 
						|
			this.removeAttribute( "height" );
 | 
						|
			this.style.width = this.style.height = "";
 | 
						|
			
 | 
						|
			var ow, oh;
 | 
						|
			
 | 
						|
			//[workaround] - msie need get width early
 | 
						|
			if ($.browser.msie)
 | 
						|
			{
 | 
						|
				// Get original size for calcutation.
 | 
						|
				ow = this.width;
 | 
						|
				oh = this.height;
 | 
						|
			}
 | 
						|
			
 | 
						|
			if (_set.wrap_fix) {
 | 
						|
				$(this).wrap(function(){
 | 
						|
					return '<div style="width:'+_set.width+'px; height:'+_set.height+'px; display:inline-block;" />';
 | 
						|
				});
 | 
						|
			}
 | 
						|
			
 | 
						|
			if (!$.browser.msie)
 | 
						|
			{
 | 
						|
				// Get original size for calcutation.
 | 
						|
				ow = this.width;
 | 
						|
				oh = this.height;
 | 
						|
			}
 | 
						|
			
 | 
						|
			// if cannot get width or height.
 | 
						|
			if (0==ow || 0==oh){
 | 
						|
				$(this).width(_set.width);
 | 
						|
				$(this).height(_set.height);
 | 
						|
			}else{
 | 
						|
					
 | 
						|
				// Merge position settings
 | 
						|
				var sh_margin_type='';
 | 
						|
 | 
						|
				// if original image's width > height.
 | 
						|
				if (ow > oh) {
 | 
						|
					p = oh / _set.height; 
 | 
						|
					oh = _set.height; 
 | 
						|
					ow = ow / p;
 | 
						|
					
 | 
						|
					// original image width smaller than settings.
 | 
						|
					if (ow < _set.width){
 | 
						|
						// need to resize again, 
 | 
						|
						// because new image size range must can cover settings' range, than we can crop it correctly. 
 | 
						|
						p = ow / _set.width; 
 | 
						|
						ow = _set.width;
 | 
						|
						oh = oh / p;
 | 
						|
						
 | 
						|
						// the crop range would be in the center of new image size.
 | 
						|
						sh = (oh-_set.height)/2;
 | 
						|
						t=sh+'px';
 | 
						|
						r=_set.width+'px';
 | 
						|
						b=(_set.height+sh)+'px';
 | 
						|
						l='0px';
 | 
						|
						
 | 
						|
						// need to be adjust top position latter.
 | 
						|
						sh_margin_type = 'margin-top';
 | 
						|
						
 | 
						|
					// original image width bigger than settings.
 | 
						|
					}else{
 | 
						|
						// new image range can cover settings' range. 
 | 
						|
						sh = (ow-_set.width)/2;
 | 
						|
						t='0px';
 | 
						|
						r=(_set.width+sh)+'px';
 | 
						|
						b=_set.height+'px';
 | 
						|
						l=sh+'px';
 | 
						|
						// need to be adjust left position latter.
 | 
						|
						sh_margin_type = 'margin-left';
 | 
						|
					}
 | 
						|
				// ref above, change width to height then do same things.
 | 
						|
				}else{
 | 
						|
					p = ow / _set.width;
 | 
						|
					ow = _set.width;
 | 
						|
					oh = oh / p;
 | 
						|
 | 
						|
					if (oh < _set.height) {
 | 
						|
						p = oh / _set.height;
 | 
						|
						oh = _set.height;
 | 
						|
						ow = ow / p;
 | 
						|
						
 | 
						|
						sh = (ow-_set.width)/2;
 | 
						|
						t='0px';
 | 
						|
						r=(_set.width+sh)+'px';
 | 
						|
						b=_set.height+'px';
 | 
						|
						l=sh+'px';
 | 
						|
						sh_margin_type = 'margin-left';
 | 
						|
					}else{
 | 
						|
						sh = (oh-_set.height)/2;
 | 
						|
						t=sh+'px';
 | 
						|
						r=_set.width+'px';
 | 
						|
						b=(_set.height+sh)+'px';
 | 
						|
						l='0px';
 | 
						|
						sh_margin_type = 'margin-top';
 | 
						|
					}
 | 
						|
				}
 | 
						|
				
 | 
						|
				// Resize img.
 | 
						|
				$(this).width(ow);
 | 
						|
				$(this).height(oh);
 | 
						|
				
 | 
						|
				// Crop img by set clip style.
 | 
						|
				$(this).css('clip','rect('+t+' '+r+' '+b+' '+l+')');
 | 
						|
 | 
						|
				var osh = 0;
 | 
						|
				if('auto' != $(this).css(sh_margin_type)){
 | 
						|
					osh = parseInt($(this).css(sh_margin_type));
 | 
						|
				}
 | 
						|
			
 | 
						|
				if (0 < sh) {sh*=-1;}
 | 
						|
				sh += osh;
 | 
						|
				
 | 
						|
				$(this).css(sh_margin_type, sh+'px');
 | 
						|
				$(this).css('position','absolute');
 | 
						|
			}
 | 
						|
			$(this).fadeIn('slow');
 | 
						|
		})
 | 
						|
		.one( "error", function() {
 | 
						|
			//$(this).hide();
 | 
						|
		})
 | 
						|
		.each(function() {
 | 
						|
			$(this).hide();
 | 
						|
			// Trigger load event (for Gecko and MSIE)
 | 
						|
			if ( this.complete || $.browser.msie ) {
 | 
						|
				$( this ).trigger( "load" ).trigger( "error" );
 | 
						|
			}
 | 
						|
		});
 | 
						|
	};
 | 
						|
	
 | 
						|
})( jQuery ); |