div拖拽
分析逻辑关于该过程有一下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拖拽的更多相关文章
- 实现Div拖拽
直观的理解div拖拽:当鼠标对着可拖拽部分按住后并拖动,div会跟着鼠标一起运动,并且其运动空间限制在浏览器内部,当放开鼠标时,则div停止运动. 实现div拖拽需要三个重要的事件: (1)onmou ...
- html之div拖拽,html5拖拽
html之div拖拽 http://www.w3school.com.cn/html5/html_5_draganddrop.asp
- 运用DIV拖拽实现resize和碰撞检测
运用DIV拖拽实现resize和碰撞检测 Div由拖拽改变大小 演示demo 当我们运用html元素"textarea"写一个文本输入框时,浏览器会自动生成以下样式 用鼠标拖动右下 ...
- 纯js实现DIV拖拽
写代码的时候遇到需要对绝对布局的div进行拖拽的功能,起初为了省事直接在网上扒拉了一番,看到大神张鑫旭的一篇文章<JavaScript实现最简单的拖拽效果>,便直接拿来使用(膜拜大神).但 ...
- 案例:简易的Div拖拽
案例:简易的Div拖拽 鼠标移入Div区域后,按下鼠标左键,可以拖动Div移动;松开鼠标左键,Div拖动停止.同时要求Div不能拖出屏幕显示区域外. 拖拽原理:距离不变.三个事件(onmousedow ...
- html --- javascript --- div --- 拖拽方块
当鼠标拖拽的很快时,光标会走出方块,所以把事件注册在了方块的父节点上, 如有疑问请参照:http://blog.csdn.net/a9529lty/article/details/2708171 使用 ...
- 原生js实现div拖拽+按下鼠标计时
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style> ...
- 原生js实现div拖拽
十分简单的效果. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- div拖拽缩放jquery插件编写——带8个控制点
项目中需要对div进行拖拽缩放,需要有控制面板8个控制点的那种,原以为这么常见的效果应该能搜索到很多相关插件,然而可以完成拖拽的实繁,却找不到我想要的,还是自己动手丰衣足食吧 效果预览(只支持pc端) ...
- jquery实现div拖拽
1.引入jquery1.8.3 ,模块拖拽js代码: //模块拖拽 $(function(){ var _move=false;//移动标记 var _x,_y;//鼠标离控件左上角的相对位置 $(& ...
随机推荐
- LinkedList实现类
List还有一个LinkedList的实现,它是一个基于链表实现的List类,对于顺序访问集合中的元素进行了优化,特别是当插入.删除元素时速度非常快.因为LinkedList即实现了List接口,也实 ...
- 【iOS】Xcode 使用 CocoaPods 导入第三方库后没有提示
Github 上下载的开源项目,运行后出现的 [iOS]build diff: /../Podfile.lock: No such file or directory 解决后,又出现了这个问题. 解决 ...
- 动态开内存(malloc与calloc)
malloc与calloc 1.函数原型 #include<stdlib.h> void *malloc(unsigned int size); //申请size字节的内存 voi ...
- Docker入门学习笔记
Docker 什么是Docker 虚拟化技术 在计算机中,虚拟化是一种资源管理技术,将计算机中的各种实体资源如:CPU.硬盘.内存等予以抽象.转换后呈现出来打破实体结构间的不可切割的障碍,使用户可以比 ...
- 一文了解:Redis基础类型
Redis基础类型 Redis特点 开源的,BSD许可高级的key-value存储系统 可以用来存储字符串,哈希结构,链表,集合 安装 windows:https://github.com/micro ...
- python_0基础学习_day02
第二节 一,while while也称为无限循环.死循环 while 条件: 缩进 循环体 应用领域:音乐播放:单曲循环,列表循环,随机播放(也是有规律的) 登陆界面:…… 数学计算:1~100的和, ...
- CSS等分布局方法
原文链接:http://caibaojian.com/css-equal-layout.html CSS等比例划分,在CSS布局中是比较重要的,下面分享几种常用方法和探讨一下兼容性. 一:浮动布局+百 ...
- android ——网络编程
一.WebView 这个View就是一个浏览器,用于展示网页的. 布局文件: <LinearLayout xmlns:android="http://schemas.android.c ...
- 谈谈我对Ext的认识,元芳,你怎么看
实用Ext第一步当然是引用jar包啦. 下载地址 在页面上加上div用于显示这也是必须的 <div id='loginpanel' ></div> 在js中我们肯定需要将Ext ...
- Flink 源码解析 —— 如何获取 JobGraph?
JobGraph https://t.zsxq.com/naaMf6y 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac 上搭建 F ...