967

我正在使用 Ajax 请求创建聊天,并且试图让消息 div 滚动到底部,但运气不佳。

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

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

有没有办法使用JS默认滚动到底部?

ajax请求后有没有办法让它滚动到底部?

4

32 回答 32

1594

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

var objDiv = document.getElementById("your_div");
objDiv.scrollTop = objDiv.scrollHeight;
于 2008-11-06T22:42:51.563 回答
379

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

$("#mydiv").scrollTop($("#mydiv")[0].scrollHeight);
于 2010-04-19T02:17:04.453 回答
154

你可以试试下面的代码:

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上的示例

这就是为什么它有效:

在此处输入图像描述

参考:scrollTop , scrollHeight , clientHeight

于 2015-10-18T02:27:50.817 回答
96

使用jQuery 动画

$('#DebugContainer').stop().animate({
  scrollTop: $('#DebugContainer')[0].scrollHeight
}, 800);
于 2012-09-12T15:00:45.017 回答
56

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

this.scrollIntoView(false);
于 2014-10-10T07:08:29.657 回答
38
var mydiv = $("#scroll");
mydiv.scrollTop(mydiv.prop("scrollHeight"));

从 jQuery 1.6 开始工作

https://api.jquery.com/scrollTop/

http://api.jquery.com/prop/

于 2014-01-10T15:53:49.233 回答
25

使用 Javascript平滑滚动:

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

于 2019-04-29T11:57:57.560 回答
11

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

$('#scroll').scrollTop(1000000);
于 2014-06-10T10:58:00.927 回答
8

Java 脚本:

document.getElementById('messages').scrollIntoView(false);

滚动到当前内容的最后一行。

于 2017-10-24T16:25:50.843 回答
8

替代解决方案

function scrollToBottom(element) {
  element.scroll({ top: element.scrollHeight, behavior: 'smooth' });
}
于 2020-12-19T15:06:01.203 回答
7

我的场景:我有一个字符串列表,我必须在其中附加用户给出的字符串并自动滚动到列表的末尾。我已经固定了列表显示的高度,之后它应该溢出。

我尝试了@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

于 2020-05-10T18:46:59.077 回答
6

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

var element = document.getElementById("scroll");
element.scrollIntoView();
于 2020-03-09T18:58:33.783 回答
5

Javascript 或 jquery:

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

CSS:

 .messages
 {
      height: 100%;
      overflow: auto;
  }
于 2016-07-18T18:44:25.770 回答
4

使用 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);
于 2014-11-19T19:40:17.590 回答
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 元素的包装与 angular 有点混淆。

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

于 2015-09-15T17:56:21.757 回答
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/

于 2015-10-09T06:59:16.400 回答
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;
于 2014-07-03T13:58:01.920 回答
3

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

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

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

于 2014-08-21T12:41:38.643 回答
3

这将让您在文档高度方面一直向下滚动

$('html, body').animate({scrollTop:$(document).height()}, 1000);
于 2015-08-13T03:41:29.733 回答
3

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

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

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

于 2015-10-28T18:17:07.380 回答
3

和你一样,我正在构建一个聊天应用程序,并希望滚动查看最新消息。这最终对我很有效:

//get the div that contains all the messages
let div = document.getElementById('message-container');

//make the last element (a message) to scroll into view, smoothly!
div.lastElementChild.scrollIntoView({ behavior: 'smooth' });
于 2020-07-08T07:48:43.113 回答
1

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

var myDiv = document.getElementById("myDiv");
window.scrollTo(0, myDiv.innerHeight);
于 2017-10-26T15:56:16.670 回答
1

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

myDiv.scrollTop = myDiv.lastChild.offsetTop
于 2019-02-03T08:50:22.637 回答
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) 函数将停止计时器以允许手动滚动顶部/底部。

于 2020-02-17T00:21:16.930 回答
1

您可以使用Element.scrollTo()方法。

它可以使用内置的浏览器/操作系统动画进行动画处理,因此非常流畅。

function scrollToBottom() {
    const scrollContainer = document.getElementById('container');
    scrollContainer.scrollTo({
        top: scrollContainer.scrollHeight,
        left: 0,
        behavior: 'smooth'
    });
}

// initialize dummy content
const scrollContainer = document.getElementById('container');
const numCards = 100;
let contentInnerHtml = '';
for (let i=0; i<numCards; i++) {
  contentInnerHtml += `<div class="card mb-2"><div class="card-body">Card ${i + 1}</div></div>`;
}
scrollContainer.innerHTML = contentInnerHtml;
.overflow-y-scroll {
  overflow-y: scroll;
}
<link href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css" rel="stylesheet"/>

<div class="d-flex flex-column vh-100">
  <div id="container" class="overflow-y-scroll flex-grow-1"></div>
  <div>
    <button class="btn btn-primary" onclick="scrollToBottom()">Scroll to bottom</button>
  </div>
</div>

于 2020-11-05T17:02:19.490 回答
0

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

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

我希望这对其他人有帮助。

于 2016-12-12T20:09:43.610 回答
0

我使用第一个项目 div 的 Y 坐标和所选项目 div 的 Y 坐标之间的差异。这是 JavaScript/JQuery 代码和 html:

function scrollTo(event){
        // In my proof of concept, I had a few <button>s with value 
        // attributes containing strings with id selector expressions
        // like "#item1".
        let selectItem = $($(event.target).attr('value'));
        let selectedDivTop = selectItem.offset().top;

        let scrollingDiv = selectItem.parent();

        let firstItem = scrollingDiv.children('div').first();
        let firstItemTop = firstItem.offset().top;

        let newScrollValue = selectedDivTop - firstItemTop;
        scrollingDiv.scrollTop(newScrollValue);
    }
<div id="scrolling" style="height: 2rem; overflow-y: scroll">
  <div id="item1">One</div>
  <div id="item2">Two</div>
  <div id="item3">Three</div>
  <div id="item4">Four</div>
  <div id="item5">Five</div>
</div>

于 2020-10-06T17:11:13.460 回答
-1

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

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

1) 每个由 Person、time 和 message 组成的聊天 div 都在一个 for 循环中运行,其中包含 chatContentbox 类

2) querySelectorAll 找到所有这样的数组。可能是 400 个节点(400 个聊天)

3) 转到最后一个

4) 滚动视图()

let lastChatBox = document.querySelectorAll('.chatContentBox'); 
lastChatBox = lastChatBox[lastChatBox.length-1]; 
lastChatBox.scrollIntoView(); 
于 2019-10-03T12:52:31.593 回答
-1

仅限 CSS:

.scroll-container {
  overflow-anchor: none;
}

使其在添加子元素时滚动条不会停留在顶部。例如,在聊天底部添加新消息时,将聊天滚动到新消息。

于 2021-07-30T04:24:27.560 回答
-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');
        }
    });
于 2019-07-04T04:56:55.143 回答
-2

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

const element = this.shadowRoot.getElementById('my-scrollable-div')
element.scrollTop = element.scrollHeight
于 2020-02-06T22:37:36.293 回答
-3

有时最简单的就是最好的解决方案:我不知道这是否有帮助,它帮助我滚动它也是我想要的。“y=”越高,向下滚动的越多,当然“0”表示顶部,因此例如“1000”可能是底部,或者“2000”或“3000”等等,具体取决于您的多长时间页是。这通常适用于带有 onclick 或 onmouseover 的按钮。

window.scrollTo(x=0,y=150);
于 2020-01-05T22:00:53.627 回答