问题很简单。
首先让我们设置场景。您有一个可排序元素列表,您的页面高于屏幕,因此它有一个滚动条,您的页面位于最底部,滚动条一直向下。
问题,你去拖动一个元素,这会导致 jQuery 从 dom 中删除它,然后添加一个占位符。让我们放慢速度,它首先删除元素,现在列表更短导致页面更短,导致滚动条更短。然后它添加了占位符,现在页面更长了,现在滚动条更长了(但窗口不会向下滚动,所以看起来滚动条向上跳了)。
我发现解决此问题的最佳方法是确保可排序列表具有静态高度,因此删除元素不会导致它变短。这样做的一种方法是
create:function(){
jQuery(this).height(jQuery(this).height());
}
将在创建可排序列表时调用上述内容,将其高度静态设置为当前高度。
如果您在其中一个可排序元素中有图片,除非您在标签中预先定义尺寸,否则上述代码将不起作用。原因是当 height() 被调用和设置时,它是在图像被填充之前计算的。没有维度,则图像不占空间。图片一旦加载,就会占用空间。
这是一种不必定义尺寸的方法。每次检测到要加载其中的图像时,只需调整列表高度即可。
create:function(){
var list=this;
jQuery(list).find('img').load(function(){
jQuery(list).height(jQuery(list).height());
});
}
最终版本:
jQuery(document).ready(function(){
jQuery("div#todoList").sortable({
handle:'img.moveHandle',
opacity: 0.6,
cursor: 'move',
tolerance: 'pointer',
forcePlaceholderSize: true,
update:function(){
jQuery("body").css('cursor','progress');
var order = jQuery(this).sortable('serialize');
jQuery.post("/ajax.php?do=sort&"+order,function(data){jQuery("body").css('cursor','default');});
},
create:function(){
var list=this;
var resize=function(){
jQuery(list).css("height","auto");
jQuery(list).height(jQuery(list).height());
};
jQuery(list).height(jQuery(list).height());
jQuery(list).find('img').load(resize).error(resize);
}
});
});