javascript - Gridstack:将小部件从一个网格拖到另一个嵌套的网格中

标签 javascript jquery drag-and-drop nested gridstack

我正在尝试创建此行为,但不确定 Gridstack 是否支持它。我有 3 个 Gridstack 网格:Grid1Grid2Grid3Grid1 是一个独立的网格,Grid3 嵌套在 Grid2 中。我需要能够将小部件从 Grid1 拖到 Grid2(外部网格)和 Grid3(嵌套网格)中。按照示例,我能够在 2 个顶级网格之间拖动小部件并创建嵌套网格,但不能将这 2 个组合在一起。如果支持 - 任何指针都将不胜感激。

注意:将代码段展开到全屏

$(document).ready(function() {
  $('.grid-stack').gridstack();
});
.grid-stack {
  background: lightgoldenrodyellow;
}

.grid-stack-item-content {
  color: #2c3e50;
  text-align: center;
  background-color: #18bc9c;
}

.grid-stack .grid-stack {
  /*margin: 0 -10px;*/
  background: rgba(255, 255, 255, 0.3);
}

.grid-stack .grid-stack .grid-stack-item-content {
  background: lightpink;
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.4.0/gridstack.min.css" />


<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.0/jquery-ui.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js"></script>
<script type="text/javascript" src='//cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.4.0/gridstack.min.js'></script>
<script type="text/javascript" src='//cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.4.0/gridstack.jQueryUI.min.js'></script>


<div class="container-fluid">
  <h1> Multilevel Nested grids demo</h1>
  <div class="grid-stack" id="container-stack">
    <div class="grid-stack-item" data-gs-x="0" data-gs-y="0" data-gs-width="4" data-gs-height="4">
      <div class="grid-stack-item-content">
        <span>Grid One</span>
        <div class="grid-stack" id="grid-one">
          <div class="grid-stack-item widget" data-gs-x="0" data-gs-y="0" data-gs-width="3" data-gs-height="1">
            <div class="grid-stack-item-content">1</div>
          </div>
          <div class="grid-stack-item widget" data-gs-x="3" data-gs-y="0" data-gs-width="3" data-gs-height="1">
            <div class="grid-stack-item-content">2</div>
          </div>
        </div>
      </div>
    </div>
    <div class="grid-stack-item" data-gs-x="4" data-gs-y="0" data-gs-width="8" data-gs-height="4">
      <div class="grid-stack-item-content">
        <span>Grid Two</span>
        <div class="grid-stack" id="grid-two">
          <div class="grid-stack-item widget" data-gs-x="0" data-gs-y="0" data-gs-width="3" data-gs-height="1">
            <div class="grid-stack-item-content">3</div>
          </div>
          <div class="grid-stack-item widget" data-gs-x="3" data-gs-y="0" data-gs-width="3" data-gs-height="1">
            <div class="grid-stack-item-content">4</div>
          </div>
          <div class="grid-stack-item" data-gs-x="6" data-gs-y="0" data-gs-width="6" data-gs-height="3">
            <div class="grid-stack-item-content">
              <span>Grid Three</span>
              <div class="grid-stack" id="grid-three">
                <div class="grid-stack-item widget" data-gs-x="0" data-gs-y="0" data-gs-width="6" data-gs-height="1">
                  <div class="grid-stack-item-content">5</div>
                </div>
                <div class="grid-stack-item widget" data-gs-x="6" data-gs-y="0" data-gs-width="6" data-gs-height="1">
                  <div class="grid-stack-item-content">6</div>
                </div>
              </div>
            </div>
          </div>

        </div>

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

最佳答案

Following samples I was able to drag widgets between 2 top level grids and create a nested grid, but not combining these 2 together. If this is supported

可悲的是,这不可能。至少,不是 gridstack .

这个拖动机制背后的关键是由 acceptWidgets 完成的选项。但这无法处理多级 .grid-stack元素。因此,出现错误。

您可以尝试将代码段中添加的脚本修改为如下内容:

$("#container-stack").gridstack({
   acceptWidgets: '.grid-stack-item'
})

但遗憾的是,一旦您开始拖动任何小部件,这将导致错误。但它适用于单级嵌套,这绝对不是您要找的。

文档也没有说明任何关于嵌套级别拖动的内容。

但我认为这是不可能的原因是这个 issue , 还有 this one .

我想这(几乎)正是您想要的。但没有得到任何官员的回应。而且,它已经三岁了。另一个表明该项目即将结束的缺陷是当您尝试访问他们的一些文件时,例如 script ,你会收到一个安全警告,这让我暂时无法添加此代码段。


因此,如果我是你,我会选择jqueryUI并自定义代码。


更新

这是我猜想的与您预期的类似的片段,请告诉我这是否正确,然后我会再次改进它,例如添加调整大小、对齐同级小部件以及其他一些东西:

再次在全屏模式下检查代码段。

$("#gridThree").draggable({
  snap: '#gridTwo',
  snapMode: 'inner',
  zIndex: 5,
  containment: 'parent'
});

$(".widgetInOne, .widgetInTwo, .widgetInThree").draggable({
  snap: '#gridOne, #gridTwo, #gridThree',
  snapMode: 'inner',
  zIndex: false,
  stack: 'div',
  cursor: 'grab',
  // grid: [ 100, 100 ]
});

$("#gridOne, #gridTwo, #gridThree").droppable({
  accept: '.widgetInOne, .widgetInTwo, .widgetInThree',
  drop: function(event, ui) {
    if ($(event.target).find($(event.toElement)).length == 0) {
      $(event.toElement).css({
        'left': '',
        top: ''
      });
      $(event.target).append($(event.toElement));
    }
  }
});
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

#gridOne {
  background: #cecece;
  width: 40%;
  height: 400px;
  display: inline-block;
  margin-right: 4%;
  vertical-align: top;
}

.widgetInOne,
.widgetInTwo,
.widgetInThree {
  width: 100px;
  height: 100px;
  padding: 0.5em;
}

#gridTwo {
  background: #bfe9f3;
  width: 50%;
  height: 400px;
  display: inline-block;
  margin-left: 4%;
  vertical-align: top;
  position: relative;
}

#gridThree {
  background: #ffdda9;
  width: 300px;
  height: 300px;
  display: inline-block;
  vertical-align: top;
  position: absolute;
  right: 100px;
  top: 0;
}
<link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<link rel="stylesheet" href="https://jqueryui.com/resources/demos/style.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>



<div id="gridOne">
  <div class="ui-widget-content widgetInOne">
    <p>One</p>
  </div>
</div>


<div id="gridTwo">
  <div class="ui-widget-content widgetInTwo">
    <p>Two</p>
  </div>
  <div id="gridThree">
    <div class="ui-widget-content widgetInThree">
      <p>Three</p>
    </div>
  </div>
</div>

这里有一些值得注意的事情:

  • 当您将小部件拖到网格中时,小部件元素实际上会在该网格中移动(在 DOM 结构中),因此任何依赖父级的 css 选择器在这里可能不起作用。仅将 css 应用于小部件类。
  • 目前小部件仅捕捉到网格内边缘(而不是其他小部件的外侧),以查找更多检查:here除了使用 // grid: [ 100, 100 ],我找不到任何其他选择。对于这个。

  • 这里还没有添加可调整大小的选项,希望您可以根据需要进行调整

关于javascript - Gridstack:将小部件从一个网格拖到另一个嵌套的网格中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55818594/

相关文章:

java - 从 JavaScript 调用托管 bean 方法以最终填充 Primefaces 对话框组件

javascript - 单击时,在 d3.js 中将其他数据显示在单独的 div 中;按值(value)传递

Javascript:在所有异步调用返回后调用函数

java - 可以在同一应用程序内的 JComponent 之间的 DnD 中避免序列化吗?

javascript - 如何将文本框中的值保存到变量

jquery - jqm datebox,模式时间框给出错误 'There is no mode by that name loaded/mode not given'

javascript - 尝试访问 json 对象时出现 'Cannot find variable' 错误

javascript - 自动为博客中的每个视频添加 html 代码

objective-c - 在 NSCollectionView 子类中接受拖动操作

java - GWT-DnD(拖放)布局问题