将元素拖拽缩放功能代码封装为jquery插件
/**
*jquery插件编写
*元素拖拽,鼠标滚轮缩放比例
*by:xb
使用方法: $('#demoDiv').drag({
axis:'x',
wheel:true,
start: function () {
console.log('start后执行');
},
drag: function () {
console.log('move后执行');
},
stop:function(){
console.log('stop后执行');
}
});
**/
;
(function ($, window) {
function DragImg(ele, option) {
this.isdrag = false;
this.clicky = 0;
this.clickx = 0; //初始点击点
this.oDragObj = null; //操作对象
this.$element = ele;
this.defaults = {
axis: 'x,y',
wheel: false,
start: function () {},
drag: function () {},
stop: function () {} //操作完成后,用户自定义方法
};
this.options = $.extend({}, this.defaults, option);
this.disableSelect();
this.initBgDiv(); //底层图拖拽
if (option.wheel) {
this.initMouseWheel(); //底层图鼠标滚轮缩放
}
}
DragImg.prototype = {
constructor: DragImg,
initBgDiv: function () { //底层图拖拽
var self = this;
var bg_div = this.$element;
bg_div.on('mousedown', initDrag);
document.onmouseup = function (ev) {
self.options.stop.call(this, ev, this);
self.isdrag = false;
bg_div.onclick = null;
document.onmousemove = null;
};
var nTX = 0,
nTY = 0;
function initDrag(e) {
if (e.button == 0) {
self.isdrag = true;
nTY = parseInt(bg_div.css('top')); //运动开始时的位置
nTX = parseInt(bg_div.css('left'));
self.clickx = e.clientX;
self.clicky = e.clientY; //点击位置
document.onmousemove = moveMouse;
self.options.start.call(this, e, this);
return false;
}
}
function moveMouse(e) {
if (self.isdrag) { //初始位置+运动距离-点击时位置
var oevent = e || window.event;
var clientX = oevent.clientX,
clientY = oevent.clientY;
var moveX = nTX + clientX - self.clickx,
moveY = nTY + clientY - self.clicky;
if (self.options.axis.indexOf('x') != -1) {
bg_div.css('left', moveX);
}
if (self.options.axis.indexOf('y') != -1) {
bg_div.css('top', moveY);
}
self.options.drag.call(this, e, this);
return false;
}
}
},
initMouseWheel: function () { //底层图鼠标滚轮缩放
var bg_img = this.$element;
var mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel";
bg_img.on(mousewheelevt, onWheelZoom);
function onWheelZoom(e) {
zoom = bg_img.css('transform').split('(')[1].split(')')[0].split(',')[0] * 1; //缩放比例
var wheelDelta = event.wheelDelta ? (event.wheelDelta / 120) : (-event.detail / 3);
tZoom = zoom + (wheelDelta > 0 ? 0.1 : -0.1);
// console.log('tZoom: ', tZoom);
if (tZoom < 0.2 || tZoom > 1.5) {
return true;
}
bg_img.css({
"transform": "scale(" + tZoom + ',' + tZoom + ")",
'-moz-transform': 'scale(' + tZoom + ',' + tZoom + ')',
'-ms-transform': 'scale(' + tZoom + ',' + tZoom + ')'
});
e.stopPropagation();
return false;
}
},
disableSelect: function () {
this.$element.css({
'-webkit-touch-callout': 'none',
'-webkit-user-select': 'none',
'-khtml-user-select': 'none',
'-moz-user-select': 'none',
'-ms-user-select': 'none',
'user-select': 'none'
});
}
};
$.fn.extend({
drag: function (options) {
var dragImg = new DragImg(this, options);
return dragImg;
}
});
})(jQuery, window);