【问题标题】:Making inventory with JQuery UI and moving icons使用 JQuery UI 和移动图标制作库存
【发布时间】:2020-08-04 16:23:02
【问题描述】:

使用 JQuery UI,我想将清单中的图标一一移动到蓝色方块中。当我拖动图标时,它们会远离方块。它不被放入正方形中。

我希望每一帧只有一个图标。在 Squares 中拖放时也应该恢复它。

只有图标应该移动。

注意:“拖放进行测试。”

示例:

    $(".account-list div, .inventory-list div").sortable({
        placeholder: "",
        connectWith: ".account-list > div, .inventory-list > div",
        containment: "body",
        revert: true,
        opacity: 0.8,
        zIndex: 9999,
        cursor: "move",
        scroll: false,
        create: function(event, ui) {
            
        },
        start: function(event, ui) {

        },
        create: function(event, ui) {

        },
        update: function(event, ui) {

        }
    }).disableSelection();
body,html{
        padding: 10px;
        font-family: Arial, sans-serif;
        -webkit-user-select: none;
        -ms-user-select: none;
        user-select: none;
    }
    .card {
        width: 260px;
        height: 300px;
        display: inline-grid;
        border: 4px solid rgb(8 208 255);
        background: #ffffff;
        position: relative;
        color: rgb(8 208 255);
        border-radius: 10px;
        font-weight: bold;
        margin-right: 10px;
    }
    .card-title{
        padding: 10px;
        border-bottom: 4px solid rgb(8 208 255);
    }
    .icon {
        background: url(https://svgur.com/i/NVE.svg) center center no-repeat;
        background-size: 40px;
        position: relative;
        display: flex;
        height: 50px;
        width: 50px;
        flex: 1 0 27%;
    }

    .inventory-list{
        display: flex;
        flex-wrap: wrap;
        overflow: auto;
    }

    .account-list{
        display: flex;
        flex-wrap: wrap;
        overflow: auto;
    }

    .slot{
    flex: 1 0 27%;
    margin: 5px;
    background-color: rgb(240 253 255);
    height: 65px;
    width: 65px;
    border: 2px solid #59dfff;
    justify-content: center;
    display: flex;
    align-items: center;
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>



<div class="card">
    <div class="card-title">Inventory</div>
   <div class="inventory-list">
        <div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div><div class="slot"><div class="icon"></div></div>    </div>
</div>

<div class="card">
    <div class="card-title">Account</div>
    <div class="account-list">
        <div class="slot"></div>
        <div class="slot"></div>
        <div class="slot"></div>
        <div class="slot"></div>
        <div class="slot"></div>
        <div class="slot"></div>
        <div class="slot"></div>
        <div class="slot"></div>
        <div class="slot"></div>
    </div>
</div>

【问题讨论】:

  • 库存中的物品需要分类吗?还是用户只是从中抓取一个项目以拖动到帐户列表中?
  • @Twisty 库存中产品的排名无关紧要。库存中的项目和帐户部分中的项目可以相互移动。它可以携带到两侧。
  • 好的,谢谢,所以让两者都可以排序是有意义的,这样项目就可以来回移动。 Inventory 中的顺序并不重要,重要的是 Account 列表中的位置,对吧?
  • @Twisty 是的....

标签: jquery-ui jquery-ui-sortable jquery-ui-draggable jquery-ui-droppable


【解决方案1】:

问题的基本症结在于您有两个可排序的列表,当您将一个项目从一个移动到另一个时,您希望将其附加到容器内,而不是附加到列表本身。

要解决这个问题,您可以做一些事情,我建议将目标设置为可放置的对象,然后可以接受该项目,附加它,并仍然保留它的可排序能力。

考虑以下基本但不完整的示例。

$(function() {
  $(".inventory-list").sortable({
    placeholder: "",
    containment: "body",
    opacity: 0.8,
    zIndex: 9999,
    cursor: "move",
    scroll: false
  });
  $(".account-list").sortable({
    placeholder: "",
    connectWith: ".inventory-list",
    containment: "parent",
    revert: true,
    opacity: 0.8,
    zIndex: 9999,
    cursor: "move",
    scroll: false,
    handle: ".sort-handle"
  });
  $(".slot").droppable({
    accept: ".icon",
    drop: function(e, ui) {
      $("<span>", {
        class: "sort-handle ui-icon ui-icon-grip-diagonal-se"
      }).appendTo(this);
      $(this).append(ui.draggable.clone().attr("style", "").removeClass("ui-sortable-handle ui-sortable-helper")).droppable("disable");
      ui.draggable.remove();
      $(".icon", this).draggable({
        connectWithSortable: ".inventory-list",
        revert: true,
        opacity: 0.8,
        zIndex: 9999,
      });
    }
  });
});
body,
html {
  padding: 10px;
  font-family: Arial, sans-serif;
  -webkit-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

.card {
  width: 260px;
  height: 300px;
  display: inline-grid;
  border: 4px solid rgb(8 208 255);
  background: #ffffff;
  position: relative;
  color: rgb(8 208 255);
  border-radius: 10px;
  font-weight: bold;
  margin-right: 10px;
}

.card-title {
  padding: 10px;
  border-bottom: 4px solid rgb(8 208 255);
}

.icon {
  background: url(https://svgur.com/i/NVE.svg) center center no-repeat;
  background-size: 40px;
  position: relative;
  display: flex;
  height: 50px;
  width: 50px;
  flex: 1 0 27%;
}

.inventory-list {
  display: flex;
  flex-wrap: wrap;
  overflow: auto;
}

.account-list {
  display: flex;
  flex-wrap: wrap;
  overflow: auto;
}

.slot {
  flex: 1 0 27%;
  margin: 5px;
  background-color: rgb(240 253 255);
  height: 65px;
  width: 65px;
  border: 2px solid #59dfff;
  /*justify-content: center;*/
  display: flex;
  /*align-items: center;*/
}

span.sort-handle {
  width: 20px;
  height: 20px;
  align-self: start;
  margin-top: 0;
  cursor: "move";
}

.slot .icon {
  align-self: center;
  margin-left: -20px;
}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<div class="card">
  <div class="card-title">Inventory</div>
  <div class="inventory-list">
    <div class="icon"></div>
    <div class="icon"></div>
    <div class="icon"></div>
    <div class="icon"></div>
    <div class="icon"></div>
    <div class="icon"></div>
    <div class="icon"></div>
    <div class="icon"></div>
    <div class="icon"></div>
    <div class="icon"></div>
    <div class="icon"></div>
    <div class="icon"></div>
    <div class="icon"></div>
    <div class="icon"></div>
    <div class="icon"></div>
  </div>
</div>
<div class="card">
  <div class="card-title">Account</div>
  <div class="account-list">
    <div class="slot"></div>
    <div class="slot"></div>
    <div class="slot"></div>
    <div class="slot"></div>
    <div class="slot"></div>
    <div class="slot"></div>
    <div class="slot"></div>
    <div class="slot"></div>
    <div class="slot"></div>
  </div>
</div>

根据您的描述,这可以满足您的所有需求,但我怀疑您没有列出所有需要的东西。这允许用户从库存中拖动项目并将其添加到帐户容器中。 Inventory 和 Accounts 都可以排序,甚至可以将 Account 拖回 Inventory(几乎)。我怀疑您已经可以看到必须完成的进一步工作。

您可能会考虑将 Inventory 设置为一组可以拖动到 Droppable 容器中的可拖动项目。这些容器可以分类。我会添加按钮,例如还原按钮以将其返回到库存列表,而无需拖动它,从而降低复杂性。用户不会将其移动到另一个容器中,而只是根据需要对容器进行排序。

【讨论】:

  • 通过对我的代码进行小的编辑,我解决了大部分问题。问题 1 个框中添加了多个图标。如果我阻止这种情况,问题将得到解决。 streamable.com/2cpe7r
  • @AlexDenial 我看到了新代码。基本上使每个 DIV 成为单个项目列表。所以现在的挑战是只在列表为空时接受一个项目。我怀疑这将在over 事件中完成。
【解决方案2】:

我一夜没睡,试了13个小时,终于成功了。

var invalid = false;
   $(".inventory-list div, .account-list div").sortable({
       placeholder: " ",
       connectWith: ".inventory-list div, .account-list div",
       containment: ".container",
       opacity: 0.7,
       zIndex: 9999,
       cursor: "pointer",
       scroll: false,
       create: function( event, ui ) {
           if ( !$(this).is(':empty') ){
               $(this).addClass("item-disabled");
           }
       },
       over: function( event, ui ) {
           if( this !== event.currentTarget ){
               if($(event.target).hasClass("item-disabled")   ){
                   invalid = true;
               }
           }
       },
       over: function(event,ui){
          invalid = false;
           if( this !== event.currentTarget ){
               if( $(event.target).hasClass("item-disabled") ){
                 invalid = true;
               }
           }
       },
       remove: function( event, ui ) {
           if(invalid != true){
               $(this).removeClass("item-disabled");
           }
       },
       receive: function( event, ui ) {
           if(invalid == true){
               ui.sender.sortable("cancel");
           }
           $(this).addClass("item-disabled");
       }
   });
html, body, div, span, applet, object, iframe,
    h1, h2, h3, h4, h5, h6, p, blockquote, pre,
    a, abbr, acronym, address, big, cite, code,
    del, dfn, em, img, ins, kbd, q, s, samp,
    small, strike, strong, sub, sup, tt, var,
    b, u, i, center,
    dl, dt, dd, ol, ul, li,
    fieldset, form, label, legend,
    table, caption, tbody, tfoot, thead, tr, th, td,
    article, aside, canvas, details, embed,
    figure, figcaption, footer, header, hgroup,
    menu, nav, output, ruby, section, summary,
    time, mark, audio, video {
        margin: 0;
        padding: 0;
        border: 0;
        font-size: 100%;
        font: inherit;
        vertical-align: baseline;
    }
    body{
        background: #f5f5f5;
        font-family: Arial, sans-serif;
        -webkit-user-select: none;
        -ms-user-select: none;
        user-select: none;
    }
    .card {
        width: 260px;
        display: inline-grid;
        border: 2.5px solid rgb(8 208 255);
        background: #ffffff;
        position: relative;
        color: rgb(8 208 255);
        border-radius: 10px;
        font-weight: bold;
        margin-right: 10px;
        margin-bottom: 20px;
    }
    .card-title{
        padding: 10px;
        border-bottom: 4px solid rgb(8 208 255);
        background: #08d0ff;
        color: white;
        text-align: center;
    }
    .icon {
        background-size: 60px;
        background-position: center center;
        background-repeat: no-repeat;
        display: flex;
        height: 50px;
        width: 50px;
        flex: 1 0 27%;
        position: relative;
    }
    .c1{
        background-image: url('https://image.flaticon.com/icons/svg/927/927593.svg');
    }
    .c2{
        background-image: url('https://image.flaticon.com/icons/svg/859/859205.svg');
    }
    .c3{
        background-image: url('https://image.flaticon.com/icons/svg/148/148919.svg');
    }
    .c4{
        background-image: url('https://image.flaticon.com/icons/svg/148/148838.svg');
    }
    .c5{
        background-image: url('https://image.flaticon.com/icons/svg/138/138292.svg');
    }
    .c6{
        background-image: url('https://image.flaticon.com/icons/svg/148/148808.svg');
    }


    .inventory-list{
        display: flex;
        flex-wrap: wrap;
        padding: 5px;
    }

    .account-list{
        display: flex;
        flex-wrap: wrap;
        padding: 5px;
    }
    .account-list, .inventory-list{
        min-height: 315px;
        background-color: rgb(240 253 255);
        border-radius: 10px;
    }
    .slot{
        flex: 1 0 27%;
        margin: 5px;
        height: 65px;
        width: 65px;
        border: 2px solid #59dfff;
        justify-content: center;
        display: flex;
        align-items: center;
        background: white;
    }
    .container{
        text-align: center;
        padding-top: 20px;
    }
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Inventory System</title>
    <meta name="theme-color" content="#08d0ff" />
    <meta name="msapplication-navbutton-color" content="#08d0ff" />
    <meta name="apple-mobile-web-app-status-bar-style" content="#08d0ff" />
</head>
<body>


<div class="container">

    <div class="card">
        <div class="card-title">Inventory</div>
        <div class="inventory-list">
            <div class="slot"><span class="icon c1"></span></div>
            <div class="slot"><span class="icon c2"></span></div>
            <div class="slot"><span class="icon c3"></span></div>
            <div class="slot"><span class="icon c4"></span></div>
            <div class="slot"><span class="icon c5"></span></div>
            <div class="slot"><span class="icon c6"></span></div>
             <div class="slot"></div>
              <div class="slot"></div>
 <div class="slot"></div>
        </div>
    </div>

    <div class="card">
        <div class="card-title">Account</div>
        <div class="account-list">
          <div class="slot"></div>
          <div class="slot"></div>
          <div class="slot"></div>
          <div class="slot"></div>
          <div class="slot"></div>
          <div class="slot"></div>
           <div class="slot"></div>
            <div class="slot"></div>
             <div class="slot"></div>
        </div>
    </div>

</div>


<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui-touch-punch/0.2.3/jquery.ui.touch-punch.min.js"></script>

</body>
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多