JavaScript拖拽原理的实现

实现拖拽的基本思路

拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素。鼠标的移动也就是x、y坐标的变化;元素的移动就是style.position的top和left的改变。当然,并不是任何时候移动鼠标都要造成元素的移动,而应该判断鼠标左键的状态是否为按下状态,是否是在可拖拽的元素上按下的。

根据以上的基本原理,我写出了下面的基本思路。感觉代码还是比较短的,

  1. view plaincopy to clipboardprint
  2. 拖拽状态 = 0鼠标在元素上按下的时候{
  3. 拖拽状态 = 1
  4. 记录下鼠标的x和y坐标
  5. 记录下元素的x和y坐标
  6. }
  7. 鼠标在元素上移动的时候{
  8. 如果拖拽状态是0就什么也不做。
  9. 如果拖拽状态是1,那么
  10. 元素y = 现在鼠标y - 原来鼠标y + 原来元素y
  11. 元素x = 现在鼠标x - 原来鼠标x + 原来元素x
  12. }
  13. 鼠标在任何时候放开的时候{
  14. 拖拽状态 = 0
  15. }

将以上思路翻译成JS代码就可以实现拖拽的效果了。

JavaScript代码

  1. view plaincopy to clipboardprint
  2. <mce:script type="text/javascript"><!--
  3. var dragging = false;
  4. var test;
  5. var mouseY;
  6. var mouseX;
  7. window.onload = function(){
  8. test = document.getElementById("test");
  9. test.onmousedown = down;
  10. test.onmousemove = move;
  11. document.onmouseup = up;
  12. test.style.position = "relative";
  13. test.style.top = "0px";
  14. test.style.left = "0px";
  15. }
  16. function down(event)
  17. {
  18. event = event || window.event;
  19. dragging = true;
  20. mouseX = parseInt(event.clientX);
  21. mouseY = parseInt(event.clientY);
  22. objY = parseInt(test.style.top);
  23. objX = parseInt(test.style.left);
  24. }
  25. function move(event){
  26. event = event || window.event;
  27. if(dragging == true){
  28. var x,y;
  29. y = event.clientY - mouseY + objY;
  30. x = event.clientX - mouseX + objX;
  31. test.style.top = y + "px";
  32. test.style.left = x + "px";
  33. }
  34. }
  35. function up(){
  36. dragging = false;
  37. }
  38. // --></mce:script>

HTML代码

  1. view plaincopy to clipboardprint
  2. <div id="test" style="border:1px solid; width:400px; background:#CCCCCC;">
  3. <p>我是拖拽示例DIV。</p>
  4. <p>可以试验一下效果。</p>
  5. </div>

演示代码

  1. + expand sourceview plaincopy to clipboardprint

缺点与待完善之处

这个拖拽的例子还相当不完善,不过已经实现了拖拽最根本的核心。想到的待完善部分有下面几点:获得元素的x与y坐标的方法在本文里简化掉了;本文只让一个固定的元素具有了拖拽功能,灵活性太差;鼠标样式没有变换;快速的“乱甩拖拽”有一定概率出现问题。其中最后一个问题暂时不知道怎么解决,前面三个比较好办。

时间: 2024-10-05 23:27:33

JavaScript拖拽原理的实现的相关文章

Javascript 拖拽的一些简单的应用——逐行分析代码,让你轻松了解拖拽的原理

今天我们来看看如何让拖拽的物体不能拖出某个div之外和拖拽的吸附功能 上次讲到我们的拖拽是不可拖出可视区范围的,在这基础上我们加个父级的div,不让他拖出父级.原理和之前的一样,简单吧. <style type="text/css"> #div1 { width: 100px; height: 100px; background: red; position: absolute; } #div2 { width: 400px; height: 300px; backgrou

Javascript 拖拽的一些高级的应用——逐行分析代码,让你轻松了解拖拽的原理

我们看看之前的拖拽在周围有东西的时候会出现什么问题? 在高级浏览器中不会有啥问题,我们放到IE7下面测试一下,问题就出来了.如图 我们可以很清楚的看到,文字都已经被选中了.那这个用户体验很不好,用起来也不方便.顺便提一下,我们之前加了一个return false;帮我们解决了很多问题,如果去掉这个的话,chrome也会出现一样的问题.那么也就是说这个return false;可以解决chrome ff IE9+ 这些浏览器的问题. 实际上在我们开发中,页面上会有许多的元素组成,不可能就一个div

Javascript 拖拽雏形中的一些问题——逐行分析代码,让你轻松了拖拽的原理

今天我们就来解决上一次拖拽雏形中的一些问题.下面看看有哪些问题? 附上上期的Javascript代码,方便大家查看问题. <script type="text/javascript"> window.onload = function() { var oDiv = document.getElementById("div1"); var disX = 0; var disY = 0; oDiv.onmousedown = function(ev) { v

javascript 拖拽

拖拽的基本原理就是根据鼠标的移动来移动被拖拽的元素.鼠标的移动也就是x.y坐标的变化:元素的移动就是style.position的top和left的改变.当然,并不是任何时候移动鼠标都要造成元素的移动,而应该判断鼠标左键的状态是否为按下状态,是否是在可拖拽的元素上按下的. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtm

Javascript 拖拽雏形——逐行分析代码,让你轻松了拖拽的原理

拖拽的原理: 其实就是鼠标与左上角的距离保持不变.我们来看下图, 这红点就是鼠标.拖拽拖拽实际上来说就是通过鼠标的位置来计算物体的位置,就是这么简单,就是这么任性. 那这个距离怎么求呢?? 鼠标的位置-物体位置的差值就是那个距离 是吧.那这个斜线就是横线和竖线组成的. 我们距离看下程序怎么做. /*实际上他改的就是某个div 的left top ,那他就动起来了. 那样式中肯定要有绝对定位是吧.*/ <style type="text/css"> #div1 { width

拖拽原理以及代码实现

拖拽功能主要是用在让用户做一些自定义的动作,比如拖动排序,弹出框拖动移动等等:挺好玩儿.下面分享一下拖拽的原理,和码友们一起学习! 拖拽流程: 1)事件:onmousedown:onmousemove:onmouseup: 2)实现原理分析: 拖拽是通过获取鼠标移动的距离来实现的,即计算移动前的位置的坐标(x,y)与移动中的位置的坐标(x,y)差值.当onmousedown或onmousemove时,都可以获取到当前鼠标的位置,即移动前的坐标值与移动中的坐标值.参考如下图: 如上图所示: 在on

JavaScript拖拽

html拖拽的思路如下:鼠标按下 > 鼠标移动 > 鼠标弹起,只要把这三个鼠标事件添加到对应的dom元素上,作相应的处理就行了. 1.mousedown事件须加在可拖动dom上: 2.mousemove事件加在document上: 3.mouseup事件还是加在可拖动dom上: 注意:拖拽的时候要禁止选中页面文字 body{ -moz-user-select:none; -webkit-user-select:none; user-select:none; -ms-user-select: n

js拖拽原理和碰撞原理

拖拽的原理onmousedown 选择元素onmousemove 移动元素onmouseup 释放元素 1:如果拖拽的时候有文字:被选中,会产生问题原因:当鼠标按下的时如果页面中有文字或者图片被选中的时候,则会发生文字默认可以被拖动,因此标准 :e.preventDefalut(); 阻止他的默认行为 非标准的阻止默认行为 非标准:window.event.returnValue=false; 2:给某元素设置全局捕获,当我们给一个元素设置全局捕获,那么这个元素会监听后续发生的所有事件,当有事件

Jquery拖拽原理

/* onmousedown : 选择元素 onmousemove : 移动元素 onmouseup : 释放元素 */ 查看Demo:拖拽图片 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