html5 拖拽drag、拖放drop事件

智数追梦说
• 阅读 12052

认识下html5拖拽与拖放的API

拖拽流程

一个完整的drag and drop流程通常包含以下几个步骤:

1.设置可拖拽目标.设置属性draggable="true"实现元素的可拖拽.
2.监听dragstart,通过DataTransfer设置拖拽数据
3.为拖拽操作设置反馈图标(可选)
4.设置允许的拖放效果,如copy,move,link
5.设置拖放目标,默认情况下浏览器阻止所有的拖放操作,所以需要监听dragenter或者dragover取消浏览器默认行为使元素可拖放.
6.监听drop事件执行所需操作

拖拽事件

以下是拖拽产生的一系列事件,拖拽事件产生时不会产生对应的鼠标事件.

dragstart:拖拽开始时在被拖拽元素上触发此事件,监听器需要设置拖拽所需数据,从操作系统拖拽文件到浏览器时不触发此事件.
dragenter:拖拽鼠标进入元素时在该元素上触发,用于给拖放元素设置视觉反馈,如高亮
dragover:拖拽时鼠标在目标元素上移动时触发.监听器通过阻止浏览器默认行为设置元素为可拖放元素.
dragleave:拖拽时鼠标移出目标元素时在目标元素上触发.此时监听器可以取消掉前面设置的视觉效果.
drag:拖拽期间在被拖拽元素上连续触发
drop:鼠标在拖放目标上释放时,在拖放目标上触发.此时监听器需要收集数据并且执行所需操作.如果是从操作系统拖放文件到浏览器,需要取消浏览器默认行为.
dragend:鼠标在拖放目标上释放时,在拖拽元素上触发.将元素从浏览器拖放到操作系统时不会触发此事件.

详细查看更多:
https://developer.mozilla.org...

结合实例 在线效果体验:drag-demo

<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title>拖动</title>
    <style>
        h2 {
            font-size: 20px;
            color: #0d88c1;
        }

        div#left,
        div#right {
            width: 120px;
            float: left;
            margin: 10px 100px 10px 0px;
            height: 240px;
            background-color: #dddddd;
            overflow-y: auto;
        }

        div label {
            font-size: 22px;
            font-weight: bold;
            width: 100%;
            display: inline-block;
            padding: 4px 0;
            text-align: center;
            margin: 0px 0 2px 0;
            color: #fff;
            background-color: #0d88c1;
        }
        .over {
            border: 1px dashed red;
            box-sizing: border-box;
        }
    </style>
</head>

<body>
    <h2>拖放(Drag 和 drop)</h2>
    <!-- 左边元素框 -->
    <div id="left">
        <label draggable="true">index1</label>
        <label draggable="true">index2</label>
        <label draggable="true">index3</label>
        <label draggable="true">index4</label>
        <label draggable="true">index5</label>
        <label draggable="true">index6</label>
        <label draggable="true">index7</label>
    </div>
    <!-- 右边元素框 -->
    <div id="right"></div>
    <script>
        var moveItem = document.getElementsByTagName('label');

        for (let i = 0; i < moveItem.length; i++) {
            //动态设置label元素id
            moveItem[i].setAttribute('id', 'label' + i);
            moveItem[i].ondragstart = function (ev) {
                //dataTransfer.setData() 方法设置被拖数据的数据类型和值
                ev.dataTransfer.setData("id", this.id);
            };
        }
        document.getElementById('right').ondragover = function (ev) {
            ev.preventDefault(); //阻止向上冒泡
        }
        document.getElementById('right').ondragenter = function (ev) {
            ev.target.classList.add('over')
        }
        document.getElementById('right').ondragleave = function (ev) {
            ev.target.classList.remove('over')
        }
        document.getElementById('right').ondrop = function (ev) {
            ev.preventDefault();
            ev.target.classList.remove('over')
            var id = ev.dataTransfer.getData('id');
            var elem = document.getElementById(id); //当前拖动的元素
            var toElem = ev.toElement.id; //放置位置
            if (toElem == 'right') {
                //如果为container,元素放置在末尾
                this.appendChild(elem);
            } else {
                //如果为container里的元素,则插入该元素之前
                this.insertBefore(elem, document.getElementById(toElem));
            }
        }

        document.getElementById('left').ondragover = function (ev) {
            ev.preventDefault(); //阻止向上冒泡
        }
        document.getElementById('left').ondragenter = function (ev) {
            ev.target.classList.add('over')
        }
        document.getElementById('left').ondragleave = function (ev) {
            ev.target.classList.remove('over')
        }
        document.getElementById('left').ondrop = function (ev) {
            ev.preventDefault();
            ev.target.classList.remove('over')
            var id = ev.dataTransfer.getData('id');
            var elem = document.getElementById(id);
            var toElem = ev.toElement.id;
            if (toElem == 'left') {
                //如果为container,元素放置在末尾
                this.appendChild(elem);
            } else {
                //如果为container里的元素,则插入该元素之前
                this.insertBefore(elem, document.getElementById(toElem));
            }
        }
    </script>
</body>

</html>

参考资料:
1、https://segmentfault.com/a/11...
2、http://www.zhangxinxu.com/wor...

点赞
收藏
评论区
推荐文章
20pzqm 20pzqm
3年前
electron自定义标题栏
上贴传送门electron自定义标题栏隐藏默认标题栏constBrowserWindowrequire('electron')constwinnewBrowserWindow(frame:false)//frame设置为false支持拖拽默认情况下,无边框窗口是不可拖拽的。应用程序需要在CSS中指定webkitap
Alex799 Alex799
4年前
Vue进阶(幺柒幺):前端用户体验提升(五)Flex实现弹性布局
需求背景在实现组件拖拽设计过程中,发现组件样式中设置了display:flex属性信息,导致组件生成后无法实现拖拽效果,网上查阅资料后发现Flex布局大有天地。Flex来源
Wesley13 Wesley13
3年前
UIWebView背景透明的方法
1.首先UIWebView背景透明//setbackgroundtransparent,alsocansetitinnibfilewebView\_.backgroundColor  \UIColor clearColor\; webView\_.opaque  NO;2.隐藏拖拽webview时上下的两个有阴影效果的su
Wesley13 Wesley13
3年前
Unity 实现物体拖拽
Unity实现拖拽:!(http://ddlovegg.me/wpcontent/uploads/2017/10/ezgif.comvideotogif300x169.gif)也可以继承UnityEventSystem中的接口实现。当鼠标按下的时候以左键为例:UsingSystem.Collections;
Stella981 Stella981
3年前
ECharts 的拖拽小扩展
今天给大家介绍echarts中一个小例子『拖拽改变图表』的实现。这个例子是在原生echarts基础上做了些小小扩展,带有一定的交互性。通过这个例子,我们可以了解到,如何使用echarts提供的API实现『定制化的』『富有交互的』功能。!(http://timg01.bdimg.com/timg?pacompress&imgtype3
Stella981 Stella981
3年前
Echarts:实现拖拽效果
1<!DOCTYPEhtml2<html3<head4<metacharset"utf8"5<scriptsrc"./echarts.js"</script6</head7<body8<div
Wesley13 Wesley13
3年前
1小时搞定卡片拖拽、自动排列交换位置、拖拽数据存取
!(https://oscimg.oschina.net/oscnet/073a2557e1ba4201a92881b1eb2cd512.jpg)首先演示一下最终效果:流畅的拖动和交换位置效果,并实时更新数据!(https://oscimg.oschina.net/oscnet/767c7035f3aa423f9
商业开源MES+源码+送可拖拽式数据大屏
商业开源MES源码送可拖拽式数据大屏开发学习的好机会
馒头老爸 馒头老爸
1年前
10分钟掌握HTML拖放API!让你的网页元素瞬间拥有拖拽功能,轻松提升用户体验!
通过本文的学习,你将能够轻松掌握HTML5拖放API的使用技巧,提高拖拽功能的开发效率,为你的项目增色添彩。
程序员一鸣 程序员一鸣
2个月前
鸿蒙开发:实现一个超简单的网格拖拽
实现拖拽,最重要的三个方法就是,打开编辑状态editMode,实现onItemDragStart和onItemDrop,设置拖拽移动动画和交换数据,如果想到开启补位动画,还需要实现supportAnimation方法。
GeorgeGcs GeorgeGcs
1个月前
【HarmonyOS】应用开发拖拽功能详解
【HarmonyOS】应用开发拖拽功能详解一、前言拖拽交互本质上是一种通过鼠标或手势触屏传递数据的机制,用户可以从一个组件位置拖出数据并将其拖入到另一个组件位置,从而触发相应的响应。在鸿蒙中,ArkUI框架对拖拽功能提供了完整的支持,从基础的单组件拖拽到复
智数追梦说
智数追梦说
Lv1
后来我们温一壶酒你我都像最初的模样
文章
5
粉丝
0
获赞
0