123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- * Zoomify
- * A jQuery plugin for simple lightboxes with zoom effect.
- * http://indrimuska.github.io/zoomify
- *
- * (c) 2015 Indri Muska - MIT
- */
- ;(function($){
-
-
- Zoomify = function (element, options) {
- var that = this;
-
- this._zooming = false;
- this._zoomed = false;
- this._timeout = null;
- this.$shadow = null;
- this.$image = $(element).addClass('zoomify');
- this.options = $.extend({}, Zoomify.DEFAULTS, this.$image.data(), options);
-
- this.$image.on('click', function () { that.zoom(); });
- $(window).on('resize', function () { that.reposition(); });
- $(document).on('scroll', function () { that.reposition(); });
- };
- Zoomify.DEFAULTS = {
- duration: 200,
- easing: 'linear',
- scale: 0.9
- };
-
-
- Zoomify.prototype.transition = function ($element, value) {
- $element.css({
- '-webkit-transition': value,
- '-moz-transition': value,
- '-ms-transition': value,
- '-o-transition': value,
- 'transition': value
- });
- };
- Zoomify.prototype.addTransition = function ($element) {
- this.transition($element, 'all ' + this.options.duration + 'ms ' + this.options.easing);
- };
- Zoomify.prototype.removeTransition = function ($element, callback) {
- var that = this;
-
- clearTimeout(this._timeout);
- this._timeout = setTimeout(function () {
- that.transition($element, '');
- if ($.isFunction(callback)) callback.call(that);
- }, this.options.duration);
- };
- Zoomify.prototype.transform = function (value) {
- this.$image.css({
- '-webkit-transform': value,
- '-moz-transform': value,
- '-ms-transform': value,
- '-o-transform': value,
- 'transform': value
- });
- };
- Zoomify.prototype.transformScaleAndTranslate = function (scale, translateX, translateY, callback) {
- this.addTransition(this.$image);
- this.transform('scale(' + scale + ') translate(' + translateX + 'px, ' + translateY + 'px)');
- this.removeTransition(this.$image, callback);
- };
-
-
- Zoomify.prototype.zoom = function () {
- if (this._zooming) return;
-
- if (this._zoomed) this.zoomOut();
- else this.zoomIn();
- };
- Zoomify.prototype.zoomIn = function () {
- var that = this,
- transform = this.$image.css('transform');
- this.$image.css("opacity",1)
- this.$image.css("height","auto")
- this.transition(this.$image, 'none');
- this.transform('none');
-
- var offset = this.$image.offset(),
- width = this.$image.outerWidth(),
- height = this.$image.outerHeight(),
- nWidth = this.$image[0].naturalWidth || +Infinity,
- nHeight = this.$image[0].naturalHeight || +Infinity,
- wWidth = $(window).width(),
- wHeight = $(window).height(),
- scaleX = Math.min(nWidth, wWidth * this.options.scale) / width,
- scaleY = Math.min(nHeight, wHeight * this.options.scale) / height,
- scale = Math.min(scaleX, scaleY),
- translateX = (-offset.left + (wWidth - width) / 2) / scale,
- translateY = (-offset.top + (wHeight - height) / 2 + $(document).scrollTop()) / scale;
-
- this.transform(transform);
-
- this._zooming = true;
- this.$image.addClass('zoomed').trigger('zoom-in.zoomify');
- setTimeout(function () {
- that.addShadow();
- that.transformScaleAndTranslate(scale, translateX, translateY, function () {
- that._zooming = false;
- that.$image.trigger('zoom-in-complete.zoomify');
- });
- that._zoomed = true;
- });
- };
- Zoomify.prototype.zoomOut = function () {
- var that = this;
- this.$image.css("opacity",0)
- this.$image.css("height","100%")
-
- this._zooming = true;
- this.$image.trigger('zoom-out.zoomify');
- this.transformScaleAndTranslate(1, 0, 0, function () {
- that._zooming = false;
- that.$image.removeClass('zoomed').trigger('zoom-out-complete.zoomify');
- });
- this.removeShadow();
- this._zoomed = false;
- };
-
-
- Zoomify.prototype.reposition = function () {
- if (this._zoomed) {
- this.transition(this.$image, 'none');
- this.zoomIn();
- }
- };
-
-
- Zoomify.prototype.addShadow = function () {
- var that = this;
- if (this._zoomed) return;
-
- if (that.$shadow) that.$shadow.remove();
- this.$shadow = $('<div class="zoomify-shadow"></div>');
- $('body').append(this.$shadow);
- this.addTransition(this.$shadow);
- this.$shadow.on('click', function () { that.zoomOut(); })
-
- setTimeout(function () { that.$shadow.addClass('zoomed'); }, 10);
- };
- Zoomify.prototype.removeShadow = function () {
- var that = this;
- if (!this.$shadow) return;
-
- this.addTransition(this.$shadow);
- this.$shadow.removeClass('zoomed');
- this.$image.one('zoom-out-complete.zoomify', function () {
- if (that.$shadow) that.$shadow.remove();
- that.$shadow = null;
- });
- };
-
-
- $.fn.zoomify = function (option) {
- return this.each(function () {
- var $this = $(this),
- zoomify = $this.data('zoomify');
-
- if (!zoomify) $this.data('zoomify', (zoomify = new Zoomify(this, typeof option == 'object' && option)));
- if (typeof option == 'string' && ['zoom', 'zoomIn', 'zoomOut', 'reposition'].indexOf(option) >= 0) zoomify[option]();
- });
- };
-
- })(jQuery);
|