| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- /*!
- Wheelzoom 4.0.1
- license: MIT
- http://www.jacklmoore.com/wheelzoom
- */
- window.wheelzoom = (function(){
- var defaults = {
- zoom: 0.10,
- maxZoom: false,
- initialZoom: 1,
- initialX: 0.5,
- initialY: 0.5,
- };
- var main = function(img, options){
- if (!img || !img.nodeName || img.nodeName !== 'IMG') { return; }
- var settings = {};
- var width;
- var height;
- var bgWidth;
- var bgHeight;
- var bgPosX;
- var bgPosY;
- var previousEvent;
- var transparentSpaceFiller;
- function setSrcToBackground(img) {
- img.style.backgroundRepeat = 'no-repeat';
- img.style.backgroundImage = 'url("'+img.src+'")';
- transparentSpaceFiller = 'data:image/svg+xml;base64,'+window.btoa('<svg xmlns="http://www.w3.org/2000/svg" width="'+img.naturalWidth+'" height="'+img.naturalHeight+'"></svg>');
- img.src = transparentSpaceFiller;
- }
- function updateBgStyle() {
- if (bgPosX > 0) {
- bgPosX = 0;
- } else if (bgPosX < width - bgWidth) {
- bgPosX = width - bgWidth;
- }
- if (bgPosY > 0) {
- bgPosY = 0;
- } else if (bgPosY < height - bgHeight) {
- bgPosY = height - bgHeight;
- }
- img.style.backgroundSize = bgWidth+'px '+bgHeight+'px';
- img.style.backgroundPosition = bgPosX+'px '+bgPosY+'px';
-
- /*var lol = img.style.width;
-
- var lol2 = lol + 200;
-
- img.style.width = lol2+'px';*/
- }
- function reset() {
- bgWidth = width;
- bgHeight = height;
- bgPosX = bgPosY = 0;
- updateBgStyle();
- }
- function onwheel(e) {
- var deltaY = 0;
- e.preventDefault();
- if (e.deltaY) { // FireFox 17+ (IE9+, Chrome 31+?)
- deltaY = e.deltaY;
- } else if (e.wheelDelta) {
- deltaY = -e.wheelDelta;
- }
- // As far as I know, there is no good cross-browser way to get the cursor position relative to the event target.
- // We have to calculate the target element's position relative to the document, and subtrack that from the
- // cursor's position relative to the document.
- var rect = img.getBoundingClientRect();
- var offsetX = e.pageX - rect.left - window.pageXOffset;
- var offsetY = e.pageY - rect.top - window.pageYOffset;
- // Record the offset between the bg edge and cursor:
- var bgCursorX = offsetX - bgPosX;
- var bgCursorY = offsetY - bgPosY;
-
- // Use the previous offset to get the percent offset between the bg edge and cursor:
- var bgRatioX = bgCursorX/bgWidth;
- var bgRatioY = bgCursorY/bgHeight;
- // Update the bg size:
- if (deltaY < 0) {
- bgWidth += bgWidth*settings.zoom;
- bgHeight += bgHeight*settings.zoom;
- } else {
- bgWidth -= bgWidth*settings.zoom;
- bgHeight -= bgHeight*settings.zoom;
- }
- if (settings.maxZoom) {
- bgWidth = Math.min(width*settings.maxZoom, bgWidth);
- bgHeight = Math.min(height*settings.maxZoom, bgHeight);
- }
- // Take the percent offset and apply it to the new size:
- bgPosX = offsetX - (bgWidth * bgRatioX);
- bgPosY = offsetY - (bgHeight * bgRatioY);
-
- if (bgWidth < 1000)
- {
- bgPosX = 0.0;
- bgPosY = 0.0;
- }
- // Prevent zooming out beyond the starting size
- if (bgWidth <= width || bgHeight <= height) {
- //reset();
- updateBgStyle();
- } else {
- updateBgStyle();
- }
- }
- function drag(e) {
- e.preventDefault();
- bgPosX += (e.pageX - previousEvent.pageX);
- bgPosY += (e.pageY - previousEvent.pageY);
- previousEvent = e;
- updateBgStyle();
- }
- function removeDrag() {
- document.removeEventListener('mouseup', removeDrag);
- document.removeEventListener('mousemove', drag);
- }
- // Make the background draggable
- function draggable(e) {
- e.preventDefault();
- previousEvent = e;
- document.addEventListener('mousemove', drag);
- document.addEventListener('mouseup', removeDrag);
- }
- function load() {
- var initial = Math.max(settings.initialZoom, 1);
- if (img.src === transparentSpaceFiller) return;
- var computedStyle = window.getComputedStyle(img, null);
- width = parseInt(computedStyle.width, 10);
- height = parseInt(computedStyle.height, 10);
- bgWidth = width * initial;
- bgHeight = height * initial;
- bgPosX = -(bgWidth - width) * settings.initialX;
- bgPosY = -(bgHeight - height) * settings.initialY;
- setSrcToBackground(img);
- img.style.backgroundSize = bgWidth+'px '+bgHeight+'px';
- img.style.backgroundPosition = bgPosX+'px '+bgPosY+'px';
- img.addEventListener('wheelzoom.reset', reset);
- img.addEventListener('wheel', onwheel);
- img.addEventListener('mousedown', draggable);
- }
- var destroy = function (originalProperties) {
- img.removeEventListener('wheelzoom.destroy', destroy);
- img.removeEventListener('wheelzoom.reset', reset);
- img.removeEventListener('load', load);
- img.removeEventListener('mouseup', removeDrag);
- img.removeEventListener('mousemove', drag);
- img.removeEventListener('mousedown', draggable);
- img.removeEventListener('wheel', onwheel);
- img.style.backgroundImage = originalProperties.backgroundImage;
- img.style.backgroundRepeat = originalProperties.backgroundRepeat;
- img.src = originalProperties.src;
- }.bind(null, {
- backgroundImage: img.style.backgroundImage,
- backgroundRepeat: img.style.backgroundRepeat,
- src: img.src
- });
- img.addEventListener('wheelzoom.destroy', destroy);
- options = options || {};
- Object.keys(defaults).forEach(function(key){
- settings[key] = options[key] !== undefined ? options[key] : defaults[key];
- });
- if (img.complete) {
- load();
- }
- img.addEventListener('load', load);
- };
- // Do nothing in IE9 or below
- if (typeof window.btoa !== 'function') {
- return function(elements) {
- return elements;
- };
- } else {
- return function(elements, options) {
- if (elements && elements.length) {
- Array.prototype.forEach.call(elements, function (node) {
- main(node, options);
- });
- } else if (elements && elements.nodeName) {
- main(elements, options);
- }
- return elements;
- };
- }
- }());
|