Zoom effect

Attention to detail

Hover to see closeup

'); } $container = $image.parent('.magnify'); // Create the magnifying lens div if necessary if ($image.prev('.magnify-lens').length) { $container.children('.magnify-lens').css('background-image', 'url(\'' + sZoomSrc + '\')'); } else { $image.before('
'); } $lens = $container.children('.magnify-lens'); // Remove the "Loading..." text $lens.removeClass('loading'); // Cache dimensions and offsets for improved performance // NOTE: This code is inside the load() function, which is important. The width and // height of the object would return 0 if accessed before the image is fully loaded. nImageWidth = oOptions['finalWidth'] || $image.width(); nImageHeight = oOptions['finalHeight'] || $image.height(); nMagnifiedWidth = oOptions['magnifiedWidth'] || elZoomImage.width; nMagnifiedHeight = oOptions['magnifiedHeight'] || elZoomImage.height; nLensWidth = $lens.width(); nLensHeight = $lens.height(); oContainerOffset = getOffset(); // Required by refresh() // Set zoom boundaries if (oOptions['limitBounds']) { nBoundX = (nLensWidth/2) / (nMagnifiedWidth/nImageWidth); nBoundY = (nLensHeight/2) / (nMagnifiedHeight/nImageHeight); } // Enforce non-native large image size? if (nMagnifiedWidth!==elZoomImage.width || nMagnifiedHeight!==elZoomImage.height) { $lens.css('background-size', nMagnifiedWidth + 'px ' + nMagnifiedHeight + 'px'); } // Store zoom dimensions for mobile plugin $image.data('zoomSize', { 'width': nMagnifiedWidth, 'height': nMagnifiedHeight }); // Clean up elZoomImage = null; // Execute callback oOptions.afterLoad(); // Handle mouse movements $container.off().on({ 'mousemove touchmove': function(e) { e.preventDefault(); // Reinitialize if image initially hidden if (!nImageHeight) { refresh(); return; } // x/y coordinates of the mouse pointer or touch point. This is the position of // .magnify relative to the document. // // We deduct the positions of .magnify from the mouse or touch positions relative to // the document to get the mouse or touch positions relative to the container. nX = (e.pageX || e.originalEvent.touches[0].pageX) - oContainerOffset['left'], nY = (e.pageY || e.originalEvent.touches[0].pageY) - oContainerOffset['top']; // Toggle magnifying lens if (!$lens.is(':animated')) { if (nX>nBoundX && nXnBoundY && nY0) nRatioX = 0; else if (nRatioX0) nRatioY = 0; else if (nRatioY=0) { $container.on('touchend', function() { setTimeout(hideLens, oOptions['timeout']); }); } // Ensure lens is closed when tapping outside of it $('body').not($container).on('touchstart', hideLens); // Support image map click-throughs while zooming var sUsemap = $image.attr('usemap'); if (sUsemap) { var $map = $('map[name=' + sUsemap.slice(1) + ']'); // Image map needs to be on the same DOM level as image source $image.after($map); $container.click(function(e) { // Trigger click on image below lens at current cursor position if (e.clientX || e.clientY) { $lens.hide(); var elPoint = document.elementFromPoint( e.clientX || e.originalEvent.touches[0].clientX, e.clientY || e.originalEvent.touches[0].clientY ); if (elPoint.nodeName==='AREA') { elPoint.click(); } else { // Workaround for buggy implementation of elementFromPoint() // See https://bugzilla.mozilla.org/show_bug.cgi?id=1227469 $('area', $map).each(function() { var a = $(this).attr('coords').split(','); if (nX>=a[0] && nX=a[1] && nY