【问题标题】:jQueryUI Sortable Item Incorrect Position While Dragging拖动时jQueryUI可排序项目位置不正确
【发布时间】:2014-04-16 10:51:19
【问题描述】:

我有一个 jQueryUI 可排序列表,其中包含三个 bootstrap 面板,面板 1 和 2 以正确的初始位置开始拖动,但是,每当您尝试拖动面板 3 时,它就会落在面板 1 与光标的偏移下。 Live demo

HTML

<ul id="sortable">
    <li class="col-xs-4">
        <div class="panel panel-default">
            <div class="panel-heading ui-sortable-handle">1</div>
            <div class="panel-body"></div>
        </div>
    </li>
    <li class="col-xs-4">
        <div class="panel panel-default">
            <div class="panel-heading ui-sortable-handle">2</div>
            <div class="panel-body"></div>
        </div>
    </li>
    <li class="col-xs-4">
        <div class="panel panel-default">
            <div class="panel-heading ui-sortable-handle">3</div>
            <div class="panel-body"></div>
        </div>
    </li>
</ul>

JavaScript

$('#sortable').sortable({
    tolerance: 'pointer',
    handle: '.panel-heading',
    placeholder: 'col-xs-4 panel-al-placeholder',
    start: function (e, ui) {
        ui.placeholder.height(ui.item.children().height());
    }
});

CSS

ul {
    width: 650px;
    list-style: none;
    padding: 0;
    margin: 0;
}
.panel-al-placeholder {
    margin-bottom: 18px;
    border:2px solid #f8e287;
    background:#fef9e7
}

【问题讨论】:

  • 你在哪个浏览器中测试这个?在 chrome 中,您的 jsfiddle 为所有 3 个面板提供了正确的 left 位置
  • @FabioG 似乎只有在容器达到一定大小时才会发生这种情况,请查看fiddle
  • @KyleNeedham 它似乎只发生在width: 650px,虽然我不知道为什么:Fiddle。顺便说一句,你的小提琴链接没有更新。
  • @ReCaptcha 它发生在650 - 680 - 710 每个30px + or -
  • @KyleNeedham 我用旧版本的 jQuery 试过这个,然后它似乎工作正常。 Fiddle.

标签: javascript jquery jquery-ui twitter-bootstrap


【解决方案1】:

我遇到了类似的问题,将助手设置为克隆模式对我有用:

$('#sortable').sortable({
    helper: 'clone'
});

【讨论】:

  • 好主意,我没想过这样做。
  • 我不知道这样的功能和助手。伟大的知识要学习。解决了我的可排序 ui 问题。
【解决方案2】:

我遇到了同样的问题。过去我发现引导程序设置为全局的 CSS stylebox-sizing: border-box; 可能会导致一些 javascript 库出现问题,据我所知,这在这种情况下是问题所在。我想出了一个快速修复,将列的 box-sizing 设置回 CSS2 默认 box-sizing: content-box;

不幸的是,这对引导程序中的列布局造成了严重破坏,因为列的填充现在添加到百分比宽度上,因此我们的 3 列最终宽度超过 100%。对于我的代码,我实际上不需要列之间的任何填充,因此我只需在列上设置负边距以抵消额外的宽度。

有关 box-sizing CSS 属性的更多信息:https://developer.mozilla.org/en-US/docs/Web/CSS/box-sizing

Live demo

HTML

<ul id="sortable">
    <li class="col-xs-4">
        <div class="panel panel-default">
            <div class="panel-heading ui-sortable-handle">1</div>
            <div class="panel-body"></div>
        </div>
    </li>
    <li class="col-xs-4">
        <div class="panel panel-default">
            <div class="panel-heading ui-sortable-handle">2</div>
            <div class="panel-body"></div>
        </div>
    </li>
    <li class="col-xs-4">
        <div class="panel panel-default">
            <div class="panel-heading ui-sortable-handle">3</div>
            <div class="panel-body"></div>
        </div>
    </li>
</ul>

Javascript

$('#sortable').sortable({
    tolerance: 'pointer',
    handle: '.panel-heading',
    start: function (e, ui) {
        ui.placeholder.height(ui.item.children().height());
    }
});

CSS

ul {
    width: 650px;
    list-style: none;
    padding: 0;
    margin: 0;
}

.col-xs-4 {
    box-sizing: content-box;
    margin: 10px -16px;
}
.panel-al-placeholder {
    margin-bottom: 18px;
    background:#fef9e7
}

【讨论】:

  • 你的小提琴奏效了,当我把它复制到一个空的 laravel.blade 中时它搞砸了.. :/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多