jQuery可排序列表 – 排序时滚动条跳转

我创建了一个演示: http://pastebin.me/584b9a86d715c9ba85b7bebf0375e237

当滚动条位于底部并拖动项目进行排序时,会导致滚动条跳起来。它似乎在FF,Safari,Chrome和IE(至少IE8)这样做。

在Mac上的Firefox中,当滚动条位于底部时,它会跳起来,但也为整个列表添加一个漂亮的闪光。它正好滚动整个列表。我相信如果我弄清楚是什么导致滚动(如果我可以阻止它),闪烁也将停止。

我不喜欢它像那个b / c一样跳起来,我发现它令人震惊和混乱。我知道这是一个角落的一个例子,但是如果可以的话我想修复它。

所以,有没有办法防止它向上滚动?或者,什么导致它向上滚动?

谢谢

解决方法

问题很简单。

首先让我们来设置场景。你有一个排序元素的列表,你的页面比你的屏幕高,所以它有一个滚动条,你的页面在最底部,滚动条一路下降。

问题,你去拖动一个元素,导致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;
            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);
        }
    });
});

相关文章

页面搜索关键词突出 // 页面搜索关键词突出 $(function () {...
jQuery实时显示日期、时间 html: <span id=&quot...
jQuery 添加水印 <script src="../../../.....
中文:Sys.WebForms.PageRequestManagerParserErrorExceptio...
1. 用Response.Write方法 代码如下: Response.Write(&q...
Jquery实现按钮点击遮罩加载,处理完后恢复 思路: 1.点击按...