sortable.js实现分类拖动

如题,使用sortable实现的分类拖动,且每个盒子只能容纳同类型的一个,实现效果如下图,拖动拖拽组A或者B到容器组,每个容器只能装一个A和B,拖动到容器后,拖拽项目会缩小然后消失,类似桌面垃圾桶效果

 实现代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>闯关游戏</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, minimal-ui">
    <script src="./js/Sortable.min.js"></script>
    <script src="./js/jquery-3.5.1.min.js"></script>
    <style>

      .itxst {
            margin: 10px auto;
            width: 30%;
            float: left;
            margin-right: 10px;
        }
        .itxst div {
                padding: 6px;
                background-color: #fdfdfd;
                border: solid 1px #eee;
                margin-bottom: 10px;
                cursor: move;
            }
        #msg {
        clear:both;
        width:100%;
        }
        .itembox{
            width: 100px;
            height: 100px;
            border: solid 1px #eee;
            margin-bottom: 10px;
        }
        .active{
            transition: All 0.4s ease-in-out;
            -webkit-transition: All 0.4s ease-in-out;
            -moz-transition: All 0.4s ease-in-out;
            -o-transition: All 0.4s ease-in-out;
            transform: scale(0.1);
            -webkit-transform: scale(0.1);
            -moz-transform: scale(0.1);
            -o-transform: scale(0.1);
            -ms-transform: scale(0.1);
        }

        .activeBig{
           animation:mymove 3s 1;
           -webkit-animation:mymove 3s 1; /*Safari and Chrome*/
        }

        @keyframes mymove
            {
            0%{
            transform: scale(1);  /*开始为原始大小*/
            }
            50%{
                transform: scale(1.2);
            }
            100%{
                transform: scale(1);
            }

        }
        
        @-webkit-keyframes mymove
        {
            0%{
            transform: scale(1);  /*开始为原始大小*/
            }
            50%{
                transform: scale(1.2);
            }
            100%{
                transform: scale(1);
            }
        }
       
    </style>
</head>
<body> 
<div class="outbox">
    <div class="itxst">
        <div>容器组组</div>
        <div class="itembox" id="g1">容器 1</div>
        <div class="itembox" id="g2">容器 2</div>
        <div class="itembox" id="g3">容器 3</div>
        <div class="itembox" id="g4">容器 4</div>
        <div class="itembox" id="g5">容器 5</div>
    </div>
    <div id="abox" class="itxst">
        <div>拖拽组A</div>
        <div class="item" data-id="a">拖拽组A1</div>
        <div class="item" data-id="a">拖拽组A2</div>
        <div class="item" data-id="a">拖拽组A3</div>
        <div class="item" data-id="a">拖拽组A4</div>
        <div class="item" data-id="a">拖拽组A5</div>
    </div>
    <div id="bbox"  class="itxst">
        <div>拖拽组B</div>
        <div class="item" data-id="b">拖拽组B1</div>
        <div class="item" data-id="b">拖拽组B2</div>
        <div class="item" data-id="b">拖拽组B3</div>
        <div class="item" data-id="b">拖拽组B4</div>
        <div class="item" data-id="b">拖拽组B5</div>
    </div>
</div>
<script>
    //第一组
    var moveItemId = null;
    var g1 = document.getElementById('g1');
    var g2 = document.getElementById('g2');
    var g3 = document.getElementById('g3');
    var g4 = document.getElementById('g4');
    var g5 = document.getElementById('g5');
    var ops1 = {
        animation: 1000,
        draggable: ".item",
        sort: false,
        group: {
            name: "itxst.com",
            pull: false,
            put: function (evt) {
                if (moveItemId === 'a') {
                    if ($(evt.el).attr('hasa')) { // 如果已经存在A组的一个元素,则不能添加A的
                       return false;
                    }
                } else if (moveItemId === 'b') {
                    if ($(evt.el).attr('hasb')) { // 如果已经存在B组的一个元素,则不能添加B的
                       return false;
                    }
                }
                return true;
            }
        },
        onAdd: function (evt) {
            $(evt.to).addClass('activeBig');
            if (evt.item.dataset.id === 'a') {
                $(evt.to).attr('hasa', true);
            } else if (evt.item.dataset.id === 'b') {
                $(evt.to).attr('hasb', true);
            }
            setTimeout(() => {
              $(evt.to).removeClass('activeBig')
            }, 500);

            overfun();
        }
    };
    var sortable1 = Sortable.create(g1, ops1);
    var sortable2 = Sortable.create(g2, ops1);
    var sortable3 = Sortable.create(g3, ops1);
    var sortable4 = Sortable.create(g4, ops1);
    var sortable5 = Sortable.create(g5, ops1);
    //第二组
    var abox = document.getElementById('abox');
    var ops2 = {
        animation: 500,
        draggable: ".item",
        sort: false,
        group: { name: "itxst.com", pull: true, put: false },
        //开始拖动记录下用户点击的那个元素
        onStart: function (evt) {
            moveItemId = evt.clone.dataset.id;
        },
        onRemove: function (evt) {
            $(evt.item).addClass('active');
            setTimeout(() => {
              $(evt.item).remove()
            }, 800);
        }
    };
    var sortable4 = Sortable.create(abox, ops2);
    //第三组
    var bbox = document.getElementById('bbox');
    var ops3 = {
        animation: 500,
        draggable: ".item",
        sort: false,
        group: { name: "itxst.com", pull: true, put: false },
        //开始拖动记录下用户点击的那个元素
        onStart: function (evt) {
            moveItemId = evt.clone.dataset.id;
        },
        onRemove: function (evt) {
            $(evt.item).addClass('active');
            setTimeout(() => {
              $(evt.item).remove()
            }, 800);
        }
    };
    var sortable5 = Sortable.create(bbox, ops3);

    // 判断是否拖动完所有的
    function overfun() {
        var flaga = false, flagb = false;
        $('.itembox').each(function() {
            if (!$(this).attr('hasa')) {
               flaga = true;
               return false;
            }
        })
        $('.itembox').each(function() {
            if (!$(this).attr('hasb')) {
               flagb = true;
               return false;
            }
        })
        console.log(flaga, flagb)
        if (!flaga && !flagb) {
            alert('拖完了!')
        }
    }
</script>
</body>
</html>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sortable.js是一个用于实现拖拽排序的JavaScript库。它可以帮助你创建可拖拽的列表、表格或其他元素,并提供一些有用的提示功能。 要添加拖拽提示,你可以使用Sortable.js提供的一些事件和选项。以下是一个示例,展示了如何使用Sortable.js来创建一个拖拽排序的列表,并添加拖拽提示: ```html <!DOCTYPE html> <html> <head> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.13.0/Sortable.min.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.13.0/Sortable.min.js"></script> </head> <body> <ul id="sortable-list"> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> <li>Item 4</li> </ul> <script> var sortableList = Sortable.create(document.getElementById("sortable-list"), { animation: 150, // 动画持续时间(以毫秒为单位) ghostClass: "sortable-ghost", // 拖拽元素的样式类 chosenClass: "sortable-chosen", // 选中元素的样式类 dragClass: "sortable-drag", // 拖拽过程中元素的样式类 // 拖拽开始时的回调函数 onStart: function (evt) { evt.item.classList.add("sortable-dragging"); }, // 拖拽结束时的回调函数 onEnd: function (evt) { evt.item.classList.remove("sortable-dragging"); } }); </script> </body> </html> ``` 在上述示例中,我们创建了一个带有id为"sortable-list"的无序列表,并使用Sortable.create()方法将其转换为可拖拽排序的列表。我们还设置了一些选项,例如动画持续时间、拖拽元素的样式类等。 在拖拽开始时,我们使用onStart回调函数给被拖拽的元素添加了一个名为"sortable-dragging"的样式类,以突出显示正在拖拽的元素。在拖拽结束时,我们使用onEnd回调函数将该样式类移除。 你可以根据自己的需求来定义这些样式类,以实现你想要的拖拽提示效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值