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?

dMix
sumber

Jawaban:

1325

Inilah yang saya gunakan di situs saya:

var objDiv = document.getElementById("your_div");
objDiv.scrollTop = objDiv.scrollHeight;
Jeremy Ruten
sumber
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);
andsien
sumber
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

Tho
sumber
92

menggunakan jQuery animate :

$('#DebugContainer').stop().animate({
  scrollTop: $('#DebugContainer')[0].scrollHeight
}, 800);
DadViegas
sumber
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
36
var mydiv = $("#scroll");
mydiv.scrollTop(mydiv.prop("scrollHeight"));

Bekerja dari jQuery 1.6

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

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

Akira Yamamoto
sumber
1
Solusi ini berfungsi untuk elemen dengan kelas CSS unik namun tidak memiliki ID CSS. Solusi komentar teratas tidak bekerja di luar kotak dengan kelas CSS.
CFitz
31

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

this.scrollIntoView(false);
tnt-rox
sumber
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' });

adl
sumber
8

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

$('#scroll').scrollTop(1000000);
Benny Neugebauer
sumber
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);
Muhammad Soliman
sumber
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/

Benkinass
sumber
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;
  }
Lay Leangsros
sumber
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.

devonj
sumber
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;
Bruno Jennrich
sumber
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.

mylescc
sumber
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".

John Dunne
sumber
3

Java Script:

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

Gulir ke baris terakhir dari konten yang ada.

Barath Sankar
sumber
2

Ini akan memungkinkan Anda menggulir ke bawah mengenai ketinggian dokumen

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

Metode yang sangat sederhana adalah mengatur scroll toketinggian div.

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

Gulir ke elemen terakhir di dalam div:

myDiv.scrollTop = myDiv.lastChild.offsetTop
mjaque
sumber
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.

moreirapontocom
sumber
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

ngShravil.py
sumber
-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.

BrianLegg
sumber
-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);
SeekLoad
sumber
-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
pengguna2341537
sumber
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();
Anatol
sumber
-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');
        }
    });
Mahdi Bagheri
sumber
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(); 
veritas
sumber
Beberapa jawaban sudah diberikan, menggunakan scrollIntoView, jadi tidak perlu menambahkan satu lagi.
Ason