JavaScript 实现鼠标拖动元素实例代码 |
本文标签:JavaScript,鼠标,拖动 一、前言 最开始实现鼠标拖动元素的目的就是在一个页面上拖动很多小圆点,用于固定定位,然后在复制HTML,粘贴在页面的开发代码中,就是这么一个功能,实现了很多遍,都没有做好,不得已采用了jQuery.fn.draggable插件,在接触一些资料和别人的思路,今天终于把这个拖动功能给完善了,下面就来看看它的实现 在拖动元素上绑定鼠标按下事件,在文档对象中绑定鼠标移动,鼠标弹起事件; 复制代码 代码如下: $target.bind(mousedown, fn); $(document) 三、源码实现细节 在实现源码中有很多需要值得注意的地方: 1、首先在鼠标按下事件中,当单击拖动元素中,可能会选择区域文字,这并不是我们所需要的,解决方法如下: 复制代码 代码如下: // 阻止区域文字被选中 for chrome firefox ie9 e.preventDefault(); // for firefox ie9 || less than ie9 window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); 2、如果拖动元素是图片(img标签),鼠标在拖动图片一小段距离,会出现一个禁止的小提示,即:图片不能再拖动, 复制代码 代码如下: e.preventDefault(); 3、关于边界(处理拖动范围)的问题 一开始实现的代码如下: 复制代码 代码如下: // x,y代表拖动元素将要设置的left,top值,limitObj为拖动区域范围对象,测试时就发现问题, // 在拖动过程中,拖动对象有时不能直接靠近边界 if ( x >= limitObj._left && x <= limitObj._right ) { 进一步思考:为什么会出现上面问题,原因在于变量x可能会小于limitObj._left或大于limitObj._right,变量y同理, 复制代码 代码如下: if (x < limitObj._left) { x = limitObj._left; } if (x > limitObj._right) { x = limitObj._right; } if (y < limitObj._top) { y = limitObj._top; } if (y > limitObj._bottom) { y = limitObj._bottom; } $target.css({ left: x + px, top: y + px }); 终于解决了这个问题,但是cloudgamer给出了更好的写法: 复制代码 代码如下: $target.css({ left: Math.max( Math.min(x, limitObj._right), limitObj._left) + px, top: Math.max( Math.min(y, limitObj._bottom), limitObj._top) + px }); 完整程序源码: 复制代码 代码如下: $.fn.extend({ /** * Autor: 博客园华子yjh 2014/02/21 */ drag: function(options) { var dragStart, dragMove, dragEnd, $boundaryElem, limitObj; function _initOptions() { defaultOptions = { // 默认配置项 dragStart = options.dragStart || noop, function _drag(e) { limitObj = { // 鼠标移动事件处理 dragMove.apply(self, arguments); // 鼠标弹起事件处理 _initOptions(); // 初始化配置对象 $(this) 实例调用: 复制代码 代码如下: // 调用实例 (function(){ $(.drag-elem).drag({ boundaryElem: #boundary, dragStart: function(){ $(this).html(<span>准备拖动</span>).css({ zIndex: 2 }).siblings().css({ zIndex: 1 }); }, dragMove: function(){ var pos = $(this).position(); $(this).html(<span>拖动中( + pos.left + , + pos.top + )</span> ); }, dragEnd : function(){ $(this).html(<span>拖动结束</span>); } }); }()); |