模仿《javascript权威指南》写了个简易拖拽程序,麻雀虽小五脏俱全。
原理:注册mousemove事件,使元素跟随鼠标挪动;注册mouseup事件,移除mousemove事件,使得松开鼠标时元素不再跟随移动,能够固定在指定位置。在mousedown事件中注册mousemove事件和mouseup事件,这样便可完成一次完整的拖拽。
重点:IE中setCapture()的应用。它的作用是捕捉所有的MouseEvent,设置完成后,即使鼠标移出窗口注册的鼠标事件仍然能够被触发。它在此处的作用是当鼠标移动过快越出元素的边界使得原本将要失效的mousemove事件依然能够发挥作用。在ff和chrome中,由于没有对应的设置,可以把mousemove和mouseup事件指定到docuemnt对象上,这样不管鼠标怎么移动,都在document上;其实在ie上这么写也行,那就不用设置setCapture()了,它和设置了的相比唯一的区别是当元素向右移出窗口边界时,元素始终保持在可视范围内。
<!docType html>
<html>
<head>
<style type="text/css">
#drag {border:1px solid blue;width:100px;height:100px;position:absolute;}
</style>
</head>
<body>
<input id="x" />
<input id="y" />
<div id="drag"></div>
<script><!--
var drag = document.getElementById('drag');
var inputX = document.getElementById('x');
var inputY = document.getElementById('y');
if(document.attachEvent){
drag.attachEvent('onmousedown',dragHandle);
}else{
drag.addEventListener('mousedown', dragHandle,false);
}
function dragHandle(event){
var event = event||window.event;
var startX = drag.offsetLeft;
var startY = drag.offsetTop;
var mouseX = event.clientX;
var mouseY = event.clientY;
var deltaX = mouseX - startX;
var deltaY = mouseY - startY;
if(document.attachEvent){
drag.attachEvent('onmousemove',moveHandle);
drag.attachEvent('onmouseup',upHandle);
drag.attachEvent('onlosecapture',upHandle);
drag.setCapture();
}else{
document.addEventListener('mousemove',moveHandle,true);
document.addEventListener('mouseup',upHandle,true);
}
function moveHandle(event){
var event = event||window.event;
drag.style.left = (event.clientX - deltaX)+"px";
drag.style.top = (event.clientY - deltaY)+"px";
inputX.value=drag.style.left;
inputY.value=drag.style.top;
}
function upHandle(){
if(document.attachEvent){
drag.detachEvent('onmousemove',moveHandle);
drag.detachEvent('onmouseup',upHandle);
drag.detachEvent('onlosecapture',upHandle);
drag.releaseCapture();
}else{
document.removeEventListener('mousemove',moveHandle,true);
document.removeEventListener('mouseup',upHandle,true);
}
}
}
//--</script>
</body>
</html>
当然此例还可以扩展,比如限定拖拽范围不允许移动到可视范围外等,只要修改mousemove方法即可。
分享到:
相关推荐
总结来说,Drag5是一个专为简化和增强JavaScript拖拽功能设计的框架,它的简易性和灵活性使得开发者能够快速构建出具有高度定制性的拖拽效果,从而提升Web应用的用户体验。通过深入理解Drag5的工作原理和使用方法,...
在本项目中,"模拟乐谱简易做题JS(移动端手指拖拽答题)"是一个使用JavaScript技术构建的互动式乐谱答题应用,主要针对iPad尺寸进行优化。这个应用提供了丰富的功能,如上下题切换、答案检查以及支持移动端的手势拖拽...
js拖拽的时候,发现了一个强大而又灵活的拖拽框架,(之前用了代码混淆器,还好代码比较短,我就翻译过来了)利用这个框架不仅能实现简单的拖动,更能轻易的实现各种复杂的拖放功能。这一篇先实现最简单的拖拽,稍微...
在本文中,我们将深入探讨如何使用HTML5的拖放(Drag and Drop)API以及FileReader接口来实现一个简易的文件拖拽功能。这个功能不仅允许用户通过拖动文件到指定区域来选择文件,还能实现数据分片,提高上传大文件时...
【标题】"用js/html5制作简易音乐播放器"揭示了我们要探讨的核心技术:JavaScript(简称js)和HTML5,以及如何结合它们来创建一个基本的音频播放功能。HTML5引入了新的`<audio>`标签,使得在网页上内嵌和控制音频变...
**JS实现简易的图片拖拽排序实例代码** 在本文中,我们将探讨如何使用JavaScript和HTML5的拖放API实现一个简单的图片拖拽排序功能。首先,让我们深入理解HTML5拖放API的基础知识。 ### HTML5拖放API简介 拖放API...
"简易鼠标任意拖拽层源码"提供了五个JavaScript实现的拖拽框架实例,旨在帮助开发者轻松创建可自由拖动的层,从而提升用户的交互体验。以下是对这些实例中的关键知识点的详细解释: 1. **Drag框架基础**:Drag框架...
简易拖拽 目录 代码实例 代码解析 scrollWidth,clientWidth,offsetWidth的区别 offsetX,clientX,pageX的辨析 下载源码链接 代码实例 <div id=box xss=removed></div> (function () { var dragging = false ...
可以通过写入愿望并点击添加生成愿望卡,所有的愿望卡颜色为随机生成(该代码是在网页某原有代码上改写的,原来的只生成固定数量的愿望卡...因为我在写生成新的愿望卡时局部刷新,用的是ajax,其实完全可以用js就搞定。
标题中的“Jquery 制作的一个非常强汗的购物车页面”指的是使用JavaScript库JQuery构建的一个具有高度交互性和动态效果的购物车界面。JQuery是一个广泛使用的前端开发工具,它简化了JavaScript代码的编写,提供了...
标题《js简易版购物车功能》和描述表明,本文旨在分享如何利用JavaScript创建一个简易的购物车功能。该功能主要基于HTML和JavaScript实现,利用了HTML的拖拽API以及DOM操作方法来完成购物车中商品的添加、数量统计和...
该实验报告描述的是一个基于FPGA(Field-Programmable Gate Array)的简易计算器的设计过程。这个计算器能够处理最大两位十进制数的加、减、乘、除运算,并支持连续计算,但不考虑运算优先级,而是按照从左到右的...
【简易网页制作】是一款专为初学者设计的网页开发软件,尤其适合那些没有编程或网页设计经验的新手。这款软件的出现,旨在降低网页制作的门槛,让每个人都有机会亲手创建自己的网页,体验互联网创作的乐趣。 在网页...
`rua.css`可能包含了定制的样式规则,以适应电路图编辑器的视觉效果,而`bootstrap-3.3.7-dist`则是著名的前端框架Bootstrap,用于提供响应式布局和组件,帮助构建用户友好的界面。 `rua.html`是项目的主HTML文件,...
为了实现一个平滑的滚动效果,我们可能还需要使用一些JavaScript的定时函数,例如`setTimeout`或`requestAnimationFrame`,来处理拖拽结束后的惯性滚动效果。这会让用户体验更加流畅和自然。 最后,虽然本文未提供...
JQ.MoveBox.js是一个简易的拖拽插件示例,它不仅展示了如何使用jQuery实现拖拽效果,还涵盖了如何制作一个基本的jQuery插件。通过阅读和理解这个插件的代码,开发者可以学习到如何通过原生JavaScript和jQuery来实现...
同时可能支持JavaScript或jQuery代码,实现更复杂的交互逻辑。 6. **响应式设计**:考虑不同设备的显示效果,工具可能包含适应手机、平板等移动设备的布局功能。 7. **批量处理**:对于需要大量相似按钮或菜单的...