Gulir ke bawah div?


808

Saya membuat obrolan menggunakan permintaan ajax di rails dan saya mencoba untuk mendapatkan div untuk menggulir ke bawah tanpa banyak keberuntungan.

Saya membungkus semuanya dalam div ini:

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

Apakah ada cara untuk tetap menggulirnya ke bawah secara default menggunakan JS?

Apakah ada cara untuk tetap menggulirnya ke bawah setelah permintaan ajax?

Jawaban:


1325

Inilah yang saya gunakan di situs saya:

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

13
Apakah metode ini ok untuk semua browser?
jondinham

1
@ PaulDinh: Saya baru saja melihat ini dan ada masalah dengan IE7 dan lebih rendah menggunakan scrollHeight. Tampaknya ada pekerjaan untuk IE7 di sini .
Sean

3
Mengapa itu tidak berfungsi setelah menambahkan elemen secara dinamis di dalam div?
Vince

3
@Vince - Ini kesepakatan satu kali. Jika Anda mengubah konten, Anda harus menjalankan ulang. Perintah pada dasarnya mengatakan "pindahkan bilah gulir ke posisi ini".
DrFriedParts

8
Sebagai tambahan, jika Anda memiliki elemen yang ditempatkan di dalam div misalnya, Anda dapat menggulir elemen tertentu ke dalam tampilan. (yaitu elemen terlihat di dalam div induk) .. seperti ini: $ ("#" + instanceID) .scrollTop ($ ("#" + instanceID) [0] .scrollIntoView);
netfed

360

Ini jauh lebih mudah jika Anda menggunakan jQuery scrollTop :

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

273
Bagaimana ini lebih mudah?
captainspi

78
1 Baris bukannya 2? tidak ada petunjuk, tetapi apa yang dapat Anda lakukan dengan mudah dengan JQuery adalah menghidupkan tindakan seperti: $ ("# div-id"). animate ({scrollTop: $ ("# div-id") [0] .scrollHeight}, 1000 ); Semoga ini bisa membantu siapa pun :)
Samuel

28
Anda perlu [0] untuk mendapatkan elemen dom dari elemen jquery untuk mendapatkan scrollHeight
Jimmy Bosse

14
"Belum lagi JQ yang lebih sulit dibaca / dimengerti!" Murni pendapat. Misalnya saya menemukan JQuery jauh lebih mudah untuk dibaca, dimengerti, dan melakukan hal-hal dengan. Dan solusi ini lebih baik jika Anda sudah menggunakan JQuery.
Hanna

47
Tanpa mengulangi diri Anda sendiri:$("#mydiv").scrollTop(function() { return this.scrollHeight; });
Eric

98

Anda dapat menggunakan kode berikut:

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

Untuk melakukan gulir yang lancar dengan JQuery:

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

Lihat contoh di JSFiddle

Inilah mengapa ini bekerja:

masukkan deskripsi gambar di sini

Ref: scrollTop , scrollHeight , clientHeight


92

menggunakan jQuery animate :

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

5
Itulah yang dikatakan Sam dalam komentar ini . Ini mungkin lebih berguna dalam jawaban yang sebenarnya!
Quentin Pradet

6
Perhatikan bagaimana jawaban ini menggunakan .stop () , yang mencegah masalah dengan banyak animasi.
kalyfe

Anehnya ini adalah satu-satunya yang bekerja untuk saya dari semua tanggapan sebelumnya. Mungkin karena bagaimana
div

Ini adalah satu-satunya yang bekerja untuk saya (saya menambahkan gambar, bukan teks)
john ktejik


31

Metode yang lebih baru yang bekerja di semua browser saat ini :

this.scrollIntoView(false);

1
Pikirkan ini hanya berfungsi di firefox: developer.mozilla.org/en/docs/Web/API/Element/…
Amrit Kahlon

3
Dukungan memang kurang atm, tetapi jika ini diterima, maka itu akan luar biasa.
Kristjan Liiva

Adakah pembaruan? Saya merasa ini harus diterima sebagai jawaban yang baik. Maksud saya datang di jQuery?
lkahtz

berfungsi: document.querySelector (". mdl-list"). scrollIntoView (false);
Johann Medina

15

gulir halus dengan Javascript:

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


8

Jika Anda tidak ingin mengandalkan scrollHeight, kode berikut ini membantu:

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

1
Tak satu pun dari solusi di atas, termasuk milik Anda, yang tampaknya berfungsi pada Firefox di Android ... tolong pikirkan apa?
Kaya Toast

Sudahlah, saya menggunakan nomor yang terlalu besar ( 1E10). Sejumlah kecil bekerja
andrewtweber

Itu selalu penting
Ben Taliadoros

4
Mengapa itu kinerja yang buruk? Ini tidak seperti iterasi pada setiap pixel. Sekarang praktik buruk adalah pertanyaan lain ...
devios1

$ ('# scroll'). scrollTop (Infinity), ini juga harus bekerja.
Madhav Poudel

5

Menggunakan jQuery, scrollTop digunakan untuk mengatur posisi vertikal scollbar untuk setiap elemen yang diberikan. ada juga scroll jquery yang bagusUntuk plugin yang digunakan untuk menggulir dengan animasi dan berbagai opsi ( demo )

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

jika Anda ingin menggunakan metode animate jQuery untuk menambahkan animasi saat menggulir ke bawah, periksa cuplikan berikut:

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

4

Saya telah mengalami masalah yang sama, tetapi dengan kendala tambahan: Saya tidak memiliki kendali atas kode yang menambahkan elemen baru ke wadah gulir. Tidak ada satu pun contoh yang saya temukan di sini yang memungkinkan saya melakukan hal itu. Inilah solusi yang akhirnya saya dapatkan.

Ini menggunakan Mutation Observers( https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver ) yang membuatnya hanya dapat digunakan di browser modern (meskipun polyfill ada)

Jadi pada dasarnya kode tidak hanya itu:

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});

Saya membuat biola untuk menunjukkan konsep: https://jsfiddle.net/j17r4bnk/


bagaimana cara mendapatkan id dinamis? seperti di <div class="abc"><div data-bind=attr : {'id': myId } ></div></div>dalam kode ini myID adalah variabel. Bagaimana saya bisa mengakses id ini dalam skrip.
Irfan Yusanif

Saya tidak yakin saya mengerti pertanyaan Anda. Dalam contoh saya, "myId" adalah id dari wadah gulir. Apakah Anda ingin membuat lebih dari satu area tempat pengguna dapat menggulir?
Benkinass

4

Javascript atau jquery:

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

Css:

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

4

Menemukan ini sangat membantu, terima kasih.

Untuk orang-orang Angular 1.X di luar sana:

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;

  }
]);

Hanya karena pembungkus elemen jQuery versus elemen HTML DOM menjadi sedikit membingungkan dengan sudut.

Juga untuk aplikasi obrolan, saya menemukan membuat tugas ini setelah obrolan Anda dimuat agar bermanfaat, Anda juga mungkin perlu menampar waktu tunggu singkat.


3

tambahan kecil: hanya menggulung, jika baris terakhir sudah terlihat. jika digulirkan sedikit, tinggalkan konten di tempatnya (perhatian: tidak diuji dengan ukuran font yang berbeda. ini mungkin memerlukan beberapa penyesuaian di dalam "> = perbandingan"):

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

Sama seperti potongan bonus. Saya menggunakan sudut dan mencoba menggulir utas pesan ke bawah ketika pengguna memilih percakapan yang berbeda dengan pengguna. Untuk memastikan bahwa gulir bekerja setelah data baru dimuat ke div dengan pengulangan ng untuk pesan, cukup bungkus cuplikan gulir dalam batas waktu.

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

Itu akan memastikan bahwa acara gulir dipecat setelah data telah dimasukkan ke DOM.


Saya curiga $ scope. $ Apply (callback) akan bekerja sebaik ini memaksa intisari dan evaluasi ulang pandangan.
SStanley

Terima kasih! Saya benar-benar bertanya-tanya mengapa saya tidak bisa membuatnya bekerja dan $ timeout adalah masalahnya.
Wayferer

@Wayferer samasetTimeout(function() { ... }, n)
KingRider

3

Anda juga dapat, menggunakan jQuery, melampirkan animasi ke html,bodydokumen melalui:

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

yang akan menghasilkan gulir halus ke bagian atas div dengan id "div-id".


3

Java Script:

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

Gulir ke baris terakhir dari konten yang ada.


2

Ini akan memungkinkan Anda menggulir ke bawah mengenai ketinggian dokumen

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

1

Metode yang sangat sederhana adalah mengatur scroll toketinggian div.

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

1

Gulir ke elemen terakhir di dalam div:

myDiv.scrollTop = myDiv.lastChild.offsetTop

1

Pada aplikasi Angular 6 saya, saya baru saja melakukan ini:

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

Fungsi clearInterval (interval) akan menghentikan timer untuk memungkinkan gulir manual atas / bawah.


1

Skenario Saya: Saya memiliki daftar string, di mana saya harus menambahkan string yang diberikan oleh pengguna dan gulir ke akhir daftar secara otomatis. Saya memiliki ketinggian tetap tampilan daftar, setelah itu harus meluap.

Saya mencoba jawaban @Jeremy Ruten, itu berhasil, tetapi bergulir ke elemen (n-1). Jika ada yang menghadapi masalah jenis ini, Anda bisa menggunakan setTimeOut()metode penyelesaian masalah. Anda perlu mengubah kode di bawah ini:

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

Ini adalah tautan StcakBlitz yang saya buat yang menunjukkan masalah dan solusinya: https://stackblitz.com/edit/angular-ivy-x9esw8


-1

Saya tahu ini adalah pertanyaan lama, tetapi tidak ada solusi yang berhasil untuk saya. Saya akhirnya menggunakan offset (). Top untuk mendapatkan hasil yang diinginkan. Inilah yang saya gunakan untuk menggulir layar dengan lembut ke pesan terakhir di aplikasi obrolan saya:

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

Saya harap ini membantu orang lain.


-1

Terkadang yang paling sederhana adalah solusi terbaik: Saya tidak tahu apakah ini akan membantu, itu membantu saya untuk menggulirnya seperti yang pernah saya inginkan juga. Semakin tinggi "y =", semakin turun ke bawah dan tentu saja "0" berarti atas, jadi misalnya "1000" dapat berada di bawah, atau "2000" atau "3000" dan seterusnya, tergantung berapa lama Anda halaman adalah. Ini biasanya bekerja di tombol dengan klik atau onmouseover.

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

-1

Atur jarak dari bagian atas elemen yang dapat digulir menjadi ketinggian total elemen.

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

Jangan tambahkan solusi yang sama jika sudah ada.
Ason

ya jangan lakukan itu jika solusinya sudah ada
Oswaldo

-1

Anda dapat menggunakan Metode DOM scrollIntoView HTML seperti ini:

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

-2

gunakan:

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

atau periksa gulir ke bawah:

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

ubah scrollTopMax ke var maxScrollTop = elemen [0] .scrollHeight - element.outerHeight ();
Mahdi Bagheri

-2

Jika ini dilakukan untuk menggulir ke bagian bawah jendela obrolan, lakukan hal berikut

Gagasan untuk menggulir ke div tertentu dalam obrolan adalah sebagai berikut

1) Setiap obrolan yang terdiri dari Orang, waktu dan pesan dijalankan dalam loop untuk dengan kelas chatContentbox

2) querySelectorAll menemukan semua array tersebut. Itu bisa 400 node (400 obrolan)

3) pergi ke yang terakhir

4) scrollIntoView ()

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

Beberapa jawaban sudah diberikan, menggunakan scrollIntoView, jadi tidak perlu menambahkan satu lagi.
Ason
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.