我有使用滚动排序的jquery问题。 示例 - http://jsfiddle.net/n5eL2e55/1/
我的代码: HTML:
<ul class="list">
<li class="item">item 1</li>
<li class="item">item 2</li>
<li class="item">item 3</li>
<li class="item">item 4</li>
<li class="item">item 5</li>
<li class="item">item 6</li>
<li class="item">item 7</li>
</ul>
使用Javascript:
$(function() {
$(".list").sortable({
items: ".item",
axis : "y",
helper:'clone',
containment: "parent",
scroll: true
}).disableSelection();
$(".list").disableSelection();
});
CSS:
.list{
overflow: scroll;
border:1px solid red;
height: 200px;
width: 150px;
position: relative;
padding: 0;
}
.item{
height: 50px;
width: 100%;
list-style-type: none;
border: 1px solid #000;
}
问题是当您将项目从上到下拖动到最后一项并继续滚动到底部时。问题是jquery sortable允许滚动到底部而没有任何限制(滚动区域保持增加) 图片可在 - http://i.stack.imgur.com/Ljd04.png
上找到答案 0 :(得分:5)
您可以干扰scrollTop
事件scrollParent
sort
,以防止其高于scrollParent
height
。结果并不完美,但可能有一种方法可以改进它。
像这样:
sort: function (e, ui) {
var scrollParent = $(e.target).sortable('instance').scrollParent;
if( scrollParent.scrollTop()>scrollParent.height()){
scrollParent.scrollTop(scrollParent.height())
}
}
请参阅小提琴:http://jsfiddle.net/zt2sd3kv/1/
JulienGrégoire提供的解决方案的更新版本
我在启动时添加了最大scrollTop的调用,并在scrollTop增加此存储值时恢复 - http://jsfiddle.net/n5eL2e55/2/
$(".list").sortable({
items: ".item",
axis : "y",
helper:'clone',
containment: "parent",
scroll: true,
start: function(e, ui) {
//set max scrollTop for sortable scrolling
var scrollParent = $(this).data("ui-sortable").scrollParent;
var maxScrollTop = scrollParent[0].scrollHeight - scrollParent.height() - ui.helper.height();
$(this).data('maxScrollTop', maxScrollTop);
},
sort: function (e, ui) {
//check if scrolling is out of boundaries
var scrollParent = $(this).data("ui-sortable").scrollParent,
maxScrollTop = $(this).data('maxScrollTop');
if(scrollParent.scrollTop() > maxScrollTop){
scrollParent.scrollTop(maxScrollTop);
}
},
}).disableSelection();
答案 1 :(得分:0)
http://jsfiddle.net/omegak/2bHSG/
$(".sortable").sortable({
axis: "y",
containment: "parent",
cursor: "move",
items: "li",
tolerance: "pointer",
});
ul {
border: 1px solid gray;
list-style: none;
padding: 0;
display: inline-block;
max-height: 250px;
overflow-y: auto;
overflow-x: hidden;
width: 190px;
border: 1px solid black;
float: left;
margin: 5px;
}
li {
background: white;
border: 1px solid gray;
height: 50px;
}
答案 2 :(得分:0)
改善JulienGrégoire和 spacemanCoder 的解决方案。
我需要一种方法来防止在没有y
轴约束的情况下在flexbox容器中进行水平滚动。
基本上我只将以下代码添加到sort
事件处理程序
if (scrollParentEl.scrollLeft()) {
scrollParentEl.scrollLeft(0);
}
答案 3 :(得分:0)
更高版本的Sortable添加了选项scrollFn
。
您可以使用它来以任何方式限制自动滚动。
这是一个仅允许在y轴上自动滚动的示例:
$(".sortable").sortable({
...
scrollFn: function (offsetX, offsetY, originalEvent, touchEvt, hoverTargetEl)
{
if (offsetY) $('#scroll_parent')[0].scrollTop += offsetY; // scroll only vertically
},