8 jquery jquery-ui helper jquery-ui-sortable
我正在使用jquery sortable来跨多个容器对元素进行排序.
我将帮助选项设置为'clone',就像这样
$("#sup").sortable({
helper: "clone"
});
Run Code Online (Sandbox Code Playgroud)
所以这里发生的是当一个元素开始拖动时,jQuery会创建一个副本并将它附加到正文,这将成为实际被拖动的元素(帮助者),而不是原始元素.
拖动开始时,我的助手可能会改变位置.然而,jQuery认为帮助器就是它所放置的位置,即使我使用margin更改了它的位置,当将元素放入容器中时,帮助器实际上并没有超过它(因为我改变了辅助位置).
问题:如何让jQuery在更改后重新计算帮助程序的位置?
$("#sup").sortable({
helper: "clone",
start: function(event, ui) {
var marginsToSet = ui.item.data().sortableItem.margins;
// helper position changed
ui.helper.css('margin-left', marginsToSet.left);
ui.helper.css('margin-top', marginsToSet.top);
}
});
Run Code Online (Sandbox Code Playgroud)
示例:http://codepen.io/anon/pen/qZaNJZ您可以看到占位符突出显示将转到下一个容器,即使它没有完全悬停它.因为块位置不是jquery设置的.
您可以更改可排序的容差,以便它使用光标的位置而不是辅助块来检测要移动到哪个容器/目标。
我已经分叉了你的 Codepen,或者在下面重新创建了它:
var sortableInitialised = false;
$(function() {
var $div = $("div");
var $input = $('input[type=checkbox]').on('change', function() {
var isChecked = $(this).prop('checked');
makeSortable($div, isChecked ? 'pointer' : 'intersect');
});
makeSortable($div, 'intersect');
});
function makeSortable(elem, tolerance) {
if (sortableInitialised) {
// if changing, start from scratch
elem.sortable('destroy');
}
elem.sortable({
connectWith: "div",
appendTo: document.body,
placeholder: "placeholder",
helper: "clone",
tolerance: tolerance,
start: function(event, ui) {
var marginsToSet = ui.item.data().sortableItem.margins;
ui.helper.css('margin-left', marginsToSet.left);
ui.helper.css('margin-top', marginsToSet.top);
}
});
sortableInitialised = true;
// update heading
$('h2').text("tolerance: '" + tolerance + "'" + (tolerance === 'intersect' ? ' (default)' : ' (proposed)'));
}Run Code Online (Sandbox Code Playgroud)
h2, p {
margin: 0;
font-family: sans-serif;
}
div {
width: 150px;
height: 100px;
background-color: #f7f7f7;
margin: 10px;
display: inline-block;
}
span {
display: block;
width: 50px;
height: 50px;
background-color: black;
margin: 0 auto;
margin-top: 25px;
box-sizing: border-box;
}
.placeholder {
background-color: red;
}Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js"></script>
<h2>tolerance: 'intersect' (default)</h2>
<div><span></span>
</div>
<div></div>
<div></div>
<p>
<label>
<input type="checkbox">Use pointer tolerance
</label>
</p>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
741 次 |
| 最近记录: |