首页 > 其他分享 >拖拽排序

拖拽排序

时间:2022-09-23 13:58:00浏览次数:51  
标签:el style target val draging var 排序 拖拽

<!doctype html>
<html>

<head>
    <meta charset="UTF-8">
    <title>拖拽排序</title>
    <style>
        ul {
            list-style: none;
            margin: 200px;
            font-size: 0;
        }

        .ele {
            font-size: 16px;
            width: 100px;
            height: 40px;
            border: 1px solid #999;
            background: #EA6E59;
            margin: 2px 0;
            border-radius: 10px;
            padding-left: 10px;
            color: white;
            cursor: move;
        }
    </style>
</head>

<body>

    <!DOCTYPE html>
    <html lang="en">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=<device-width>, initial-scale=1.0">
        <link rel="stylesheet" href="./index.css">
        <script type="text/javascript" src="./index.js" defer></script>
        <title>Document</title>
    </head>

    <body>
        <div>
            <ul id="container">
                <li class="ele" draggable="true"><div>1</div></li>
                <li class="ele" draggable="true">2</li>
                <li class="ele" draggable="true">3</li>
                <li class="ele" draggable="true">4</li>
                <li class="ele" draggable="true">5</li>
                <li class="ele" draggable="true">6</li>
                <li class="ele" draggable="true">7</li>
                <li class="ele" draggable="true">8</li>
            </ul>
        </div>
    </body>

    </html>
</body>

</html>
<script>
    var node = document.querySelector("#container")
    var draging = null
    node.ondragstart = function (event) {
        console.log("start:")
        // dataTransfer.setData把拖动对象的数据存入其中,可以用dataTransfer.getData来获取数据
        event.dataTransfer.setData("te", event.target.innerText)
        draging = event.target
    }
    node.ondragover = function (event) {
        console.log("over:")
        // 默认地,无法将数据/元素放置到其他元素中。如果需要设置允许放置,必须阻止对元素的默认处理方式
        event.preventDefault()
        var target = event.target
        if (target.nodeName === "LI" && target !== draging) {
            // 获取初始位置
            var targetRect = target.getBoundingClientRect()
            var dragingRect = draging.getBoundingClientRect()
            if (target) {
                // 判断是否动画元素
                if (target.animated) {
                    return;
                }
            }
            if (_index(draging) < _index(target)) {
                // 目标比元素大,插到其后面
                // extSibling下一个兄弟元素
                target.parentNode.insertBefore(draging, target.nextSibling)
            } else {
                // 目标比元素小,插到其前面
                target.parentNode.insertBefore(draging, target)
            }
            _animate(dragingRect, draging)
            _animate(targetRect, target)
        }
    }
    // 获取元素在父元素中的index
    function _index(el) {
        var index = 0
        if (!el || !el.parentNode) {
            return -1
        }
        // previousElementSibling:上一个兄弟元素
        while (el && (el = el.previousElementSibling)) {
            index++
        }
        return index
    }
    // 触发动画
    function _animate(prevRect, target) {
        var ms = 300
        if (ms) {
            var currentRect = target.getBoundingClientRect()
            if (prevRect.nodeType === 1) {
                prevRect = prevRect.getBoundingClientRect()
            }
            _css(target, 'transition', 'none')
            _css(target, 'transform', 'translate3d(' +
                (prevRect.left - currentRect.left) + 'px,' +
                (prevRect.top - currentRect.top) + 'px,0)'
            );

            target.offsetWidth; // 触发重绘

            _css(target, 'transition', 'all ' + ms + 'ms');
            _css(target, 'transform', 'translate3d(0,0,0)');
            // 事件到了之后把transition和transform清空
            clearTimeout(target.animated);
            target.animated = setTimeout(function () {
                _css(target, 'transition', '');
                _css(target, 'transform', '');
                target.animated = false;
            }, ms);
        }
    }
    // 给元素添加style
    function _css(el, prop, val) {
        var style = el && el.style
        if (style) {
            if (val === void 0) {
                if (document.defaultView && document.defaultView.getComputedStyle) {
                    val = document.defaultView.getComputedStyle(el, '')
                } else if (el.currentStyle) {
                    val = el.currentStyle
                }
                return prop === void 0 ? val : val[prop]
            } else {
                if (!(prop in style)) {
                    prop = '-webkit-' + prop;
                }
                style[prop] = val + (typeof val === 'string' ? '' : 'px')
            }
        }
    }
</script>

 

标签:el,style,target,val,draging,var,排序,拖拽
From: https://www.cnblogs.com/Ma-YuHao/p/16722449.html

相关文章

  • 归并排序
    平均时间复杂度:O(nlogn)最佳时间复杂度:O(n)最差时间复杂度:O(nlogn)空间复杂度:O(n)排序方式:In-place稳定性:稳定defmerge_sort(num1,num2):#按大小合并数组......
  • 「浙江理工大学ACM入队200题系列」问题 A: 零基础学C/C++34—— 3个数比较大小(冒泡排
    深夜写的,代码都还没来得及跑一便,可能有错误,欢迎指出,后续会检验一遍并修改错误.本题是浙江理工大学ACM入队200题第四套中的A题,同时给出了冒泡排序和选择排序算法......
  • python基础__十大经典排序算法
    用Python实现十大经典排序算法!排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序......
  • 排序方法
    所谓排序、就是根据排序码的递增或者递减序列把数据元素依次排列起来,使一组任意排列的元素变为一组按其排序码线性有序的元素。八大排序是《数据结构》这门大学计算机必修......
  • C++排序程序
      今天,有点感冒。粘贴个图片,有空再写代码。   ......
  • Capital Program 剩下k个点的集合,到其它所有点的最大距离最小 拓扑排序
    链接:https://ac.nowcoder.com/acm/contest/35146/B来源:牛客网题目描述Thereisakingdomthathasnnncitiesconnectedbyn−1n-1n−1r......
  • 自认玄学的一道排序题???
    这两天回头大复习,做了一下洛谷的一道题知识点是手写快排加分治P1923【深基9.例4】求第k小的数自己写的代码交了20篇整才照着题解写出来篇AC的(太屑了然而还有好多问......
  • Antd Tree,实现排序拖动,父子层级内外拖动
    拖动属性dropToGap,dropPosition属性解释:dropToGap:boolean类型,true代表拖拽到节点之间的缝隙中,false代表拖拽到节点上,即节点的内容区。dropPosition:拖拽的时候,针对一......
  • LeetCode 做题 简单【 删除排序链表中的重复元素】 链表
    【删除排序链表中的重复元素】给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例1:输入:head=[1,1,2]输......
  • 排序算法基本思想及实现
    一、插入排序1、直接插入排序基本思想:类似抓扑克牌,待排序元素在已排序的序列中从后往前遍历,遇到小于他的元素向后移一位,直至遇到小于或等于他的元素,在其后插入即......