H5拖拽功能draggable

H5提出了拖拽的功能,被拖动元素(除img,a标签,默认可以拖动)需要添加draggable="true"属性,以下是对应的api:

应用于当前被拖拽元素的事件

ondrag 元素正在拖动时触发(整个过程持续触发)

ondragstart 用户开始拖动元素时触发

ondragend 用户完成元素拖动后触发

ondragleave 当鼠标离开拖拽元素时调用

应用于目标元素的事件

ondragenter 应用于目标元素,当拖拽元素进入时调用

ondragover 应用于目标元素,当停留在目标元素上时调用(持续触发)

ondrop 应用于目标元素,当在目标元素上松开鼠标时调用

ondragleave 应用于目标元素,当鼠标离开目标元素时调用

参考示例:

<!DOCTYPE html>
<html>

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

        div#left,
        div#right {
            width: 120px;
            height: 300px;
            float: left;
            margin: 10px 100px 10px 0px;
            border: 1px solid #000;
            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: gray;
        }
    </style>
</head>

<body>
    <div>
        <h2>H5拖放</h2>
        <!-- 左边元素框 -->
        <div id="left">
            <label draggable="true">A</label>
            <label draggable="true">B</label>
            <label draggable="true">C</label>
            <label draggable="true">D</label>
            <label draggable="true">E</label>
        </div>
        <!-- 右边元素框 -->
        <div id="right"></div>
    </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:拖放的数据传递对象
                // dataTransfer.setData() 方法设置被拖数据的数据类型和值
                ev.dataTransfer.setData("Text", this.id);
            };
        }

        // 事件
        // dragstart   //当用户开始拖动一个元素或者一个选择文本的时候 dragstart 事件就会触发。
        // drag      //当元素或者选择的文本被拖动时触发 drag 事件 (每几百毫秒)
        // dragenter   //当拖动的元素或被选择的文本进入有效的放置目标时, dragenter 事件被触发。
        // dragleave   //当一个被拖动的元素或者被选择的文本离开一个有效的拖放目标时,将会触发dragleave 事件
        // dragover    //当元素或者选择的文本被拖拽到一个有效的放置目标上时,触发 dragover 事件(每几百毫秒触发一次)。
        // drop       //当一个元素或是选中的文字被拖拽释放到一个有效的释放目标位置时,drop 事件被抛出。
        // dragend    //拖放事件在拖放操作结束时触发(通过释放鼠标按钮或单击escape键)

        // 左=>右
        document.getElementById('right').ondragover = function (ev) {
            console.log('dragover event');
            ev.preventDefault();  //阻止向上冒泡
            ev.stopPropagation();
        };
        document.getElementById('right').ondrop = function (ev) {
            // 阻止默认事件
            ev.preventDefault();
            ev.stopPropagation();  // 火狐浏览器不生效
            var id = ev.dataTransfer.getData('Text');
            // 当前拖动的dom元素
            var elem = document.getElementById(id);
            // 目标元素
            var toElem = ev.target.id;
            if (toElem == 'right') {
                // div#left元素内的子元素拖放到div#right元素内,拖放元素添加到div#right元素尾部
                this.appendChild(elem);
            } else {
                // div#left元素内的子元素位置互换,拖放元素插入到目标元素之前
                this.insertBefore(elem, document.getElementById(toElem));
            }
        }

        // 右=>左
        document.getElementById('left').ondragover = function (ev) {
            ev.preventDefault(); //阻止向上冒泡
        };
        document.getElementById('left').ondrop = function (ev) {
            ev.preventDefault();
            ev.stopPropagation();
            var id = ev.dataTransfer.getData('Text');
            var elem = document.getElementById(id);
            var toElem = ev.target.id;
            if (toElem == 'left') {
                // div#right元素内的子元素拖放到div#left元素内,拖放元素添加到div#left元素尾部
                this.appendChild(elem);
            } else {
                // div#right元素内的子元素位置互换,拖放元素插入到目标元素之前
                this.insertBefore(elem, document.getElementById(toElem));
            }
        }

    </script>

</body>

</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Goat恶霸詹姆斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值