HTML5 拖拽用法

作者: x1911 | 来源:发表于2022-06-12 11:05 被阅读0次

实现 html5 中不同 li 拖放后并排序的效果

image.png

如果是向外拖动自动放入最后一排,如果移动到另外一个 li 上则两者交换位置

image.png

css部分代码
···

<style>
    body {
        background: #eee;
    }

    /* Prevent the text contents of draggable elements from being selectable. */
    [draggable] {
        -moz-user-select: none;
        -khtml-user-select: none;
        -webkit-user-select: none;
        user-select: none;
        /* Required to make elements draggable in old WebKit */
        -khtml-user-drag: element;
        -webkit-user-drag: element;
    }

    ul {
        width: 100vw;
        max-width: 500px;
        /* height: 300px; */
        border: 1px solid #ccc;
        border-radius: 8px;
        background: #fff;
        overflow: hidden;
        display: flex;
        align-items: center;
        justify-content: center;
        flex-wrap: wrap;

    }

    li {
        transition: all 0.3s;
        list-style: none;
        width: 100px;
        height: 160px;
        margin: 10px;
        background-color: rgb(177, 221, 250);
        border-radius: 4px;
    }

    .ondrag {
        transform: scale(0.8);
    }

    .ondragover {
        transform: scale(1.1);
        opacity: 0.8;
    }


    #box {
        width: 500px;
        /* height: 300px; */
        border: 1px solid #000;
    }
</style>

···

html 部分

   <ul id="list">
        <li>0</li>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
        <li>9</li>
        <li>10</li>
    </ul>
    <button onclick="getLocation()">当前元素顺序</button>
    <div id="msg"></div>

javascript 部分

   <script>

        const $ = (e) => document.querySelector(e)
        const $$ = (e) => document.querySelectorAll(e)

        // 给所有li元素添加可拖动属性draggable
        const list = $('#list')
        const lis = $$('#list li')
        lis.forEach((e, k) => {
            e.draggable = true
            e.dataset.key = k
        })


        // 所有li元素注册拖动事件并设置数据
        for (let i of lis) {
            i.ondragstart = (e) => {
                e.dataTransfer.effectAllowed = 'move';
                let key = e.currentTarget.dataset.key;
                e.dataTransfer.setData("li_key", key); // 设置被拖数据的数据类型和值

                e.target.classList.add('ondrag');
            }

            i.ondragover = (e) => {
                e.target.classList.add('ondragover');
            }
            i.ondragleave = (e) => {
                e.target.classList.remove('ondragover');
            }
        }

        // 在#list中注册 可放置被拖动的数据   默认的拖动数据不可放置,所以要阻止默认事件
        list.ondragover = e => {
            e.preventDefault()
            e.dataTransfer.dropEffect = 'move'
            return false
        }


        list.ondrop = e => {
            if (e.stopPropagation) {
                e.stopPropagation(); // stops the browser from redirecting.
            }
            e.preventDefault()
            const element = GetElement(e)
            console.log(e.toElement, e.toElement === list, e.toElement === e.fromElement);


            if (e.toElement === list) { // 放置在#list上,追加到最后
                e.target.appendChild(element)
                return
            }


            // 放置在其他li元素上,两者位置交换
            const b = e.toElement
            const sa = element.nextSibling === b ? element : element.nextSibling
            b.parentNode.insertBefore(element, b)
            element.parentNode.insertBefore(b, sa)

        }

        function GetElement(e) {
            const key = e.dataTransfer.getData('li_key')
            for (let i of lis) {
                i.classList.remove('ondrag');
                i.classList.remove('ondragover');
            }
            for (let i of lis) {
                if (i.dataset.key === key) return i
            }
        }


        function getLocation() {
            console.log($$('#list li'));
            const vv = $$('#list li')
            const msg = $('#msg')
            let t = ''
            for (let i of vv) {
                t += i.innerHTML
            }
            msg.innerHTML = t

        }

    </script>

image.png

相关文章

  • HTML5 拖拽用法

    实现 html5 中不同 li 拖放后并排序的效果 如果是向外拖动自动放入最后一排,如果移动到另外一个 li 上则...

  • HTML 5 拖拽

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

  • HTML5拖拽(二)--dataTransfer

    从HTML5拖拽(一)我们得知:利用html5的dragable属性以及一些拖拽事件可以进行拖拽,但是无法获得所拖...

  • 控件拖拽

    JavaScript实现最简单的拖拽效果 HTML5 drag & drop 拖拽与拖放简介 基于HTML5 dr...

  • HTML5 拖拽事件

    HTML5 拖拽事件图片自带拖拽功能其他元素也通过设置 draggable=true属性 实现拖拽功能 垃圾(拖拽...

  • HTML5拖拽事件

    HTML5拖拽事件 1. 设置拖拽 图片自带拖拽功能其他元素可设置draggable属性 例子: 1.1. 拖拽元...

  • html5 拖拽API使用

    html5 dragAPI draggable属性(布尔值能否拖拽) onDragStart 开始拖拽 onDra...

  • 拖拽API

    实现拖拽效果 目前实现拖拽效果 HTML5拖拽 源元素事件例子 目标元素事件 从本地拖放图片到页面中 实现拖拽

  • HTML5原生拖动效果实现

    HTML5实现了原生拖动的接口,因此在实现拖拽功能时,可以直接使用该方法。下面用一个例子学习其用法。 案例背景: ...

  • 实现拖拽

    原生js实现 HTML5原生实现:拖拽draggable属性、DataTranfers对象

网友评论

    本文标题:HTML5 拖拽用法

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