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のを参照してください

これが機能する理由は次のとおりです。

ここに画像の説明を入力

参照: scrollTopscrollHeightclientHeight

于 2015-10-18T02:27:50.817 に答える
96

jQueryアニメーションの使用:

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

Javascript を使用したスムーズスクロール:

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

于 2019-04-29T11:57:57.560 に答える
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

これは本当に役に立ちました、ありがとう。

そこにいる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

jQuery を使用して、特定の要素のスクロールバーの垂直位置を設定するためにscrollTopが使用されます。アニメーションとさまざまなオプションでスクロールするために使用される素敵な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

私は同じ問題に遭遇しましたが、追加の制約があります。スクロール コンテナーに新しい要素を追加するコードを制御できませんでした。私がここで見つけた例のどれも、私がそれをすることを許しませんでした. これが私が最終的に得た解決策です。

Mutation Observers( https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver ) を使用しているため、最新のブラウザーでのみ使用できます (ただし、ポリフィルは存在します)。

したがって、基本的にコードはそれを行います:

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

jQuery を使用して、次の方法でアニメーションをhtml,bodyドキュメントに添付することもできます。

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

これにより、id "div-id" を持つ div の上部までスムーズにスクロールされます。

于 2015-10-28T18:17:07.380 に答える
3

ボーナススニペットとして。私は角度を使用しており、ユーザーがユーザーとのさまざまな会話を選択したときに、メッセージ スレッドを一番下までスクロールしようとしていました。メッセージの ng-repeat を使用して新しいデータが div にロードされた後にスクロールが機能することを確認するには、スクロール スニペットをタイムアウトでラップするだけです。

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

これにより、データが DOM に挿入された後にスクロール イベントが確実に発生します。

于 2014-08-21T12:41:38.643 に答える
1

これに対する非常に簡単な方法はscroll to、 を div の高さに設定することです。

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

これは古い質問であることは知っていますが、これらの解決策はどれもうまくいきませんでした。私は最終的に offset().top を使用して目的の結果を取得しました。以下は、チャット アプリケーションで最後のメッセージまで画面をゆっくりとスクロールするために使用したものです。

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

これが他の誰かに役立つことを願っています。

于 2016-12-12T20:09:43.610 に答える
-1

CSS のみ:

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

子要素が追加されたときにスクロール バーが上部に固定されたままにならないようにします。たとえば、チャットの下部に新しいメッセージが追加された場合、チャットを新しいメッセージまでスクロールします。

于 2021-07-30T04:24:27.560 に答える