分析逻辑关于该过程有一下3个动作

1、点击 2、移动 3、释放鼠标

1、点击时获得点击下去的一点的坐标(盒子的top,left),去除默认事件。

2、移动时不断改变盒子的坐标。(移动的dom目标应该为document不然容易被甩出去)。

3、鼠标释放。清除document的时间。还有改变位置。

4、注意如果鼠标在点击目标时速度太快离开了目标,要马上纠正。

写了个简单的方法:

<style type="text/css">
*{margin: 0; padding: 0;}
#box{width: 300px; height: 200px; border:1px solid #999; position: fixed; top: 20px; left: 20px;}
#header{width: 100%; height: 50px; background-color: #999;}
</style>
<body>
<div id="box">
<div id="header"></div>
<div>
<p>2222222222222222222222222222222121212121212</p>
<p>2222222222222222222222222222222121212121212</p>
<p>2222222222222222222222222222222121212121212</p>
<p>2222222222222222222222222222222121212121212</p>
<p>2222222222222222222222222222222121212121212</p>
</div>
</div>
<script type="text/javascript">
var box = document.getElementById('box');
var header = document.getElementById('header');
new fnDrag(header,box);
</script>

 

这是我简单分装的一个方法:

/**
*
用于拖拽
*
@method fnDrag
*
@param {DOM} select 点击可触发拖拽的区域
*
@param {DOM} container 移动的区域
*
created by toMatthew on 17/11/27.
*
usage new fnDrag(header, container);
*
*/
;(function(win, document){
// 公用方法开始
// 返回元素位置
function toBoxPosition(dom, x, y) {
var moveBox = dom.getBoundingClientRect();///包围盒的信息
return {x: parseInt(x - moveBox.left), y: parseInt(y - moveBox.top) };
} var fnDrag = function(select, container) {
var self = this;
self.select = select;
self.container = container;
self.isMouseDown = false;
self.point = {x:0,y:0}; self.getPosition = function(e) {
if(self.isMouseDown) {
self.container.style.top = parseInt(e.clientY - self.point.y)+'px';
self.container.style.left = parseInt(e.clientX - self.point.x)+'px';
}
} self.bodyMove = function(e) {
e.preventDefault();
self.getPosition(e);
} self.fnClear = function(e) {
document.removeEventListener('mousemove', self.bodyMove);
document.removeEventListener('mouseup', self.fnMouseUp);
self.select.removeEventListener('mouseout', self.bodyMove);
self.select.removeEventListener('mouseup', self.fnMouseUp);
} self.fnMouseUp = function(e) {
if(self.isMouseDown) {
e.preventDefault();
self.isMouseDown = false;
self.fnClear(e);
}
} // 监听select区域点击
self.select.addEventListener('mousedown', function(e) {
e.preventDefault();//阻止默认事件,取消文字选中
self.isMouseDown = true;
self.point = toBoxPosition(self.container, e.clientX , e.clientY); // 监听body移动
document.addEventListener('mousemove', self.bodyMove, false); // 移出select区域
self.select.addEventListener('mouseout', self.bodyMove, false); // 鼠标抬起
self.select.addEventListener('mouseup', self.fnMouseUp, false);
document.addEventListener('mouseup', self.fnMouseUp, false); }, false);
} win.fnDrag = fnDrag;
})(window, document);

  

div拖拽的更多相关文章

  1. 实现Div拖拽

    直观的理解div拖拽:当鼠标对着可拖拽部分按住后并拖动,div会跟着鼠标一起运动,并且其运动空间限制在浏览器内部,当放开鼠标时,则div停止运动. 实现div拖拽需要三个重要的事件: (1)onmou ...

  2. html之div拖拽,html5拖拽

    html之div拖拽 http://www.w3school.com.cn/html5/html_5_draganddrop.asp

  3. 运用DIV拖拽实现resize和碰撞检测

    运用DIV拖拽实现resize和碰撞检测 Div由拖拽改变大小 演示demo 当我们运用html元素"textarea"写一个文本输入框时,浏览器会自动生成以下样式 用鼠标拖动右下 ...

  4. 纯js实现DIV拖拽

    写代码的时候遇到需要对绝对布局的div进行拖拽的功能,起初为了省事直接在网上扒拉了一番,看到大神张鑫旭的一篇文章<JavaScript实现最简单的拖拽效果>,便直接拿来使用(膜拜大神).但 ...

  5. 案例:简易的Div拖拽

    案例:简易的Div拖拽 鼠标移入Div区域后,按下鼠标左键,可以拖动Div移动;松开鼠标左键,Div拖动停止.同时要求Div不能拖出屏幕显示区域外. 拖拽原理:距离不变.三个事件(onmousedow ...

  6. html --- javascript --- div --- 拖拽方块

    当鼠标拖拽的很快时,光标会走出方块,所以把事件注册在了方块的父节点上, 如有疑问请参照:http://blog.csdn.net/a9529lty/article/details/2708171 使用 ...

  7. 原生js实现div拖拽+按下鼠标计时

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> ...

  8. 原生js实现div拖拽

    十分简单的效果. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  9. div拖拽缩放jquery插件编写——带8个控制点

    项目中需要对div进行拖拽缩放,需要有控制面板8个控制点的那种,原以为这么常见的效果应该能搜索到很多相关插件,然而可以完成拖拽的实繁,却找不到我想要的,还是自己动手丰衣足食吧 效果预览(只支持pc端) ...

  10. jquery实现div拖拽

    1.引入jquery1.8.3 ,模块拖拽js代码: //模块拖拽 $(function(){ var _move=false;//移动标记 var _x,_y;//鼠标离控件左上角的相对位置 $(& ...

随机推荐

  1. Spring AOP 面向切面的Spring

    定义AOP术语 描述切面的常用术语有: 通知 (advice) 切点 (pointcut) 连接点 (joinpoint) 下图展示了这些概念是如何关联的 Spring 对AOP的支持 Spring提 ...

  2. Linux升级GCC

    升级原因 测试需要使用DOClever,下载了最新的node8.11,运行node 时候报错 [root@app_test bin]# node www module.js:681 return pr ...

  3. Windows上切换java8和java11

    Windows上安装了java8和java11,时不时要切换,于是思考写行命令解决.思路是修改java_home变量.我的java_home变量是设置在系统级别的. 修改环境变量有2个命令,set和s ...

  4. 命令用法习题,yum仓库的创建 chapter02 - 03 作业

    1.  分别用cat \tac\nl三个命令查看文件/etc/ssh/sshd_config文件中的内容,并用自己的话总计出这三个文档操作命令的不同之处? [root@localhost /]# ca ...

  5. Java几种常见的排序算法

    一.所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法.排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面. ...

  6. mysql主从配置详解(图文)

    最近工作不是很忙,把以前整理的mysql数据库的主从配置过程记录一下,有不足之处,请各位多多纠正指教 #环境配置#master IP:192.168.46.137 slave IP:192.168.4 ...

  7. Keil5调试过程中遇到的一些警告和错误

    最近用keil5调试代码出了一些警告与错误,整理如下: 1.warning: #1295-D: Deprecated declaration run_c - give arg types void r ...

  8. 【Java例题】2.5 温度转换

    5.输入华氏温度, 用下列公式将其转换为摄氏温度并输出. C=5/9(F-32). package study; import java.util.Scanner; public class demo ...

  9. 并发编程(4)——AbstractQueuedSynchronizer

    AQS 内部类Node 等待队列是CLH有锁队列的变体. waitStatus的几种状态: static final int CANCELLED = 1; /** waitStatus value t ...

  10. Zookeeper开源客户端Curator的使用

    开源zk客户端-Curator 创建会话: RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3); CuratorFramewor ...