123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- /**
- * 图片预览组件
- * varstion 0.4.0
- * by Houfeng
- * Houfeng@DCloud.io
- */
- (function($, document) {
- $.init({
- gestureConfig: {
- tap: true, //默认为true
- doubletap: true, //默认为false
- longtap: true, //默认为false
- swipe: true, //默认为true
- drag: true, //默认为true
- hold: true, //默认为false,不监听
- release: true //默认为false,不监听
- }
- });
- var touchSupport = ('ontouchstart' in document);
- var tapEventName = touchSupport ? 'tap' : 'click';
- var enterEventName = touchSupport ? 'tap' : 'click';
- var imageClassName = $.className('image');
- //创建DOM (此函数是否可放在 mui.js 中)
- $.dom = function(str) {
- if (!$.__create_dom_div__) {
- $.__create_dom_div__ = document.createElement('div');
- }
- $.__create_dom_div__.innerHTML = str;
- return $.__create_dom_div__.childNodes;
- };
- //图片预览组件类
- var ImageViewer = $.ImageViewer = $.Class.extend({
- //构造函数
- init: function(selector, options) {
- var self = this;
- self.options = options || {};
- self.selector = selector || 'img';
- if (self.options.dbl) {
- enterEventName = touchSupport ? 'doubletap' : 'dblclick';
- }
- self.findAllImage();
- self.createViewer();
- self.bindEvent();
- },
- //创建图片预览组件的整体 UI
- createViewer: function() {
- var self = this;
- self.viewer = $.dom("<div class='mui-imageviewer'><div class='mui-imageviewer-mask'></div><div class='mui-imageviewer-header'><i class='mui-icon mui-icon-closeempty mui-imageviewer-close'></i><span class='mui-imageviewer-state'></span></div><i class='mui-icon mui-icon-arrowleft mui-imageviewer-left'></i><i class='mui-icon mui-icon-arrowright mui-imageviewer-right'></i></div>");
- self.viewer = self.viewer[0] || self.viewer;
- //self.viewer.style.height = screen.height;
- self.closeButton = self.viewer.querySelector('.mui-imageviewer-close');
- self.state = self.viewer.querySelector('.mui-imageviewer-state');
- self.leftButton = self.viewer.querySelector('.mui-imageviewer-left');
- self.rightButton = self.viewer.querySelector('.mui-imageviewer-right');
- self.mask = self.viewer.querySelector('.mui-imageviewer-mask');
- document.body.appendChild(self.viewer);
- },
- //查找所有符合的图片
- findAllImage: function() {
- var self = this;
- self.images = [].slice.call($(self.selector));
- },
- //检查图片是否为启动预览的图片
- checkImage: function(target) {
- var self = this;
- if (target.tagName !== 'IMG') return false;
- return self.images.some(function(image) {
- return image == target;
- });
- },
- //绑定事件
- bindEvent: function() {
- var self = this;
- //绑定图片 tap 事件
- document.addEventListener(enterEventName, function(event) {
- if (!self.viewer) return;
- var target = event.target;
- if (!self.checkImage(target)) return;
- self.viewer.style.display = 'block';
- setTimeout(function() {
- self.viewer.style.opacity = 1;
- }, 0);
- self.index = self.images.indexOf(target);
- self.currentItem = self.createImage(self.index);
- }, false);
- //关系按钮事件
- self.closeButton.addEventListener(tapEventName, function(event) {
- self.viewer.style.opacity = 0;
- setTimeout(function() {
- self.viewer.style.display = 'none';
- self.disposeImage(true);
- }, 600);
- event.preventDefault();
- event.cancelBubble = true;
- }, false);
- //处理左右按钮
- self.leftButton.addEventListener(tapEventName, function() {
- self.prev();
- }, false);
- self.rightButton.addEventListener(tapEventName, function() {
- self.next();
- }, false);
- //处理划动
- self.mask.addEventListener($.EVENT_MOVE, function(event) {
- event.preventDefault();
- event.cancelBubble = true;
- }, false);
- self.viewer.addEventListener('swipeleft', function(event) {
- if (self.scaleValue == 1) self.next();
- event.preventDefault();
- event.cancelBubble = true;
- }, false);
- self.viewer.addEventListener('swiperight', function(event) {
- if (self.scaleValue == 1) self.prev();
- event.preventDefault();
- event.cancelBubble = true;
- }, false);
- //处理缩放开始
- self.viewer.addEventListener($.EVENT_START, function(event) {
- var touches = event.touches;
- if (touches.length == 2) {
- var p1 = touches[0];
- var p2 = touches[1];
- var x = p1.pageX - p2.pageX; //x1-x2
- var y = p1.pageY - p2.pageY; //y1-y2
- self.scaleStart = Math.sqrt(x * x + y * y);
- self.isMultiTouch = true;
- } else if (touches.length = 1) {
- self.dragStart = touches[0];
- }
- }, false);
- self.viewer.addEventListener($.EVENT_MOVE, function(event) {
- var img = self.currentItem.querySelector('img');
- var touches = event.changedTouches;
- if (touches.length == 2) {
- event.preventDefault();
- event.cancelBubble = true;
- var p1 = touches[0];
- var p2 = touches[1];
- var x = p1.pageX - p2.pageX;
- var y = p1.pageY - p2.pageY;
- self.scaleEnd = Math.sqrt(x * x + y * y);
- self._scaleValue = (self.scaleValue * (self.scaleEnd / self.scaleStart));
- //self.state.innerText = self._scaleValue;
- img.style.webkitTransform = "scale(" + self._scaleValue + "," + self._scaleValue + ") "; // + " translate(" + self.dragX || 0 + "px," + self.dragY || 0 + "px)";
- } else if (!self.isMultiTouch && touches.length == 1 && self.scaleValue != 1) {
- event.preventDefault();
- event.cancelBubble = true;
- self.dragEnd = touches[0];
- self._dragX = self.dragX + (self.dragEnd.pageX - self.dragStart.pageX);
- self._dragY = self.dragY + (self.dragEnd.pageY - self.dragStart.pageY);
- img.style.marginLeft = self._dragX + 'px';
- img.style.marginTop = self._dragY + 'px';
- //img.style.transform = "translate(" + self._dragX + "px," + self._dragY + "px) " + " scale(" + self.scaleValue || 1 + "," + self.scaleValue || 1 + ")";
- }
- }, false);
- self.viewer.addEventListener($.EVENT_END, function() {
- self.scaleValue = self._scaleValue || self.scaleValue;
- self._scaleValue = null;
- self.dragX = self._dragX;
- self.dragY = self._dragY;
- self._dragX = null;
- self._dragY = null;
- var touches = event.touches;
- self.isMultiTouch = (touches.length != 0);
- });
- // doubletap 好像不能用
- self.viewer.addEventListener('doubletap', function() {
- var img = self.currentItem.querySelector('img');
- if (self.scaleValue === 1) {
- self.scaleValue = 2;
- } else {
- self.scaleValue = 1;
- }
- self.dragX = 0;
- self.dragY = 0;
- img.style.marginLeft = self.dragX + 'px';
- img.style.marginTop = self.dragY + 'px';
- img.style.webkitTransform = "scale(" + self.scaleValue + "," + self.scaleValue + ") "; //+ " translate(" + self.dragX || 0 + "px," + self.dragY || 0 + "px)";
- self.viewer.__tap_num = 0;
- }, false);
- //处理缩放结束
- },
- //下一张图片
- next: function() {
- var self = this;
- self.mask.style.display = 'block';
- self.index++;
- var newItem = self.createImage(self.index, 'right');
- setTimeout(function() {
- self.currentItem.classList.remove('mui-imageviewer-item-center');
- self.currentItem.classList.add('mui-imageviewer-item-left');
- newItem.classList.remove('mui-imageviewer-item-right');
- newItem.classList.add('mui-imageviewer-item-center');
- self.oldItem = self.currentItem;
- self.currentItem = newItem;
- // TODO: 临时,稍候将调整
- setTimeout(function() {
- self.disposeImage();
- self.mask.style.display = 'none';
- }, 600);
- }, 25);
- },
- //上一张图片
- prev: function() {
- var self = this;
- self.mask.style.display = 'block';
- self.index--;
- var newItem = self.createImage(self.index, 'left');
- setTimeout(function() {
- self.currentItem.classList.remove('mui-imageviewer-item-center');
- self.currentItem.classList.add('mui-imageviewer-item-right');
- newItem.classList.remove('mui-imageviewer-item-left');
- newItem.classList.add('mui-imageviewer-item-center');
- self.oldItem = self.currentItem;
- self.currentItem = newItem;
- // TODO: 临时,稍候将调整
- setTimeout(function() {
- self.disposeImage();
- self.mask.style.display = 'none';
- }, 600);
- }, 25);
- },
- //释放不显示的图片
- disposeImage: function(all) {
- var sel = '.mui-imageviewer-item-left,.mui-imageviewer-item-right';
- if (all) sel += ",.mui-imageviewer-item";
- var willdisposes = $(sel);
- willdisposes.each(function(i, item) {
- if (item.parentNode && item.parentNode.removeChild)
- item.parentNode.removeChild(item, true);
- });
- },
- //创建一个图片
- createImage: function(index, type) {
- var self = this;
- type = type || 'center';
- if (index < 0) index = self.images.length - 1;
- if (index > self.images.length - 1) index = 0;
- self.index = index;
- var item = $.dom("<div class='mui-imageviewer-item'></div>")[0];
- item.appendChild($.dom('<span><img src="' + self.images[self.index].src + '"/></span>')[0]);
- item.classList.add('mui-imageviewer-item-' + type);
- self.viewer.appendChild(item);
- self.state.innerText = (self.index + 1) + "/" + self.images.length;
- //重置初始缩放比例
- self.scaleValue = 1;
- self.dragX = 0;
- self.dragY = 0;
- return item;
- }
- });
- $.imageViewer = function(selector, options) {
- return new ImageViewer(selector, options);
- };
- $.ready(function() {
- $.imageViewer('.' + imageClassName);
- });
- }(mui, document));
|