前端拖拽Demo

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>拖拽事件</title>
    <style>
        body, html {
            background: #fefefe;
            padding: 0;
            margin: 0;
        }

        div.drop {
            width: calc(100% - 24px);
            min-height: 50px;
            padding: 10px;
            border: 2px solid #aaaaaa;
            overflow: hidden;
        }

        div.drop .notag {
            position: relative;
            display: flex;
            overflow: hidden;
            margin-bottom: 4px;
            border: 1px solid #d0d0d0;
            height: 50px;
            cursor: grab;
        }

        div.drop .notag:last-child {
            margin-bottom: 0;
        }

        div.drop.asset .notag.drop-active {
            border: 1px solid red;
        }

        div.drop .notag.drop-active {
            border: 1px solid #03ff03;
        }

        img {
            width: 100%;
            height: auto;
        }

        div#edit {
            padding: 5px;
            border: 1px solid rgba(0, 0, 0, 0);
        }

        div#edit:focus-visible {
            outline: none;
            border: 1px solid #5FB878;
        }

        .container {
            display: flex;justify-content: space-around;
        }

        .container > div {
            width: 24.9%;overflow: hidden;
        }
    </style>
</head>
<body>
<div class="container">
    <div>
        <h2>仓库(内容复制)</h2>
        <div class="drop drop-contain asset" data-type="*" ondrop="drop(event)">
            <div id="1" class='notag  img clone' draggable="true" ondragstart="dragstart(event)"
                 ondragenter="dragenter(event)" ondragover="dragover(event)"
                 ondragleave="dragleave(event)"
                 ondragend="dragend(event)">
                <div>图片1</div>
                <img alt=""
                     src="D:\Users\feihh\Pictures\表情\chiikawa\1d30151474979410f18a73f46f831f53382573593.gif@.webp"/>
            </div>

            <div id="2" class='notag img clone' draggable="true" ondragstart="dragstart(event)"
                 ondragenter="dragenter(event)" ondragover="dragover(event)"
                 ondragleave="dragleave(event)"
                 ondragend="dragend(event)">
                <div>图片2</div>
                <img alt=""
                     src="D:\Users\feihh\Pictures\表情\chiikawa\1e85d2a3517d8c4c38858daf409ac256382573593.gif@.webp"/>
            </div>

            <div id="3" class='notag img clone' draggable="true" ondragstart="dragstart(event)"
                 ondragenter="dragenter(event)" ondragover="dragover(event)"
                 ondragleave="dragleave(event)"
                 ondragend="dragend(event)">
                <div>图片3</div>
                <img alt="" src="D:\Users\feihh\Pictures\表情\chiikawa\18dd75f3d8324817a51da612d51a2bf6.webp"/>
            </div>
        </div>
    </div>

    <div>
        <h2>内容区1</h2>
        <div class="drop drop-contain" ondrop="drop(event)" ondragover="dragover(event)">
            <div id="4" class='notag  img' data-type="9876544455" draggable="true" ondragstart="dragstart(event)"
                 ondragenter="dragenter(event)"
                 ondragover="dragover(event)"
                 ondragleave="dragleave(event)"
                 ondragend="dragend(event)">
                <div>图片4</div>
                <img alt="" src="D:\Users\feihh\Pictures\PixPin_2024-10-09_11-38-22.png"/>
            </div>
        </div>
    </div>

    <div>
        <h2>内容区2</h2>
        <div class="drop drop-contain" ondrop="drop(event)" ondragover="dragover(event)">
            <div id="5" class='notag  img' data-type="7864315110" draggable="true" ondragstart="dragstart(event)"
                 ondragenter="dragenter(event)"
                 ondragover="dragover(event)"
                 ondragleave="dragleave(event)"
                 ondragend="dragend(event)">
                <div>图片5</div>
                <img alt="" src="D:\Users\feihh\Pictures\PixPin_2024-10-09_11-39-53.png"/>
            </div>
        </div>
    </div>

    <div>
        <h2>垃圾箱</h2>
        <div class="drop drop-contain" ondrop="drop(event)" ondragover="dragover(event)"
             style="border: 2px solid red;">

        </div>
    </div>
</div>

<div><span contenteditable="true" id="edit" data-text="这是一个可编辑的div。1">这是一个可编辑的span。</span>


    <script>
        function dragover(ev) {
            //阻止浏览器默认行为,使浏览器可以被拖拽
            ev.preventDefault();
            let currentTarget = ev.currentTarget;
            currentTarget.classList.add("drop-active");
        }

        function dragstart(ev) {

            ev.dataTransfer.setData("text/plain", ev.currentTarget.id); // 获取元素并储存起来
        }

        function dragenter(ev) {
            ev.preventDefault();

            let currentTarget = ev.currentTarget;
            currentTarget.classList.add("drop-active");
        }

        function dragleave(ev) {
            ev.preventDefault();

            let currentTarget = ev.currentTarget;
            currentTarget.classList.remove("drop-active");
        }

        // 持有源元素
        function dragend(ev) {
            ev.preventDefault();
            let currentTarget = ev.currentTarget;
            currentTarget.classList.remove("drop-active");
        }

        // ondrop
        function drop(ev) {
            ev.preventDefault();
            newDrop(ev)
        }

        let i = 5;

        function newDrop(ev) {
            //通过类型获取值
            let id = ev.dataTransfer.getData("text/plain");
            //将图片追加到当前元素的子元素中
            //target当前元素本身
            let current = document.getElementById(id);
            let target = getTarget(ev.target);
            if (target == null || current === target) { // 源元素和目标元素一样 不改变
                return;
            }
            console.log(current)
            if (current.parentNode === target) { // 目标元素就是父容器 不改变
                return;
            }
            if (target.parentNode.classList.contains('asset')) { // 目标元素就是父容器 不改变
                // 禁止往仓库拖拽
                target.classList.remove("drop-active");
                return;
            }

            current = getCurrent(current);
            if (!target.classList.contains('notag')) {
                target.appendChild(current);
                return;
            }
            let moveLayerY = ev.y + window.scrollY;
            let currentBottom = current.offsetTop + current.offsetHeight;
            if (moveLayerY > currentBottom) { // 插入目标元素之后
                target.after(current);
                target.classList.remove("drop-active");
                return;
            }
            target.parentNode.insertBefore(current, target); // 插入目标元素之前
            target.classList.remove("drop-active");
        }

        function getTarget(target) {
            if (!target.classList) {
                return null;
            }
            let targetClassList;
            while (target) {
                targetClassList = target.classList;
                if (targetClassList.contains("notag") || targetClassList.contains("drop-contain")) {
                    return target;
                }
                target = target.parentNode;
            }
        }

        function getCurrent(current) {
            if (current.parentNode.classList.contains('asset')) {
                current = current.cloneNode(true);
                current.id = ++i;
            }
            return current;
        }

        document.getElementById("edit").addEventListener("blur", (e) => {
            let resource = e.target.attributes['data-text'].value;
            if (resource !== e.target.textContent) {
                console.log(e.target.textContent)
                e.target.attributes['data-text'].value = e.target.textContent
            }

        }, false);
    </script>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值