<JavaScript>使用onmousemove事件实现移动(拖拽)div 出现的关于offsetX的问题

出现的问题如下图所示(截屏看不出来看log)

再移动鼠标的过程中会不断的出现异常值导致拖动的div不断切换位置,回到左上角。
我以为是冒泡机制导致的所以添加了下面一段阻止冒泡,随便也阻止了默认事件,但是并没有效果
==================================================================
ev.preventDefault();
if (ev.stopPropagation) { ????ev.stopPropagation(); }else{ ????ev.cancelBubble = true; }
==================================================================
原因就是offsetX 和offsetY:
发生事件的地点在事件源元素的坐标系统中的 x 坐标和 y 坐标.
mousemove事件触发的事件源元素在不断切换,当鼠标移动时会移动到div中这时 offset的源元素不再是父级的div而是移动的div 这是offset值是相对于移动的div 所以是较小的值 ,所以会回到左上角。
====================================
原因知道了就解决吧

1。不用offset 还不行吗我用 clientX 稳稳的没问题,百度上所有关于这个问题都是用clientX (相对于浏览器视口)可是这肯定不是最完美的解决方法啊 ,要是整个外层div是居中的 还得计算一下clientX和 相对于外层div的差值。坚决不用啊!!!

  1. 不用clientX 有个小伙伴提议加一个判断? if(ev.target==外层div){ 执行赋值 } 这样就可以了啊 判断一下事件源是外层还是内层,但是问题又出现了,这样当是内层的时候会不执行也就是会一卡一卡的,我想用这个做小游戏 一卡一卡这怎么能行呢!!
    3.当我快要绝望的时候,我找到了 一个css的样式 pointer-events: none; 这个属性除了指示该元素不是鼠标事件的目标之外,值none表示鼠标事件“穿透”该元素并且指定该元素“下面”的任何东西。这样就不会出发触mousemove事件了。

完美解决
下面贴上实验的代码
=====================================================

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            #wrap{
                width: 600px;
                height: 600px;
                border: 1px solid black;
                /*background: url(./img/a.png);*/
            }
            .myPlane{
                width: 66px;
                height: 82px;
                /*pointer-events: none;*/
                /*background: url(./img/a.png);*/
                border: 1px solid black;

                position: absolute;
                /*top: 480px;
                left: 50%;
                transform: translate3d(-50%,0,0);*/
            }
        </style>
    </head>
    <body>
        <div id="wrap">

        </div>
        <script type="text/javascript">
            var wrap = document.getElementById("wrap");
//              wrap.onclick = function(){
//              wrap.style.background = "url(./img/ba.png)";
//          }
            createMyplane();
            function createMyplane (){
                var myPlane = document.createElement("div");
                myPlane.className= 'myPlane';
                wrap.appendChild(myPlane);
                move(myPlane);
            }
            function move(obj) {
                wrap.onmousemove = function (e) {
                    var ev = e || window.event;
                    ev.preventDefault();
                    if (ev.stopPropagation) {
                        ev.stopPropagation();

                    }else{
                        ev.cancelBubble = true;
                    }

                    var currount_X = ev.offsetX;
                    var currount_Y = ev.offsetY;

                    console.log("x:"+ currount_X +" y:"+ currount_Y);
                    obj.style.top = currount_Y  + 'px';
                    obj.style.left = currount_X + 'px';
                }
            }

        </script>
    </body>
</html>

原文地址:https://www.cnblogs.com/isAndyWu/p/12000937.html

时间: 2024-10-13 11:40:55

<JavaScript>使用onmousemove事件实现移动(拖拽)div 出现的关于offsetX的问题的相关文章

理解事件捕获。在限制范围内拖拽div+吸附+事件捕获

一.实现的效果是在限制范围内拖拽div+吸附+事件捕获. 这里需要理解的是事件捕获,这个事件捕获也是为了兼容div在拖拽过程中,文本不被选中这个问题. 如此良辰美景,拖拽也可以很洒脱哈.先看看图, 二.一步步的实现这个拖拽过程的几个要求 (一)拖拽起来 里面的边框是表示页面哦(我们的屏幕所能看到的东东). 获取移动距离的思路: 记录鼠标按下和鼠标抬起两次的坐标,然后相减,再加上div跟边缘之间的间距.就得到移动距离. 之前我也在这里困惑了,不明白为什么还要再加上offsetLeft.原因就是cl

简洁的drag效果,自由拖拽div的实现及注意点

偶然间看到了以前做的一个简洁的div拖拽效果,修改了一下加点注释,经测试完美通过firefox/chrome/ie6-11,现拿来分享一下. 先说一下实现原理及要点,最主要的有三步.第一步是mousedown事件,鼠标mousedown的时候记录此时的鼠标X轴和Y轴以及拖拽框的left和top,并且给拖拽标记赋值true,代表拖拽动作就绪.第二步是mousemove事件,此时动态获取鼠标的X轴和Y轴,然后计算出来拖拽框新的left和top并赋值使其实现拖拽效果.第三步是mouseup事件,鼠标弹

php+mysql+js拖拽div实例

php+mysql+js拖拽div实例 代码已改好,放在目录下可直接使用.适合新手学习! 效果如下图,比较适合做可以移动,拖拽的留言板. 实现思路: 思路也是很简单了,就是js获取定位后的数据,然后请求给PHP,php将定位的横向坐标和纵向坐标存到数据库! 代码实例下载地址:http://download.csdn.net/detail/u011986449/8099045

JS——事件详情(拖拽案例:onmousedown、onmousemove、onmouseup方法)

实现拖拽案例 效果如下图所示: 代码如下图所示: 代码思路说明: 第23行代码:在div元素中触发onmousedown事件,实现鼠标在div按下,不提起功能 [区别于onclick,onclick:按下.提起事件,属于两个动作(即:onmousedown+onmouseup)] 第20-21行代码:声明变量,用于计算鼠标按下位置到div位置长度距离 (详细见下图解释分析) 第24-25行代码:设置鼠标按下位置到div位置长度距离(即:鼠标位置-div左边距到浏览器的长度距离) (详细见下图解释

javascript动画系列第一篇——模拟拖拽

× 目录 [1]原理介绍 [2]代码实现 [3]代码优化[4]拖拽冲突[5]IE兼容 前面的话 从本文开始,介绍javascript动画系列.javascript本身是具有原生拖放功能的,但是由于兼容性问题,以及功能实现的方式,用的不是很广泛.javascript动画广泛使用的还是模拟拖拽.本文将详细介绍该内容 原理介绍 模拟拖拽最终效果和在桌面上移动文件夹的效果类似 鼠标按下时,拖拽开始.鼠标移动时,被拖拽元素跟着鼠标一起移动.鼠标抬起时,拖拽结束 所以,拖拽的重点是确定被拖拽元素是如何移动的

javascript动画系列第四篇——拖拽改变元素大小

× 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位元素的left和top值实现的.而拖拽改变元素大小,则还需要改变元素的宽高 范围圈定 我们把改变元素大小的范围圈定在距离相应边10px的范围内 左侧边界L = obj.offsetLeft + 10 右侧边界R = obj.offsetLeft + obj.offsetWidth - 10 上侧边界

iOS边练边学--触摸事件以及能够拖拽的UIView的练习

一.用户在使用APP的过程中,会产生各种各样的事件.iOS中的事件可以分为3大类型: 二.响应者对象 在iOS中只有继承了了UIResponder的对象才能接受并处理事件,这样的对象称之为“响应者对象” UIApplication.UIViewController.UIView都继承自UIResponder,因此他们都是响应者对象,都能够接受并处理事件 UIResponder内部提供了以下方法来处理事件 三.练习中对UIView的触摸事件进行了熟悉 四.UITouch 一根手指对应一个UITou

手机端touch事件实现元素拖拽效果 2

经上次的手机端拖拽事件,再次经过完善修改,加入了元素不能拖出屏幕范围功能,并做了一个小的函数接口 ps:经落雨大神指点. 代码如下: var touchEvent = (function(){ var oDiv = document.getElementsByTagName('div')[0], //获取可拖动元素 oIpt = document.getElementsByTagName('input')[0], //记录拖动元素位置 oIpt1 = document.getElementsBy

dom 拖拽div

<!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <style> #div1{ width:100px; height:100px; background:red; position:absolute; } </style> <script> window.onload = func