拖拽

作者: LeoMelody | 来源:发表于2017-10-30 10:39 被阅读0次

JavaScript拖拽实现

背景

在学习开发了签名板之后,为了更加一步学习和理解事件的位置坐标这一块的知识点,自己用原生的js实现了一个可以拖拽的div框。

功能分析

首先,需要有一个可拖拽的对象,如图,一个比较简陋的拖拽框:

拖拽.png

在这个框中。我们只能在标题栏部分才可以进行拖拽,拖拽分为三步骤:

1、鼠标在标题栏部分按下后可以进行拖拽

2、移动按下的鼠标,拖拽框也会跟着移动

3、鼠标松开,拖拽结束。

功能实现

通过上述的功能分析,可以将功能分为mousedown,mousemove,mouseup三个部分。下面一步一步对拖拽功能进行分解。

变量初始化

下面代码为这个功能需要声明的对象和变量等

    var flag = false;  // flag用来标志鼠标是否在标题栏部分按下去
    var wrap = document.getElementById('wrap'); // 获取到整个拖拽框对象
    var head = document.getElementById('tzHead'); // 获取到拖拽框中标题栏对象

    var now = {
        x:'',
        y:''
    }; // 当前的鼠标位置

    var last = {
        x:'',
        y:''
    }; // 鼠标按下的时候的鼠标位置

    var initPosition = {
        x:'',
        y:''
    }; // 鼠标按下时的拖拽框相对偏移的位置
事件绑定
  head.addEventListener('mousedown',beginDrag,false);

  head.addEventListener('mousemove',drag,false);

  head.addEventListener('mouseup',endDrag,false);
方法实现

1、开始拖拽方法:

  function beginDrag(e) {
        flag = true;
        last.x = e.pageX;
        last.y = e.pageY;
        initPosition = {
            x: wrap.offsetLeft,
            y: wrap.offsetTop
        };
    }

2、拖拽方法:

function drag(e) {
        if (flag) {
            now = {
                x: e.pageX,
                y: e.pageY
            };
            wrap.style.left = parseInt(now.x) - parseInt(last.x) + parseInt(initPosition.x) + 'px';
            wrap.style.top = parseInt(now.y) - parseInt(last.y) + parseInt(initPosition.y) + 'px';
            return false;
        }
    }

3、结束拖拽

function endDrag(e) {
        flag = false;
}
问题

现在已经实现了最基本的拖拽功能。可是这时候会有一个问题,就是如果我们鼠标滑动的很快,就很容易鼠标从head区域出来,然后出来后松开鼠标,下次在head区域内不用点击就可以移动拖拽框,这样非常不友好。

优化

针对上面这种情况,在好好看了看代码后发现。下面这段代码是有问题的:

  head.addEventListener('mousedown',beginDrag,false);

  head.addEventListener('mousemove',drag,false);

  head.addEventListener('mouseup',endDrag,false);

对于鼠标按下事件,必须要绑定在head区域。可是拖拽事件和鼠标松开事件应该针对于整个文档。于是改为

  head.addEventListener('mousedown',beginDrag,false);

  document.addEventListener('mousemove',drag,false);

  document.addEventListener('mouseup',endDrag,false);

上述问题不存在了。

后续优化

对于代码功能而言已经完成了功能,但是代码质量需要很大程度的优化。

相关文章

  • 拖拽操作

    应用: 1.拖拽排序2.拖拽上传3.拖拽裁剪 拖拽流程 确定可拖拽的内容-->开始拖拽-->拖拽过程-->结束拖拽...

  • Html5 + Css 3 文件拖拽上传功能

    拖拽上传文件功能 拖拽事件 拖拽元素ondrag 应用于拖拽元素,整个拖拽过程都会调用ondragstart应用...

  • 拖拽上传

    拖拽事件 拖拽元素ondrag 应用于拖拽元素,整个拖拽过程都会调用ondragstart应用于拖拽元素,...

  • js:拖拽事件

    拖拽事件 ondragstart当拖拽元素被开始拖拽时,event:拖拽元素。[从操作系统向浏览器拖拽文件不会触发...

  • HTML 5 拖拽

    @(HTML5)[HTML 5拖拽] [TOC] 十三、HTML 5 拖拽 HTML 5 拖拽事件 图片自带拖拽功...

  • JQuery UI 拖拽排序

    禁用拖拽: 启用拖拽:

  • MacOS 开发(十六) : 文件拖拽

    文件拖拽的核心是拖拽目标视图 (DragDestinationView),此方法会检测目标是否可拖拽类型,拖拽文件...

  • HTML5拖拽上传

    传统拖拽效果小demohtml5实现拖拽小demo调查问卷小demo拖拽拼图小demo拖拽上传小demo h5拖拽...

  • HTML5拖拽drag

    通过拖拽实现页面元素的位置改变 实现拖拽效果 源元素 - 要拖拽的文件 目标元素 - 要拖拽到哪里去 目前实现拖拽...

  • 元素拖曳 H5

    拖拽 如何让一个元素变成拖拽元素 draggable=‘true’ ondrag 应用于拖拽元素,整个拖拽过程都会...

网友评论

      本文标题:拖拽

      本文链接:https://www.haomeiwen.com/subject/hmatpxtx.html