/** @ Name:layui.dragMove 图片查看器 @ Author:FQSong @ License:MIT */ layui.define('layer', function(exports){ var $ = layui.$ ,layer = layui.layer //字符常量 ,MOD_NAME = 'dragMove', ELEM = '.layui-dragMove' //外部接口 ,dragMove = { index: layui.dragMove ? (layui.dragMove.index + 10000) : 0 //设置全局项 ,set: function(options){ var that = this; that.config = $.extend({}, that.config, options); return that; } //事件监听 ,on: function(events, callback){ return layui.onevent.call(this, MOD_NAME, events, callback); } } //构造器 ,Class = function(options){ var that = this; that.index = ++dragMove.index; that.config = $.extend({}, that.config, dragMove.config, options); that.render(); }; //默认配置 Class.prototype.config = { layerArea: ["960px","720px"], layerShade: 0.6, layerMove: 0, maxZoom: 1 }; //渲染视图 Class.prototype.render = function(){ var that = this ,options = that.config ,dragMoveView = "
" + "
" + "" + "
" + "
" + "" + "" + "" + "" + "
" + "
"; options.elem = $(options.elem); options.elem.on("click","img",function(e){ let imgObj = $(this), imgSrc = imgObj.attr("src"), imgTitle = imgObj.attr("alt") || imgSrc.replace(/(.*\/)*([^.]+).*/ig,"$2"); layer.open({ type: 1, resize: 0, btn: 0, skin: "dragMove-skin", move: options.layerMove, area: options.layerArea, shade: options.layerShade, title: imgTitle, content: dragMoveView, success: function(layero){ var imgbox = layero.find(".dragMove-img"); options.imgboxWidth = imgbox.innerWidth(); options.imgboxHeight = imgbox.innerHeight(); var nImg = new Image(); nImg.src = imgSrc; if (nImg.complete) { imgbox.empty().append(nImg); that.init(nImg) } else { nImg.onload = function () { imgbox.empty().append(nImg); that.init(nImg) } } } }); }); } // Class.prototype.init = function(img){ var that = this ,options = that.config; let $img = $(img), parent = $img.closest(".layui-dragMove"), zoomData = {}; zoomData.img = img; zoomData.imgWidth = img.width; zoomData.imgHeight = img.height; zoomData.zoomSize = Math.min(Math.min(options.imgboxWidth / zoomData.imgWidth, options.imgboxHeight / zoomData.imgHeight), 1); zoomData.left = (options.imgboxWidth - zoomData.imgWidth * zoomData.zoomSize) / 2; zoomData.top = (options.imgboxHeight - zoomData.imgHeight * zoomData.zoomSize) / 2; zoomData.defaultZoom = zoomData.zoomSize; that.zoomData = zoomData; $img.css({ "transform-origin": "0 0", "transform": "matrix(" + zoomData.zoomSize + ",0,0," + zoomData.zoomSize + "," + zoomData.left + "," + zoomData.top + ")" }); $img.on("mousedown", function (e) { e.preventDefault(); let currentX = e.clientX, currentY = e.clientY; $img.removeClass("transitioning").css({"cursor": "grabbing"}); $(document).on("mousemove", function (even) { let moveX = even.clientX - currentX, moveY = even.clientY - currentY; $img.css({ "transform": "matrix(" + zoomData.zoomSize + ",0,0," + zoomData.zoomSize + "," + (zoomData.left + moveX) + "," + (zoomData.top + moveY) + ")" }); }); $(document).on("mouseup", function (even) { var matrix = $img.css("transform").slice(7, -1).split(','), center = that.getCenter(parseFloat(matrix[4]), parseFloat(matrix[5]), zoomData); zoomData.left = center.left; zoomData.top = center.top; $img.addClass("transitioning").css({ "transform": "matrix(" + zoomData.zoomSize + ",0,0," + zoomData.zoomSize + "," + zoomData.left + "," + zoomData.top + ")", "cursor": "grab" }); $(document).off("mousemove"); $(document).off("mouseup"); }); }); parent.on("click", "button", function (e) { e.preventDefault(); var method = $(this).attr("data-method"), scaleSize = 0; switch (method) { case "default": scaleSize = zoomData.defaultZoom; break; case "real": scaleSize = 1; break; case "zoomin": scaleSize = zoomData.zoomSize * 1.2; scaleSize = scaleSize > options.maxZoom ? options.maxZoom : scaleSize; break; case "zoomout": scaleSize = zoomData.zoomSize / 1.2; scaleSize = scaleSize < zoomData.defaultZoom ? zoomData.defaultZoom : scaleSize; break; default: break; } scaleSize && that.scaleZoom(scaleSize); }); //鼠标滚轮 parent.on("mousewheel", function (e) { e.preventDefault(); let scaleSize = 0; if (e.originalEvent.wheelDelta > 0) { scaleSize = zoomData.zoomSize * 1.2; } else { scaleSize = zoomData.zoomSize / 1.2; } scaleSize = Math.min(Math.max(scaleSize, zoomData.defaultZoom),options.maxZoom); that.scaleZoom(scaleSize); }); $img.on("transitionend webkitTransitionend", function () { $(this).removeClass("transitioning") }); }; Class.prototype.scaleZoom = function(index){ var that = this ,options = that.config ,zoomData = that.zoomData; zoomData.left = zoomData.left - zoomData.imgWidth * (index - zoomData.zoomSize) / 2; zoomData.top = zoomData.top - zoomData.imgHeight * (index - zoomData.zoomSize) / 2; zoomData.zoomSize = index; var center = that.getCenter(zoomData.left,zoomData.top,zoomData); zoomData.left = center.left; zoomData.top = center.top; $(zoomData.img).addClass("transitioning").css({ "transform":"matrix("+ zoomData.zoomSize +",0,0," + zoomData.zoomSize +","+zoomData.left+","+zoomData.top+")" }); }; Class.prototype.getCenter = function(x,y,zoomData){ var that = this ,options = that.config ,zoomData = that.zoomData; let newleft,newtop; newleft = (function(){ var left; if(zoomData.imgWidth * zoomData.zoomSize < options.imgboxWidth){ left = (options.imgboxWidth - zoomData.imgWidth * zoomData.zoomSize) / 2; }else{ left = Math.max(Math.min(0,x), options.imgboxWidth - zoomData.imgWidth * zoomData.zoomSize); } return left; })(); newtop = (function(){ var top; if(zoomData.imgHeight * zoomData.zoomSize < options.imgboxHeight){ top = (options.imgboxHeight - zoomData.imgHeight * zoomData.zoomSize) / 2; }else{ top = Math.max(Math.min(0, y), options.imgboxHeight - zoomData.imgHeight * zoomData.zoomSize); } return top; })(); return {left:newleft,top:newtop} }; Class.prototype.decimal = function(num){ var result = parseFloat(num); if (isNaN(result)) { return false; } result = Math.round(num * 100) / 100; return result; }; //核心入口 dragMove.render = function(options){ var ins = new Class(options); return ins; }; //加载组件所需样式 layui.link(layui.cache.base + 'dragMove/dragMove.css', function(){ //样式加载完毕的回调 }, MOD_NAME); exports(MOD_NAME, dragMove); });