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 (/MSIE/g.test($ua))
 | |
| 			{
 | |
| 				// 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 (!/MSIE/g.test($ua))
 | |
| 			{
 | |
| 				// 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 || /MSIE/g.test($ua) ) {
 | |
| 				$( this ).trigger( "load" ).trigger( "error" );
 | |
| 			}
 | |
| 		});
 | |
| 	};
 | |
| 	
 | |
| })( jQuery ); |