javascript--鼠标拖拽窗口案例(鼠标按下,在鼠标移动过程中,盒子跟着一起移动,鼠标松开,盒子停止移动)
界面如图所示:

要求:在“信息注册”栏,按下鼠标,然后鼠标在页面移动,在鼠标移动过程中,该窗口跟着鼠标移动,当鼠标松开的时候,窗口停止移动。点击“关闭”,该窗口隐藏。
实现思路:
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,滚动条滚动距离的兼容性。以前的博文里面有记录,完整代码中也做了处理。
完整代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>鼠标拖拽案例</title> <style type="text/css">
*{
margin: 0px;
padding: 0px;
} .d-box{
width: 400px;
height: 300px;
border: 5px solid #eee;
box-shadow: 2px 2px 2px 2px #666;
position: absolute;
top: 40%;
left: 40%;
background-color: white;
} .hd{
height: 25px;
background-color: #7c9299;
color: white;
line-height: 25px;
cursor: move;
border-bottom: 1px solid #369;
}
#box_close{
float: right;
cursor: pointer;
}
</style>
</head>
<body>
<div id="d-box" class="d-box">
<div id="drop" class="hd">注册信息(可以拖拽)
<span id="box_close">【关闭】</span>
</div>
</div> <!-- 插入JS代码 -->
<script type="text/javascript">
/****************************盒子拖拽功能********************************/
//点击拖拽的“注册信息栏”,拖动整个盒子的移动。首先获得要拖拽的盒子
var box=document.getElementById('d-box');
var drop=document.getElementById('drop');
drop.onmousedown=function(e){
e = e || window.event;
//当鼠标按下的时候,获得鼠标在盒子中的位置
//鼠标在盒子中的位置=鼠标在页面中的位置-盒子在页面的位置
//鼠标在页面中的位置
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; //注册鼠标移动事件,因为鼠标按下后,在页面移动,盒子跟着移动
document.onmousemove=function(e){
e = e || window.event;
//鼠标在页面中移动时,求盒子的坐标
//鼠标移动时盒子移动位置=鼠标当前位置-鼠标在盒子中移动的距离
x=e.pageX || e.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
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;
//px一定不能忘
box.style.left=boxX+'px';
box.style.top=boxY+'px';
}
} //当鼠标弹起时,移出鼠标移动事件
drop.onmouseup=function(){
document.onmousemove=null;
} //点击关闭盒子,隐藏盒子
var box_close=document.getElementById('box_close');
box_close.onclick=function(){
box.style.display='none';
}
</script>
</body>
</html>
javascript--鼠标拖拽窗口案例(鼠标按下,在鼠标移动过程中,盒子跟着一起移动,鼠标松开,盒子停止移动)的更多相关文章
- javascript鼠标拖拽的那些事情
<html> <head> <title>javascript鼠标拖拽的那些事情</title> <meta http-equiv="C ...
- day50—JavaScript鼠标拖拽事件
转行学开发,代码100天——2018-05-05 今天通过鼠标拖拽事件复习巩固一下鼠标事件. 鼠标拖拽事件需要记住两点: 1.距离不变 2.鼠标事件(按下,移动,抬起) <div id=&quo ...
- JavaScript鼠标拖拽特效及相关问题总结
#div1{width:200px;height:200px;background:red;position:absolute;} #div2{width:200px;height:200px;bac ...
- js - 面向对象 - 小案例:轮播图、随机点名、选项卡、鼠标拖拽
面向对象 对象 : (黑盒子)不了解内部结构, 知道表面的各种操作. 面向对象 : 不了解原理的情况下 会使用功能 . 面向对象是一种通用思想,并非编程中能用,任何事情都能用. 编程语言的面向对象的特 ...
- 鼠标拖拽定位和DOM各种尺寸详解
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- CSharpGL(20)用unProject和Project实现鼠标拖拽图元
CSharpGL(20)用unProject和Project实现鼠标拖拽图元 效果图 例如,你可以把Big Dipper这个模型拽成下面这个样子. 配合旋转,还可以继续拖拽成这样. 当然,能拖拽的不只 ...
- JS Event 鼠标拖拽事件
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- 鼠标拖拽移动Java界面组件
默认的,Frame或者JFrame自身已经实现了鼠标拖拽标题栏移动窗口的功能. 只是,当你不满意java的JFrame样式,隐藏了标题栏和边框,又或者干脆直接使用JWindow,那你又该怎么实现鼠标拖 ...
- 完美实现鼠标拖拽事件,解决各种小bug,基于jquery
鼠标拖拽事件是web中使用频率极高的事件,之前写过的代码包括网上的代码,总存在各种各样的问题,包括拖拽体验差,松开鼠标后拖拽效果仍存在以及代码冗余过大等 本次我才用jQuery实现一个尽可能高效的拖拽 ...
随机推荐
- 【数据库】4.0 MySQL入门学习(四)——linux系统环境下MySQL安装
1.0 我的操作系统是CentOS Linux release 7.6.1810 (Core) 系统详细信息如下: Linux version 3.10.0-957.1.3.el7.x86_64 ( ...
- javascript的对象创建模式---命名空间模式
javascript中对象的概念是很普遍的,对象是是对象,数组是对象,函数也是对象,字符串其实也是对象.常见的对象创建方法有对象字面量.构造函数创建.我们先来看看对象的创建还有哪些更高级的模式. 一. ...
- arcengine自己做一个工具Tool放到工具箱中
// Copyright 2010 ESRI // // All rights reserved under the copyright laws of the United States // an ...
- event.cancelBubble=true
<tr><a href="xxx">连接</a></tr> 如上结构,单击tr的时候跳转至另一页面 <tr style=&qu ...
- Sql根据经纬度算出距离
SELECT ISNULL((2 * 6378.137 * ASIN(SQRT(POWER(SIN((117.223372- ISNULL(Latitude,0) )*PI()/360),2)+CO ...
- jdk是什么?jdk1.8安装配置方法
jdk是什么呢?jdk的是java development kit的缩写,意思是java程序开发的工具包.也可以说jdk是java的sdk. 目前的JDK大致分三个大版本:Java SE:Java P ...
- 实验:将系统进程映射移到 Python 字典中
参考官方文档,测试下列代码,把oracle的进程映射到python的字典中: [oracle@ycr python]$ more pro_get.py import reimport subproce ...
- Cloud Foundry Session Affinity(Sticky Session)的实现
会话保持(Session Affinity),有时又称粘滞会话(Sticky Sessions), 是负载均衡领域设计需要着力解决的重要问题之一,也是一个相对比较复杂的问题. 会话保持是指在负载均衡器 ...
- expected expression __bridge
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013020103/article/details/30491117 expected expres ...
- 20165322 2017-2018-2《Java程序设计》课程总结
20165322 2017-2018-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:我期望的师生关系 预备作业2:做中学learning by doing个人感想 预备作业 ...