【问题标题】:How to prevent scrolling on prepend?如何防止在前面滚动?
【发布时间】:2011-08-06 23:57:34
【问题描述】:

我将内容添加到正文的顶部。有时此内容可能有 400-500 像素高,当添加此类内容时,在阅读页面时将内容向下推会非常烦人。

我希望自动添加项目,而不是单击此处查看新项目。

有什么方法可以在不移动页面的情况下将此内容添加到正文顶部?那么当用户滚动到顶部时它就已经在那里了?

【问题讨论】:

    标签: javascript jquery-ui jquery-plugins jquery


    【解决方案1】:

    我相信最通用的方法是简单地测量修改前后的文档高度:

    var old_height = $(document).height();  //store document height before modifications
    var old_scroll = $(window).scrollTop(); //remember the scroll position
    
    //do anything
    $("p:first").prepend( "<p>I just became first</p>" );
    
    $(document).scrollTop(old_scroll + $(document).height() - old_height); //restore "scroll position"
    

    这样你就可以真正做任何事情,而窗口不会离开你正在阅读的内容:)

    【讨论】:

    • 到目前为止,我对这种方法的运气最好。
    • 在搜索了整个互联网并尝试了各种解决方案之后,这是迄今为止我发现的唯一一个适用于我的用例的解决方案。
    • 很好的解决方案!如果您有一个具有属性 overflow-y: 滚动的 div,请在 jQ- 中使用 .scrollHeight() -or .prop("scrollHeight") 而不是 .height()。
    【解决方案2】:

    我过去通过添加元素,然后计算它们的总外部高度,并将滚动顶部设置为该值来完成此操作。像这样的:

    var $current_top_element = $('body').children().first();
    $('body').prepend(other_elements);
    
    var previous_height = 0;
    $current_top_element.prevAll().each(function() {
      previous_height += $(this).outerHeight();
    });
    
    $('body').scrollTop(previous_height);
    

    希望这会为您指明正确的方向。

    【讨论】:

    • 我已经尝试了所有三个答案。这是最好的解决方案。
    【解决方案3】:

    我采取了稍微不同的方法:

    首先获取 body 的第一个元素(或者如果你假装我需要的 body 以外的元素,则为另一个元素),然后在添加新的元素集之后,使用 offset (如果需要相对于 body 滚动)或 position (如果需要相对于祖先元素滚动)函数在原始第一个元素上获取其更新的坐标并滚动到那个观点。

    类似:

    var current_top_element = $('body').children().first();
    $('body').prepend(other_elements);
    
    $('body').scrollTop(current_top_element.offset().top);
    

    或者对于身体滚动以外的东西:

    var current_top_element = $('#ul-element-id li:first'); //example with a list
    $('#ul-element-id').prepend(other_elements);
    
    $('#ul-element-id').scrollTop(current_top_element.position().top);
    

    请注意 position() 返回元素相对于其 offset parent 的位置,因此请确保根据需要设置父元素的 css 位置属性(@ 987654321@)

    更多详情请参考: http://api.jquery.com/category/offset/

    【讨论】:

      【解决方案4】:

      我知道,我对这个话题很晚了。很抱歉取消了它,但是我发现了一种非常简单的方法,可以在将元素添加到正文时防止滚动到顶部。

      当滚动 Y 位置为零时,自动滚动附加。只需这样做:

      element.scrollTo(0, 1);
      

      并且您的元素不会在前置后自动转到顶部。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      • 2021-06-14
      • 2012-06-14
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多