js学习笔记29----拖拽
原理:先计算鼠标与拖拽目标的左侧距离 跟 上面距离,再计算拖动后的位置。
示例代码:
<!DOCTYPE html>
<html lang="en">
<head>
<title>拖拽原理</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type="text/css">
#moveBlock{
width:100px;height:100px;background-color:#f00;position:absolute
}
</style>
<script> window.onload = function(){
var oDiv = document.getElementById("moveBlock");
oDiv.onmousedown = function(ev){
var ev = ev || event;
var disX = ev.clientX - this.offsetLeft; //计算鼠标与当前div左侧距离
var disY = ev.clientY - this.offsetTop; //计算鼠标与当前div顶侧距离 document.onmousemove = function(ev){
var ev = ev || event;
oDiv.style.left = ev.clientX - disX + "px";//计算拖动后与左侧的距离
oDiv.style.top = ev.clientY - disY + "px";//计算拖动后与顶部的距离
} document.onmouseup = function(){
document.onmousemove = document.onmouseup = null;
} }
} </script>
</head>
<body>
<div id="moveBlock"> </div>
</body>
</html>
我们运行上面的代码如果只是一个单纯的div没什么问题,但是如果同时有文字选中之后,再拖动div会发现有问题。
那是因为当鼠标按下的时候,如果页面中有文字被选中,那么会触发浏览器默认的文字拖拽效果。
<!DOCTYPE html>
<html lang="en">
<head>
<title>拖拽改进版</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type="text/css">
#moveBlock{
width:100px;height:100px;background-color:#f00;position:absolute
}
</style>
<script> window.onload = function(){
var oDiv = document.getElementById("moveBlock");
oDiv.onmousedown = function(ev){
var ev = ev || event;
var disX = ev.clientX - this.offsetLeft;
var disY = ev.clientY - this.offsetTop;
//设置全局捕获
if(oDiv.setCapture){
oDiv.setCapture();
} document.onmousemove = function(ev){
var ev = ev || event;
oDiv.style.left = ev.clientX - disX + "px";
oDiv.style.top = ev.clientY - disY + "px";
} document.onmouseup = function(){
document.onmousemove = document.onmouseup = null;
//释放事件捕获 releaseCapture();
if(oDiv.releaseCapture){
oDiv.releaseCapture();
}
} return false; //阻止事件默认行为 }
} </script>
</head>
<body>
<p>
原因:当鼠标按下的时候,如果页面中有文字被选中,那么会触发浏览器默认的文字拖拽效果。<br>
解决: 用return false; 阻止事件默认行为.
</p>
<div id="moveBlock"> </div>
</body>
</html>
封装成一个拖拽函数:
<!DOCTYPE html>
<html lang="en">
<head>
<title>拖拽封装</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type="text/css">
#moveBlock{
width:100px;height:100px;background-color:#f00;position:absolute
}
</style>
<script> window.onload = function(){ var oDiv = document.getElementById("moveBlock");
drag(oDiv); function drag(obj){
obj.onmousedown = function(ev){
var ev = ev || event;
var disX = ev.clientX - this.offsetLeft;
var disY = ev.clientY - this.offsetTop; if(obj.setCapture){
obj.setCapture;
} document.onmousemove = function(ev){
var ev = ev || event;
obj.style.left = ev.clientX - disX + "px";
obj.style.top = ev.clientY - disY + "px";
} document.onmouseup = function(){
document.onmousemove = document.onmouseup = null;
//释放事件捕获 releaseCapture();
if(obj.releaseCapture){
obj.releaseCapture();
}
} return false; //阻止事件默认行为 }
} } </script>
</head>
<body>
<p>
原因:当鼠标按下的时候,如果页面中有文字被选中,那么会触发浏览器默认的文字拖拽效果。<br>
解决: 用return false; 阻止事件默认行为.
</p>
<div id="moveBlock"> </div>
</body>
</html>
js学习笔记29----拖拽的更多相关文章
- 纯JS Web在线可拖拽的流程设计器
F2工作流引擎之-纯JS Web在线可拖拽的流程设计器 Web纯JS流程设计器无需编程,完全是通过鼠标拖.拉.拽的方式来完成,支持串行.并行.分支.异或分支.M取N路分支.会签.聚合.多重聚合.退回. ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- js div浮动层拖拽效果代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JS 学习笔记--9---变量-作用域-内存相关
JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...
- WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)
WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...
- WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法
WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...
- WebGL three.js学习笔记 创建three.js代码的基本框架
WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...
- vue.js 学习笔记3——TypeScript
目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...
- 2019-4-29 js学习笔记
js学习笔记一:js数据类型 1:基本数据类型 number类型(整数,小数) String类型 boolean类型 NaN类型其实是一个nu ...
随机推荐
- C#实现foreach
方法:一.继承既有的接口 如:CollectionBase.DictionaryBase class TestForeach: CollectionBase { public void Add(str ...
- #pragma pack
原文链接: http://www.cnblogs.com/s7vens/archive/2012/03/06/2382236.html pack 为 struct, union 和 class 等的成 ...
- 关于阿里云centos 2.6下手机表情输入后无法保存到mysql数据库的问题调研及mysql版本从5.1升级到5.7的全过程纪要
近日在开发手机app的评论功能时,输入表情文字,保存后提示数据库保存失败.错误日志片段如下 caused by: java.sql.SQLException: Incorrect string val ...
- 使用和学习 ES2015
调试网站 http://babeljs.io/repl/ 扩展阅读: # export.exports.modules.exports 和 require .import 的一些常用方法和套路 htt ...
- 在C#中使用WMI查询进程的用户信息
这是一个使用WMI查询信息的例子.看之前请对WMI有一个简单的了解,可以百度,或者查看我上一篇:WMI测试器 主要代码:(需要添加对System.Management的引用) //创建Win32_Pr ...
- sqlite时间戳转时间语句(时间转时间戳)实例
sqlite时间戳转时间.时间转时间戳的方法 实现代码: sqlite, 'unixepoch', 'localtime'); +----------------------------------- ...
- android 开发 ------- 接口文档 规范
1 接口书写的格式: 1 用例图 2 流程图 3 详细的接口: 3.1请求的方式: 包含: server地址 le.gxjinan.com/open/user.php?ac=login ...
- Java项目(5)——单例模式的应用与研究
单例模式是非常别致的一个模式,非常少有人拿它跟其它模式相比,由于,单例模式非常easy,非常特别,作用就是保证一个类有唯一一个实例,并让一个全局变量使得它能被訪问.而保证这个类仅仅被实例化一次的办法就 ...
- thread-local-allocation-buffers
https://www.azul.com/files/Whats-inside-a-JVM-webinar-presentation.pdf https://www.zhihu.com/questio ...
- 前端面试题 -- JS篇
前端面试题 -- JS篇 类型 1.js中有哪些数据类型,并解释清楚原始数据类型和引用数据类型 js中共有null,undefined, string,number,boolean,object六种数 ...