Spaces:
Paused
Paused
| /*! | |
| * @name: jquery-izoomify | |
| * @version: 1.0 | |
| * @author: Carl Lomer Abia | |
| */ | |
| (function ($) { | |
| var defaults = { | |
| callback: false, | |
| target: false, | |
| duration: 120, | |
| magnify: 1.2, | |
| touch: true, | |
| url: false | |
| }; | |
| var _izoomify = function (target, duration, magnify, url) { | |
| var xPos, | |
| yPos, | |
| $elTarget = $(target), | |
| $imgTarget = $elTarget.find('img:first'), | |
| imgOrigSrc = $imgTarget.attr('src'), | |
| imgSwapSrc, | |
| defaultOrigin = 'center top ' + 0 + 'px', | |
| resultOrigin, | |
| dUrl = 'data-izoomify-url', | |
| dMagnify = 'data-izoomify-magnify', | |
| dDuration = 'data-izoomify-duration', | |
| eClass = 'izoomify-in', | |
| eMagnify, | |
| eDuration; | |
| function imageSource(imgSource) { | |
| var _img = new Image(); | |
| _img.src = imgSource; | |
| return _img.src; | |
| } | |
| function getImageAttribute($img, dataAttribute, defaultAttribute) { | |
| if ($img.attr(dataAttribute)) { | |
| return $img.attr(dataAttribute); | |
| } | |
| return defaultAttribute; | |
| } | |
| function getImageSource($img, dataImageSource, defaultImageSource) { | |
| if ($img.attr(dataImageSource)) { | |
| return imageSource($img.attr(dataImageSource)); | |
| } | |
| return defaultImageSource ? imageSource(defaultImageSource) : false; | |
| } | |
| function getTouches(e) { | |
| return e.touches || e.originalEvent.touches; | |
| } | |
| imgSwapSrc = getImageSource($imgTarget, dUrl, url); | |
| eMagnify = getImageAttribute($imgTarget, dMagnify, magnify); | |
| eDuration = getImageAttribute($imgTarget, dDuration, duration); | |
| $elTarget | |
| .addClass(eClass) | |
| .css({ | |
| 'position': 'relative', | |
| 'overflow': 'hidden' | |
| }); | |
| $imgTarget.css({ | |
| '-webkit-transition-property': '-webkit-transform', | |
| 'transition-property': '-webkit-transform', | |
| '-o-transition-property': 'transform', | |
| 'transition-property': 'transform', | |
| 'transition-property': 'transform, -webkit-transform', | |
| '-webkit-transition-timing-function': 'ease', | |
| '-o-transition-timing-function': 'ease', | |
| 'transition-timing-function': 'ease', | |
| '-webkit-transition-duration': eDuration + 'ms', | |
| '-o-transition-duration': eDuration + 'ms', | |
| 'transition-duration': eDuration + 'ms', | |
| '-webkit-transform': 'scale(1)', | |
| '-ms-transform': 'scale(1)', | |
| 'transform': 'scale(1)', | |
| '-webkit-transform-origin': defaultOrigin, | |
| '-ms-transform-origin': defaultOrigin, | |
| 'transform-origin': defaultOrigin | |
| }); | |
| return { | |
| moveStart: function (e, hasTouch) { | |
| var o = $(target).offset(); | |
| if (hasTouch) { | |
| e.preventDefault(); | |
| xPos = getTouches(e)[0].clientX - o.left; | |
| yPos = getTouches(e)[0].clientY - o.top; | |
| } else { | |
| xPos = e.pageX - o.left; | |
| yPos = e.pageY - o.top; | |
| } | |
| resultOrigin = xPos + 'px ' + yPos + 'px ' + 0 + 'px'; | |
| $imgTarget | |
| .css({ | |
| '-webkit-transform': 'scale(' + eMagnify + ')', | |
| '-ms-transform': 'scale(' + eMagnify + ')', | |
| 'transform': 'scale(' + eMagnify + ')', | |
| '-webkit-transform-origin': resultOrigin, | |
| '-ms-transform-origin': resultOrigin, | |
| 'transform-origin': resultOrigin | |
| }) | |
| .attr('src', imgSwapSrc || imgOrigSrc); | |
| }, | |
| moveEnd: function () { | |
| this.reset(); | |
| }, | |
| reset: function () { | |
| resultOrigin = defaultOrigin; | |
| $imgTarget | |
| .css({ | |
| '-webkit-transform': 'scale(1)', | |
| '-ms-transform': 'scale(1)', | |
| 'transform': 'scale(1)', | |
| '-webkit-transform-origin': resultOrigin, | |
| '-ms-transform-origin': resultOrigin, | |
| 'transform-origin': resultOrigin | |
| }) | |
| .attr('src', imgOrigSrc); | |
| } | |
| } | |
| }; | |
| $.fn.izoomify = function (options) { | |
| return this.each(function () { | |
| var settings = $.extend({}, defaults, options || {}), | |
| $target = settings.target && $(settings.target)[0] || this, | |
| src = this, | |
| $src = $(src), | |
| mouseStartEvents = 'mouseover.izoomify mousemove.izoomify', | |
| mouseEndEvents = 'mouseleave.izoomify mouseout.izoomify', | |
| touchStartEvents = 'touchstart.izoomify touchmove.izoomify', | |
| touchEndEvents = 'touchend.izoomify'; | |
| var izoomify = _izoomify($target, settings.duration, settings.magnify, settings.url); | |
| function startEvent(e, hasTouch) { | |
| izoomify.moveStart(e, hasTouch); | |
| } | |
| function endEvent($src) { | |
| izoomify.moveEnd(); | |
| if ($src) { | |
| $src | |
| .off(touchStartEvents) | |
| .off(touchEndEvents); | |
| } | |
| } | |
| function resetImage() { | |
| izoomify.reset(); | |
| } | |
| $src.one('izoomify.destroy', function () { | |
| $src.removeClass('izoomify-in'); | |
| resetImage(); | |
| $src | |
| .off(mouseStartEvents) | |
| .off(mouseEndEvents); | |
| if (settings.touch) { | |
| $src | |
| .off(touchStartEvents) | |
| .off(touchStartEvents); | |
| } | |
| $target.style.position = ''; | |
| $target.style.overflow = ''; | |
| }.bind(this)); | |
| $src | |
| .on(mouseStartEvents, function (e) { | |
| startEvent(e); | |
| }) | |
| .on(mouseEndEvents, function () { | |
| endEvent(); | |
| }); | |
| if (settings.touch) { | |
| $src | |
| .on(touchStartEvents, function (e) { | |
| e.preventDefault(); | |
| startEvent(e, true); | |
| }) | |
| .on(touchEndEvents, function () { | |
| endEvent(); | |
| }); | |
| } | |
| if ($.isFunction(settings.callback)) { | |
| settings.callback.call($src); | |
| } | |
| }); | |
| }; | |
| $.fn.izoomify.defaults = defaults; | |
| }(window.jQuery)); |