简单的鼠标拖拽效果(原生js实现)

之前在聊天群里看到有人说面试的时候被问到了怎样实现一个拖拽效果,当时看到后在心里默默思考了下,结果发现好像我也写不出来啊。本着遇到一个解决一个的思想,就亲自敲了一个,看到张鑫旭大神写的代码,真的很厉害,多多学习了,(感觉随便搜一个关于前端方面的问题都能看到他的网站,真是太佩服了,写了那么多文章,十分感谢。)
好了,接下来就进入正题了。
想实现一个效果首先得明白其中的逻辑,知道了实现逻辑后,就可以码代码了。
首先我实现的效果是:

  1. 鼠标按下后,才可以执行后续效果
  2. 鼠标已经按下,然后鼠标移动,需要拖拽的元素跟着一起移动
  3. 鼠标松开,然后停止移动

大步骤就是这样一个过程,其实对应的就是三个事件:

  1. onmousedown
  2. onmousemove
  3. onmouseup

然后我们来看这三个事件发生时分别作做什么事。

当鼠标按下时,我们得记录当前元素的位置newSite。同时设置一个标记,用于表示此时鼠标时按下的状态,方便鼠标移动事件的执行。
当鼠标松开时,我们要将标记改变,说明此时鼠标松开了,当鼠标移动时就不能再移动元素了。
当鼠标按下并且移动时,我们就要记录鼠标每次移动的位置currentSite,currentSite和newSite的差值就是鼠标移动的距离,同时也是元素应该移动的距离,然后设置元素的位置就OK了。

当然有个很重要的点就是需要移动的元素的position属性应该设为absolute或者relative,这样元素才可以移动。
同时,如果该元素内部有可能导致浏览器默认事件发生的元素时,要阻止默认事件的发生,例如里面有一个图片时,点击拖动的时候浏览器会默认弹出一个新窗口显示该图片,这时我们应该阻止这个事件的发生。具体方式可以查看代码。

具体演示可查看:http://www.w3cfuns.com/notes/19044/b3c57594c1f1b220f1a102d4e9147828.html

 1 // 参数列表
 2 var params = {
 3     left: 0,
 4     top: 0,
 5     currentX: 0,
 6     currentY: 0,
 7     flag: false
 8 };
 9 //获取相关CSS属性
10 var getCss = function(o, key) {
11     // getComputedStyle是为了兼容FF浏览器
12     return o.currentStyle ? o.currentStyle[key] : document.defaultView.getComputedStyle(o, false)[key];
13 };
14
15 //拖拽的实现
16 var startDrag = function(target, callback) {
17     // 首先获取目标元素的left、top属性值
18     if (getCss(target, "left") !== "auto") {
19         params.left = getCss(target, "left");
20     }
21     if (getCss(target, "top") !== "auto") {
22         params.top = getCss(target, "top");
23     }
24
25     target.onmousedown = function(event) {
26         // 当鼠标按下时表示元素可以移动,将标记设为true;
27         params.flag = true;
28
29         /*为了阻止拖动浏览器中元素时发生默认事件,
30         例如拖动图片时会出现一个新窗口显示该图片,下面代码可以阻止这种事件发生
31         */
32         if (event.preventDefault) {
33             event.preventDefault();
34         }else {
35             event.returnValue = false;
36         }
37
38         var e = event;
39         params.currentX = e.clientX;
40         params.currentY = e.clientY;
41     };
42     target.onmouseup = function() {
43         // 当鼠标松开时将标记设为false,表示不可移动
44         params.flag = false;
45         // 当鼠标松开时再次更新元素的位置
46         if (getCss(target, "left") !== "auto") {
47             params.left = getCss(target, "left");
48         }
49         if (getCss(target, "top") !== "auto") {
50             params.top = getCss(target, "top");
51         }
52     };
53     target.onmousemove = function(event) {
54         var e = event ? event : window.event;
55         /*当params.flag==true时才可以移动,表明此时鼠标时按下状态
56         */
57         if (params.flag) {
58             // 获取到当前鼠标的位置
59             var nowX = e.clientX,
60                 nowY = e.clientY;
61             // 获取当前鼠标移动的距离,即当前鼠标位置减去初始位置
62             var disX = nowX - params.currentX,
63                 disY = nowY - params.currentY;
64             // 将元素的位置更新,parsenInt为了将属性值变为数字类型
65             target.style.left = parseInt(params.left) + disX + "px";
66             target.style.top = parseInt(params.top) + disY + "px";
67         }
68     }
69 };

时间: 2024-12-10 12:05:46

简单的鼠标拖拽效果(原生js实现)的相关文章

jquery鼠标拖拽效果分享

//html代码部分 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="../js/jquery-1.11.1.js"></script> </head> <style> body

js 鼠标拖拽效果实现

效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>速表拖拽效果实现</title> <style> *{ margin: 0; padding: 0; } .toolbar{ height: 30px; text-align: left; padding-left: 20px;

JS实现鼠标拖拽效果以及放大缩小

要求:拖拽的子元素不能走出父元素,大小不能超过父元素,放大/缩小时阻止冒泡事件 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style> *{margin: 0;padding: 0;} .box1{border: 10px solid #000;width: 400px;height: 400px;posi

鼠标拖拽效果

1 <div id="div3"> 2 </div> 3 <script type="text/javascript"> 4 5 6 div3.onmousedown= function(e){ 7 var arr =[]; 8 arr[0] =[div3.offsetLeft,div3.offsetTop];//记录第一次点击的值; 9 var x = e.offsetX;//获取元素鼠标点击坐标 10 var y = e.of

简单的鼠标拖拽

<!doctype html><html> <head>    <meta charset="utf-8" />    <title></title>    <style type="text/css">                *{margin:0;padding:0;}        #box {            width: 100px;            he

JavaScript鼠标拖拽特效及相关问题总结

#div1{width:200px;height:200px;background:red;position:absolute;} #div2{width:200px;height:200px;background:green;position:absolute;left:300px;} <div id="div1">原来的 普通拖拽</div> <div id="div2">继承的 限制范围拖拽</div> wind

React.js实现原生js拖拽效果及思考

一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖拽效果. 首先,其实拖拽效果的思路是很简单的.主要就是三个步骤: 1.onmousedown的时候,启动可拖拽事件,记录被拖拽元素的原始坐标参数. 2.onmousemove的时候,实时记录鼠标移动的距离,结合被拖拽元素第一阶段的坐标参数,计算并设置新的坐标值. 3.onmouseup的时候,关闭可拖拽事件

js实现鼠标的拖拽效果

拖拽效果在我们上网的过程中是很常见的,大家都应该在电脑上面登陆过qq吧,当这个qq的登陆框弹出来的时候,我们是可以进行拖动的.这就是一个拖拽效果 这是我在慕课网上面看到的,我直接拿过来了,地址http://www.imooc.com/learn/60 这个视频讲的蛮好的,一清二楚,不懂的可以去看看. 首先,理清楚一下总体的思路. 第一步:当鼠标按下弹出框某个区域的时候,可以进行拖拽 第二步:弹出框拖拽进行中 第三部:鼠标松开,弹出框拖动到了某个位置. 先上源代码.这个是慕课网的老师提供的 . <

JS 鼠标事件练习—拖拽效果

拖拽效果 HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>拖拽效果</title> <link rel="stylesheet" type="text/css" href="拖拽效果.css"> </head> <body> <div