滚动到div的底部?


807

我正在使用Rails中的Ajax请求创建聊天,并且试图使div滚动到底部没有太多运气。

我将所有内容包装在这个div中:

#scroll {
    height:400px;
    overflow:scroll;
}

有没有一种方法可以使用JS将其默认滚动到底部?

是否有办法在ajax请求后将其滚动到底部?

Answers:


1323

这是我在网站上使用的内容:

var objDiv = document.getElementById("your_div");
objDiv.scrollTop = objDiv.scrollHeight;

13
这种方法适用于所有浏览器吗?
jondinham 2012年

1
@PaulDinh:我只是调查了一下,使用scrollHeight的IE7和更低版本存在问题。这里似乎是一种解决的IE7 这里
肖恩

2
在div中动态附加元素后,为什么它不起作用?
文斯2013年

3
@Vince-这是一次性交易。如果更改内容,则需要重新执行。该命令基本上说“将滚动条移动到该位置”。
DrFriedParts

8
另外,例如,如果您将元素放置在div中,则可以将特定元素滚动到视图中。(即该元素在父div内可见)。像这样:$(“#” + instanceID).scrollTop($(“#” + instanceID)[0] .scrollIntoView);
netfed 2014年

359

如果您使用的是jQuery scrollTop,这会容易得多:

$("#mydiv").scrollTop($("#mydiv")[0].scrollHeight);

272
这怎么容易?
captainspi 2012年

78
1行而不是2行?毫无头绪,但是您可以使用JQuery轻松实现的动作是这样的动画:$(“#div-id”)。animate({scrollTop:$(“#div-id”)[0] .scrollHeight},1000 ); 希望这对任何人有帮助:)
塞缪尔

28
您需要[0]从jquery元素中获取dom元素,以获取scrollHeight
Jimmy Bosse

14
“更不用说JQ了,它很难读懂!” 纯粹是一种意见。例如,我发现JQuery更易于阅读,理解和使用。如果您已经在使用JQuery,则此解决方案更好。
汉娜(Hanna)2013年

47
无需重复自己:$("#mydiv").scrollTop(function() { return this.scrollHeight; });
Eric

97

您可以使用以下代码:

function scrollToBottom(id){
   var div = document.getElementById(id);
   div.scrollTop = div.scrollHeight - div.clientHeight;
}

要使用JQuery 进行平滑滚动:

function scrollSmoothToBottom (id) {
   var div = document.getElementById(id);
   $('#' + id).animate({
      scrollTop: div.scrollHeight - div.clientHeight
   }, 500);
}

例子的jsfiddle

这就是它的工作方式:

在此处输入图片说明

参考:scrollTopscrollHeightclientHeight


92

使用jQuery animate

$('#DebugContainer').stop().animate({
  scrollTop: $('#DebugContainer')[0].scrollHeight
}, 800);

5
这就是山姆在评论中说的。不过,在实际答案中可能更有用!
Quentin Pradet 2012年

6
注意此答案如何使用.stop(),以防止出现多个动画问题。
kalyfe

令人惊讶的是,这是较早的所有答复中唯一对我有用的答复。这可能是因为我的其他div是如何围绕需要不断滚动的图层设置的
-Duniyadnd

这是唯一对我
有用的


31

适用于所有当前浏览器的较新方法:

this.scrollIntoView(false);

1

3
支持的确确实缺乏atm,但是如果这一点得到接受,那真是太好了。
Kristjan Liiva

任何更新?我认为这应该是一个很好的答案。我的意思是使用jQuery吗?
lkahtz

工作:document.querySelector(“。mdl-list”)。scrollIntoView(false);
约翰·麦地那

15

使用JavaScript 平滑滚动:

document.getElementById('messages').scrollIntoView({ behavior: 'smooth', block: 'end' });


8

如果您不想依赖scrollHeight,以下代码会有所帮助:

$('#scroll').scrollTop(1000000);

1
以上所有解决方案(包括您的解决方案)似乎都无法在Android上的Firefox上运行...请问您有什么想法?
卡亚吐司2014年

没关系,我使用的数字太大(1E10)。数量较少的作品
andrewtweber

总是很重要
Ben Taliadoros

4
为什么会表现不佳?这不像是在每个像素上进行迭代。现在,不良
作风

$('#scroll')。scrollTop(Infinity),那么这也应该起作用。
Madhav Poudel

5

使用jQuery,scrollTop用于设置任何给定元素的scollbar的垂直位置。还有一个不错的jquery scrollTo插件,用于滚动动画和不同的选项(演示

var myDiv = $("#div_id").get(0);
myDiv.scrollTop = myDiv.scrollHeight;

如果要在向下滚动时使用jQuery的animate方法添加动画,请检查以下代码段:

var myDiv = $("#div_id").get(0);
myDiv.animate({
    scrollTop: myDiv.scrollHeight
  }, 500);

4

我遇到了同样的问题,但是有一个额外的约束:我无法控制将新元素附加到滚动容器的代码。我在这里找到的所有示例都不允许我这样做。这是我最终得到的解决方案。

它使用Mutation Observershttps://developer.mozilla.org/en-US/docs/Web/API/MutationObserver)使其仅在现代浏览器中可用(尽管存在polyfills)

因此,基本上,代码就是这样做的:

var scrollContainer = document.getElementById("myId");

// Define the Mutation Observer
var observer = new MutationObserver(function(mutations) {

  // Compute sum of the heights of added Nodes
  var newNodesHeight = mutations.reduce(function(sum, mutation) {
      return sum + [].slice.call(mutation.addedNodes)
        .map(function (node) { return node.scrollHeight || 0; })
        .reduce(function(sum, height) {return sum + height});
  }, 0);

  // Scroll to bottom if it was already scrolled to bottom
  if (scrollContainer.clientHeight + scrollContainer.scrollTop + newNodesHeight + 10 >= scrollContainer.scrollHeight) {
    scrollContainer.scrollTop = scrollContainer.scrollHeight;
  }

});

// Observe the DOM Element
observer.observe(scrollContainer, {childList: true});

我做了一个小提琴来演示这个概念:https : //jsfiddle.net/j17r4bnk/


如何获得动态编号?就像<div class="abc"><div data-bind=attr : {'id': myId } ></div></div>在这段代码中,myId是一个变量。如何在脚本中访问此ID。
Irfan Yusanif,2015年

我不确定我是否理解您的问题。在我的示例中,“ myId”是滚动容器的ID。您是否要创建多个用户可以滚动的区域?
Benkinass

4

Javascript或jquery:

var scroll = document.getElementById('messages');
   scroll.scrollTop = scroll.scrollHeight;
   scroll.animate({scrollTop: scroll.scrollHeight});

CSS:

 .messages
 {
      height: 100%;
      overflow: auto;
  }

4

发现这确实有帮助,谢谢。

对于那里的Angular 1.X人员:

angular.module('myApp').controller('myController', ['$scope', '$document',
  function($scope, $document) {

    var overflowScrollElement = $document[0].getElementById('your_overflow_scroll_div');
    overflowScrollElement[0].scrollTop = overflowScrollElement[0].scrollHeight;

  }
]);

仅仅因为jQuery元素与HTML DOM元素的包装在角度上有些混乱。

同样对于聊天应用程序,我发现在加载聊天记录后进行此分配很有用,您可能还需要在短暂的超时时间内加油。


3

小附录:仅滚动(如果最后一行已经可见)。如果滚动一点,则将内容保留在原处(注意:未使用不同的字体大小进行测试。这可能需要在“> =比较内进行一些调整”):

var objDiv = document.getElementById(id);
var doScroll=objDiv.scrollTop>=(objDiv.scrollHeight-objDiv.clientHeight);                   

// add new content to div
$('#' + id ).append("new line at end<br>"); // this is jquery!

// doScroll is true, if we the bottom line is already visible
if( doScroll) objDiv.scrollTop = objDiv.scrollHeight;

3

就像奖金片段一样。我正在使用angular,并且在用户选择与用户的不同对话时尝试将消息线程滚动到底部。为了确保在使用ng-repeat消息将新数据加载到div后,滚动条可以正常工作,只需将滚动条包装在超时中即可。

$timeout(function(){
    var messageThread = document.getElementById('message-thread-div-id');
    messageThread.scrollTop = messageThread.scrollHeight;
},0)

这将确保在将数据插入DOM之后触发滚动事件。


我怀疑$ scope。$ apply(callback)会起作用,因为这会强制摘要和重新评估视图。
SStanley,2016年

谢谢!我真的很想知道为什么我不能使它工作,而$ timeout是问题所在。
Wayferer '18

@Wayferer一样setTimeout(function() { ... }, n)
KingRider

3

您还可以使用jQuery html,body通过以下方式将动画附加到文档中:

$("html,body").animate({scrollTop:$("#div-id")[0].offsetTop}, 1000);

这将导致平滑滚动到ID为“ div-id”的div顶部。



2

这将使您一直向下滚动到文档高度

$('html, body').animate({scrollTop:$(document).height()}, 1000);

1

一个非常简单的方法是将设置scroll to为div的高度。

var myDiv = document.getElementById("myDiv");
window.scrollTo(0, myDiv.innerHeight);

1

滚动到div中的最后一个元素:

myDiv.scrollTop = myDiv.lastChild.offsetTop

1

在我的Angular 6应用程序中,我只是这样做了:

postMessage() {
  // post functions here
  let history = document.getElementById('history')
  let interval    
  interval = setInterval(function() {
    history.scrollTop = history.scrollHeight
    clearInterval(interval)
  }, 1)
}

clearInterval(interval)函数将停止计时器,以允许手动滚动顶部/底部。


1

我的场景:我有一个字符串列表,其中必须添加用户给出的字符串,然后自动滚动到列表的末尾。我将列表的显示高度固定为固定值,此后它应该溢出。

我尝试了@Jeremy Ruten的答案,它起作用了,但是它正在滚动到第(n-1)个元素。如果有人遇到此类问题,则可以使用setTimeOut()方法解决方法。您需要将代码修改如下:

setTimeout(() => {
    var objDiv = document.getElementById('div_id');
    objDiv.scrollTop = objDiv.scrollHeight
}, 0)

这是我创建的StcakBlitz链接,其中显示了问题及其解决方案:https ://stackblitz.com/edit/angular-ivy-x9esw8


-1

我知道这是一个老问题,但是这些解决方案都不适合我。我最终使用offset()。top获得所需的结果。这是我用来将屏幕轻轻滚动到聊天应用程序中的最后一条消息的方法:

$("#html, body").stop().animate({
     scrollTop: $("#last-message").offset().top
}, 2000);

我希望这可以帮助其他人。


-1

有时,最简单的方法是最好的解决方案:我不知道这是否会有所帮助,它可以帮助我滚动所需的内容。“ y =“越高,它向下滚动的越多,当然“ 0”表示顶部,因此例如“ 1000”可能在底部,或者“ 2000”或“ 3000”,依此类推,具体取决于您页面是。通常在带有onclick或onmouseover的按钮中起作用。

window.scrollTo(x=0,y=150);

-1

将距可滚动元素顶部的距离设置为元素的总高度。

const element = this.shadowRoot.getElementById('my-scrollable-div')
element.scrollTop = element.scrollHeight

如果已经存在相同的解决方案,请不要添加。
艾森

是的,如果解决方案已经存在,那就不要这样做
Oswaldo

-1

您可以像这样使用HTML DOM scrollIntoView方法:

var element = document.getElementById("scroll");
element.scrollIntoView();

-2

采用 :

var element= $('element');
var maxScrollTop = element[0].scrollHeight - element.outerHeight();
element.scrollTop(maxScrollTop);

或检查滚动到底部:

    var element = $(element);
    var maxScrollTop = element[0].scrollHeight - element.outerHeight();
    element.on('scroll', function() {
        if ( element.scrollTop() >= maxScrollTop ) {
            alert('scroll to bottom');
        }
    });

将scrollTopMax更改为var maxScrollTop = element [0] .scrollHeight-element.outerHeight();
Mahdi Bagheri

-2

如果这样做是为了滚动到聊天窗口的底部,请执行以下操作

在聊天中滚动到特定div的想法如下

1)由Person,time和message组成的每个chat div在带有类chatContentbox的for循环中运行

2)querySelectorAll查找所有此类数组。可能是400个节点(400个聊天)

3)转到最后一个

4)scrollIntoView()

let lastChatBox = document.querySelectorAll('.chatContentBox'); 
lastChatBox = lastChatBox[lastChatBox.length-1]; 
lastChatBox.scrollIntoView(); 

已经使用给出了几个答案scrollIntoView,因此无需再添加一个。
艾森(Ason)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.