界面如图所示:

要求:在“信息注册”栏,按下鼠标,然后鼠标在页面移动,在鼠标移动过程中,该窗口跟着鼠标移动,当鼠标松开的时候,窗口停止移动。点击“关闭”,该窗口隐藏。
实现思路:
1.页面结构分析:一个大盒子d-box来确定位置,里面放一个小盒子drop(存放“注册信息(可以拖拽”文字和span标签,span存放“关闭”,id为box_close),鼠标在drop中按下,移动时候d-box跟着移动。
2.实现分析:
2.1 获取鼠标在盒子中的位置。通过鼠标在页面中的位置-盒子在页面的位置实现
①鼠标在页面的位置实现代码:
var x=e.pageX || e.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
var y=e.pageY || e.clientY + (document.body.scrollTop || document.documentElement.scrollTop);
②盒子在页面中位置实现代码:
var box_x=box.offsetLeft;
var box_y=box.offsetTop;
③鼠标在盒子中的位置实现代码:
var mouse_in_box_x=x-box_x;
var mouse_in_box_y=y-box_y;
2.2 获取鼠标移动时盒子移动的位置。通过鼠标移动时,鼠标在页面的位置-鼠标在盒子中的位置实现。
①鼠标在页面的位置
var x=e.pageX || e.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
var y=e.pageY || e.clientY + (document.body.scrollTop || document.documentElement.scrollTop);
②鼠标移动时盒子移动的位置代码实现:
var boxX=x-mouse_in_box_x;
var boxY=y-mouse_in_box_y;
2.3 给盒子样式赋值
box.style.left=boxX+'px';
box.style.top=boxY+'px';
3.注意:
①要移动的盒子,其pisition必须赋值,absolute或者relative,必须使其脱离文档流才能移动
②给盒子样式赋值时,一定要注意不能丢掉px单位
③事件对象e,位置e.pageX,滚动条滚动距离的兼容性。以前的博文里面有记录,完整代码中也做了处理。
完整代码如下:
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="utf-8">
5 <title>鼠标拖拽案例</title>
6
7 <style type="text/css">
8 *{
9 margin: 0px;
10 padding: 0px;
11 }
12
13 .d-box{
14 width: 400px;
15 height: 300px;
16 border: 5px solid #eee;
17 box-shadow: 2px 2px 2px 2px #666;
18 position: absolute;
19 top: 40%;
20 left: 40%;
21 background-color: white;
22 }
23
24 .hd{
25 height: 25px;
26 background-color: #7c9299;
27 color: white;
28 line-height: 25px;
29 cursor: move;
30 border-bottom: 1px solid #369;
31 }
32 #box_close{
33 float: right;
34 cursor: pointer;
35 }
36 </style>
37 </head>
38 <body>
39 <div id="d-box" class="d-box">
40 <div id="drop" class="hd">注册信息(可以拖拽)
41 <span id="box_close">【关闭】</span>
42 </div>
43 </div>
44
45 <!-- 插入JS代码 -->
46 <script type="text/javascript">
47 /****************************盒子拖拽功能********************************/
48 //点击拖拽的“注册信息栏”,拖动整个盒子的移动。首先获得要拖拽的盒子
49 var box=document.getElementById('d-box');
50 var drop=document.getElementById('drop');
51 drop.onmousedown=function(e){
52 e = e || window.event;
53 //当鼠标按下的时候,获得鼠标在盒子中的位置
54 //鼠标在盒子中的位置=鼠标在页面中的位置-盒子在页面的位置
55 //鼠标在页面中的位置
56 var x=e.pageX || e.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
57 var y=e.pageY || e.clientY + (document.body.scrollTop || document.documentElement.scrollTop);
58
59 //盒子在页面中的位置
60 var box_x=box.offsetLeft;
61 var box_y=box.offsetTop;
62 //鼠标在盒子中的位置
63 var mouse_in_box_x=x-box_x;
64 var mouse_in_box_y=y-box_y;
65
66 //注册鼠标移动事件,因为鼠标按下后,在页面移动,盒子跟着移动
67 document.onmousemove=function(e){
68 e = e || window.event;
69 //鼠标在页面中移动时,求盒子的坐标
70 //鼠标移动时盒子移动位置=鼠标当前位置-鼠标在盒子中移动的距离
71 x=e.pageX || e.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
72 y=e.pageY || e.clientY + (document.body.scrollTop || document.documentElement.scrollTop);
73
74 var boxX=x-mouse_in_box_x;
75 var boxY=y-mouse_in_box_y;
76 //px一定不能忘
77 box.style.left=boxX+'px';
78 box.style.top=boxY+'px';
79 }
80 }
81
82 //当鼠标弹起时,移出鼠标移动事件
83 drop.onmouseup=function(){
84 document.onmousemove=null;
85 }
86
87 //点击关闭盒子,隐藏盒子
88 var box_close=document.getElementById('box_close');
89 box_close.onclick=function(){
90 box.style.display='none';
91 }
92 </script>
93 </body>
94 </html>
来源:https://www.cnblogs.com/WangYujie1994/p/10254182.html