var dragObj = document.getElementById("test"); dragObj.style.left = "px"; dragObj.style.top = "px";var mouseX, mouseY, objX, objY; var dragging = false;dragObj.onmousedown = function (event) {event = event || window.event; dragging = true;dragObj.style.position = "relative";mouseX = event.clientX;mouseY = event.clientY;objX = parseInt(dragObj.style.left);objY = parseInt(dragObj.style.top); }document.onmousemove = function (event) {event = event || window.event;if (dragging) {dragObj.style.left = parseInt(event.clientX - mouseX + objX) + "px"; dragObj.style.top = parseInt(event.clientY - mouseY + objY) + "px";}}document.onmouseup = function () {dragging = false; }; (function (window, undefined) {var dom = { //绑定事件 on: function (node, eventName, handler) {if (node.addEventListener) { node.addEventListener(eventName, handler);}else { node.attachEvent("on" + eventName, handler);} }, //获取元素的样式 getStyle: function (node, styleName) {var realStyle = null;if (window.getComputedStyle) { realStyle = window.getComputedStyle(node, null)[styleName];}else if (node.currentStyle) { realStyle = node.currentStyle[styleName];}return realStyle; }, //获取设置元素的样式 setCss: function (node, css) {for (var key in css) { node.style[key] = css[key];} }};window.Drag = Drag; })(window, undefined);在一个拖拽操作中,存在着两个对象:被拖拽的对象和鼠标对象,我们定义了下面的两个对象以及它们对应的操作: function DragElement(node) { this.node = node;//被拖拽的元素节点 this.x = ;//拖拽之前的x坐标 this.y = ;//拖拽之前的y坐标}DragElement.prototype = { constructor: DragElement, init: function () { this.setEleCss({ "left": dom.getStyle(node, "left"), "top": dom.getStyle(node, "top")}).setXY(node.style.left, node.style.top); }, //设置当前的坐标 setXY: function (x, y) {this.x = parseInt(x) || ;this.y = parseInt(y) || ;return this; }, //设置元素节点的样式 setEleCss: function (css) {dom.setCss(this.node, css);return this; }}还有一个对象是鼠标,它主要包含x坐标和y坐标: function Mouse() { this.x = ; this.y = ;}Mouse.prototype.setXY = function (x, y) { this.x = parseInt(x); this.y = parseInt(y);}这是在拖拽操作中定义的两个对象。 ; (function (window, undefined) {var dom = { //绑定事件 on: function (node, eventName, handler) {if (node.addEventListener) { node.addEventListener(eventName, handler);}else { node.attachEvent("on" + eventName, handler);} }, //获取元素的样式 getStyle: function (node, styleName) {var realStyle = null;if (window.getComputedStyle) { realStyle = window.getComputedStyle(node, null)[styleName];}else if (node.currentStyle) { realStyle = node.currentStyle[styleName];}return realStyle; }, //获取设置元素的样式 setCss: function (node, css) {for (var key in css) { node.style[key] = css[key];} }};//#region 拖拽元素类function DragElement(node) { this.node = node; this.x = ; this.y = ;}DragElement.prototype = { constructor: DragElement, init: function () { this.setEleCss({ "left": dom.getStyle(node, "left"), "top": dom.getStyle(node, "top")}).setXY(node.style.left, node.style.top); }, setXY: function (x, y) {this.x = parseInt(x) || ;this.y = parseInt(y) || ;return this; }, setEleCss: function (css) {dom.setCss(this.node, css);return this; }}//#endregion//#region 鼠标元素function Mouse() { this.x = ; this.y = ;}Mouse.prototype.setXY = function (x, y) { this.x = parseInt(x); this.y = parseInt(y);}//#endregion//拖拽配置var draggableConfig = { zIndex: , draggingObj: null, mouse: new Mouse()};function Drag(ele) { this.ele = ele; function mouseDown(event) {var ele = event.target || event.srcElement;draggableConfig.mouse.setXY(event.clientX, event.clientY);draggableConfig.draggingObj = new DragElement(ele);draggableConfig.draggingObj .setXY(ele.style.left, ele.style.top) .setEleCss({"zIndex": draggableConfig.zIndex++,"position": "relative" }); } ele.onselectstart = function () {//防止拖拽对象内的文字被选中return false; } dom.on(ele, "mousedown", mouseDown);}dom.on(document, "mousemove", function (event) { if (draggableConfig.draggingObj) {var mouse = draggableConfig.mouse, draggingObj = draggableConfig.draggingObj;draggingObj.setEleCss({ "left": parseInt(event.clientX - mouse.x + draggingObj.x) + "px", "top": parseInt(event.clientY - mouse.y + draggingObj.y) + "px"}); }})dom.on(document, "mouseup", function (event) { draggableConfig.draggingObj = null;})window.Drag = Drag; })(window, undefined);调用方法:Drag(document.getElementById("obj"));
弹框的顶部是可以进行拖拽操作的,内容区域是不可拖拽的,怎么实现这样的效果呢:
首先优化拖拽元素对象如下,增加一个目标元素target,表示被拖拽对象,在上图的登录框中,就是整个登录窗口。
被记录和设置坐标的拖拽元素就是这个目标元素,但是它并不是整个部分都是拖拽的有效部分。我们在html结构中为拖拽的有效区域添加类draggable表示有效拖拽区域:
复制代码 代码如下:
<div id="obj" class="dialog" style="position:relative;left:px">
<div class="header draggable">
拖拽的有效元素
</div>
<div class="content">
拖拽对象
</div>
</div>
然后修改Drag方法如下:
function drag(ele) {var dragNode = (ele.querySelector(".draggable") || ele);dom.on(dragNode, "mousedown", function (event) { var dragElement = draggableConfig.dragElement = new DragElement(ele); draggableConfig.mouse.setXY(event.clientX, event.clientY); draggableConfig.dragElement.setXY(dragElement.target.style.left, dragElement.target.style.top).setTargetCss({ "zIndex": draggableConfig.zIndex++, "position": "relative"});}).on(dragNode, "mouseover", function () { dom.setCss(this, draggableStyle.dragging);}).on(dragNode, "mouseout", function () { dom.setCss(this, draggableStyle.defaults);}); }主要修改的是绑定mousedown的节点变成了包含draggable类的有效元素,如果不含有draggable,则整个元素都是有效元素。function move(event) { if (draggableConfig.dragElement) {var mouse = draggableConfig.mouse, dragElement = draggableConfig.dragElement;dragElement.setTargetCss({ "left": parseInt(event.clientX - mouse.x + dragElement.x) + "px", "top": parseInt(event.clientY - mouse.y + dragElement.y) + "px"}); dom.off(document, "mousemove", move);setTimeout(function () { dom.on(document, "mousemove", move);}, ); }}总结: ; (function ($, window, undefined) {//#region 拖拽元素类function DragElement(node) {this.target = node;node.onselectstart = function () {//防止拖拽对象内的文字被选中return false; }}DragElement.prototype = { constructor: DragElement, setXY: function (x, y) {this.x = parseInt(x) || ;this.y = parseInt(y) || ;return this; }, setTargetCss: function (css) {$(this.target).css(css);return this; }}//#endregion //#region 鼠标元素function Mouse() { this.x = ; this.y = ;}Mouse.prototype.setXY = function (x, y) { this.x = parseInt(x); this.y = parseInt(y);}//#endregion //拖拽配置var draggableConfig = { zIndex: , dragElement: null, mouse: new Mouse()}; var draggableStyle = { dragging: {cursor: "move" }, defaults: {cursor: "default" }} var $document = $(document); function drag($ele) { var $dragNode = $ele.find(".draggable"); $dragNode = $dragNode.length > ? $dragNode : $ele; $dragNode.on({"mousedown": function (event) { var dragElement = draggableConfig.dragElement = new DragElement($ele.get());draggableConfig.mouse.setXY(event.clientX, event.clientY); draggableConfig.dragElement.setXY(dragElement.target.style.left, dragElement.target.style.top).setTargetCss({ "zIndex": draggableConfig.zIndex++, "position": "relative"});},"mouseover": function () { $(this).css(draggableStyle.dragging);},"mouseout": function () { $(this).css(draggableStyle.defaults);} })} function move(event) { if (draggableConfig.dragElement) {var mouse = draggableConfig.mouse, dragElement = draggableConfig.dragElement;dragElement.setTargetCss({ "left": parseInt(event.clientX - mouse.x + dragElement.x) + "px", "top": parseInt(event.clientY - mouse.y + dragElement.y) + "px"}); $document.off("mousemove", move);setTimeout(function () { $document.on("mousemove", move);}, ); }} $document.on({ "mousemove": move, "mouseup": function () {draggableConfig.dragElement = null; }}); $.fn.drag = function (options) { drag(this);}})(jQuery, window, undefined)