现在的位置: 首页 > 综合 > 正文

[ 前端 ] JQuery 图片放大与获取鼠标!

2014年06月27日 ⁄ 综合 ⁄ 共 6346字 ⁄ 字号 评论关闭
$(function(){
	
	var view = $( "#view" );
	var image = $( "#social-image-id" );
	var size = HHJsLib.getImageSize("http://localhost:8080/xyrj-socail/public/resource/images/1359876033390RSMAF92WIU.jpg");

	// Create the ZOOM element - this will be added with
	// Javascript since it's more of an "effect".
	var zoom = $( "<a id='zoom'><span><br /></span></a>" );

	// Before we start messing with the scripts, let's
	// update the display to allow for the absolute
	// positioning of the image and zoomer.

		// Set an explicit height / width on the view based
	// on the initial size of the image.
		view.width( image.width() );
		view.height( image.height() );

		// Now that the view has an explicit width and height,
	// we can change the displays for positioning.
	image.css( "position", "absolute" );

		// Set an exlicit height on the image (to make sure
	// that some of the later calcualtions don't get
	// messed up - I saw some irradic caculated-height
	// behavior).
		image.height( image.height() );

		// Before we add the zoom square, we need it to match
	// the aspect ratio of the image.
		zoom.width( Math.floor( image.width() / 2 ) );
		zoom.height( Math.floor( image.height() / 2 ) );

		// Now, add the zoom square to the view.
		view.append( zoom );


		// ---------------------------------------------- //
	// ---------------------------------------------- //


		// Now that we have our UI set up physically, we need
	// to bind the event handlers.

		// We want to show and hide the zoom only when the
	// user hovers over the view.
	view.hover(
		function( event ){
			// Show the soom.
			zoom.show();
		},
		function( event ){
			// Hide the zoom.
				zoom.hide();
			}
		);


		// As the user mouses over the view, we can get the
	// mouse coordinates in terms of the page; we need
	// to be able to translate those into VIEW-based
	// X and Y cooridates. As such, let's get the offset
	// of the view as our base 0x0 coordinate.
	//
	// NOTE: We are doing this here so that we do it once,
	// rather than every time the mouse moves.
		viewOffset = view.offset();

		// Get the jQuery-ed version of the window as we will
	// need to access it's scroll offsets every time the
	// mouse moves over the div.
	//
	// NOTE: This will change the change the refernce to
	// "window" for all of the code in this closure.
		var window = $( window );


		// As the user moves across the view, we want to move
	// the zoom square with them.
	view.mousemove(
		function( event ){
			// Get the window scroll top; the mouse
			// position is relative to the window, NOT
			// the document.
			var windowScrollTop = window.scrollTop();
			var windowScrollLeft = window.scrollLeft();
			
			// Translate the mouse X / Y into view-local
			// coordinates that can be used to position
			// the zoom box.
				setZoomPosition(
					Math.floor(
						event.clientX - viewOffset.left + windowScrollLeft
					),
					Math.floor(
						event.clientY - viewOffset.top + windowScrollTop
					)
				);
			}
		);


		// I position the zoom box within the view based on
	// the given view-local mouse coordinates.
	var setZoomPosition = function( mouseLeft, mouseTop ){
		// Ideally, we want to keep the zoom box centered
		// on the mouse. As such, we want the given mouse
		// left and mouse top coordiantes to be in the
		// middle of the zoom box.
			var zoomLeft = (mouseLeft - (zoom.width() / 2));
			var zoomTop = (mouseTop - (zoom.height() / 2))

			// As we move the zoom box around, however, we
		// never want it to go out of bounds of the view.

			// Protect the top-left bounds.
			zoomLeft = Math.max( zoomLeft, 0 );
			zoomTop = Math.max( zoomTop, 0 );

			// Protect the bottom-right bounds. Because the
		// bottom and right need to take the dimensions
		// of the zoom box into account, be sure to use
		// the outer width to include the border.
			zoomLeft = Math.min(
				zoomLeft,
				(view.width() - zoom.outerWidth())
				);
			zoomTop = Math.min(
				zoomTop,
				(view.height() - zoom.outerHeight())
				);

			// Position the zoom box in the bounds of the
		// image view box.
		zoom.css({
			left: (zoomLeft + "px"),
			top: (zoomTop + "px")
			});
		};


		// Now that we have the mouse movements being tracked
	// properly, we need to track the click on the zoom to
	// zoom in the image on demand. To do that, however,
	// we need to start storing some information with the
	// image so we can manipulate it as needed.
		image.data({
			zoomFactor: (view.width() / zoom.width()),
			zoom: 1,
			top: 0,
			left: 0,
			width: image.width(),
			height: image.height(),
			originalWidth: image.width(),
			originalHeight: image.height()
		});


		// Now, let's attach the click event handler to the
	// zoom box.
	zoom.click(
		function( event ){
			// First, prevent the default since this is
			// not a navigational link.
				event.preventDefault();

				// Let's pass the position of the zoom box
			// off to the function that is responsible
			// for zooming the image.
			zoomImage(
				zoom.position().left,
				zoom.position().top
			);
			
			var top = $("#social-image-id" ).offset().top;
			var left = $("#social-image-id").offset().left;
			var pointX = left  + ($( "#social-image-id" ).width()/2);
			var pointY = top  + ($( "#social-image-id" ).height()/2);
			var width = event.clientX -  pointX;
			var height = pointY - event.clientY;
			var reaX = size.width;
			width = width * (reaX/$( "#social-image-id" ).width());
			height = height * (reaX/$( "#social-image-id" ).width());
			$("#position_y_id").val(parseInt(height));
			$("#position_x_id").val(parseInt(width));
		}
	);


		// I take the zoom box coordinates and translate them
	// into an actual image zoom based on the existing
	// zoom and offset of the image.
	//
	// NOTE: We don't care about the dimensions of the
	// zoom box itself as those should have already been
	// properly translated into the zoom *factor*.
	var zoomImage = function( zoomLeft, zoomTop ){
		// Get a reference to the image data object so we
		// don't need to keep retreiving it.
			var imageData = image.data();

			// Check to see if we have reached the max zoom
		// or if the image is currently animating.
		// If so, just return out.
		if (
			(imageData.zoom == 5) ||
			(image.is( ":animated" ))
				){

				// Zooming in beyond this is pointless (and
			// can cause the browser to mis-render the
			// image).
				return;

			}

			// Scale the image up based on the zoom factor.
			imageData.width =
				(image.width() * imageData.zoomFactor);

			imageData.height =
				(image.height() * imageData.zoomFactor);

			// Change the offset set data to re-position the
		// 0,0 coordinate back up in the top left.
			imageData.left =
				((imageData.left - zoomLeft) * imageData.zoomFactor);

			imageData.top =
				((imageData.top - zoomTop) * imageData.zoomFactor);

			// Increase the zoom.
			imageData.zoom++;

			// Animate the zoom.
			image.animate(
				{
					width: imageData.width,
					height: imageData.height,
					left: imageData.left,
					top: imageData.top
				},
				500
			);

		};


		// I reset the image zoom.
	var resetZoom = function(){
		// Get a reference to the image data object so we
		// don't need to keep retreiving it.
			var imageData = image.data();

			// Reset the image data.
			imageData.zoom = 1;
			imageData.top = 0;
			imageData.left = 0;
			imageData.width = imageData.originalWidth;
			imageData.height = imageData.originalHeight;

			// Animate the zoom.
			image.animate(
				{
					width: imageData.width,
					height: imageData.height,
					left: imageData.left,
					top: imageData.top
				},
				300
			);
		};


		// As a final step, to make sure that the image can
	// be zoomed out, bind the mousedown to the document.
	$( document ).mousedown(
		function( event ){
			// Check to see if the view is in the event
			// bubble chain for the mouse down. If it is,
			// then this click was in the view or its
			// child elements.
			var closestView = $( event.target ).closest( "#view" );

				// Check to see if this mouse down was in the
			// image view.
				if (!closestView.size()){

					// The view was not found in the chain.
				// This was clicked outside of the view.
				// Reset the image zoom.
					resetZoom();

				}
			}
		);
	
});		

抱歉!评论已关闭.