Przewiń na dół div?

Tworzę czat używając żądań ajax w rails i próbuję bez większego szczęścia uzyskać div do przewinięcia na dół.

Owijam wszystko w tym div:

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

Czy istnieje sposób, aby domyślnie przewijać go do dołu za pomocą JS?

Czy istnieje sposób na przewinięcie go do dołu po żądaniu ajax?

Author: sudo bangbang, 2008-11-07

18 answers

Oto, czego używam na mojej stronie:

var objDiv = document.getElementById("your_div");
objDiv.scrollTop = objDiv.scrollHeight;
 1038
Author: Jeremy Ruten,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-19 08:21:53

Jest to znacznie łatwiejsze, jeśli używasz jQuery:

$("#mydiv").scrollTop($("#mydiv")[0].scrollHeight);
 324
Author: andsien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-23 02:29:22

Using jQuery animate :

$('#DebugContainer').stop().animate({
  scrollTop: $('#DebugContainer')[0].scrollHeight
}, 800);
 83
Author: DadViegas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-16 21:08:47

Możesz użyć następującego kodu:

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

Aby wykonać smooth scroll, użyj następującego kodu (wymagaj jQuery):

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

Zobacz próbkę na JSFiddle

I tak to działa:

Tutaj wpisz opis obrazka

Ref: scrollTop, scrollHeight, clientHeight

 70
Author: ThoQ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-25 03:36:12
var mydiv = $("#scroll");
mydiv.scrollTop(mydiv.prop("scrollHeight"));

Działa z jQuery 1.6

Https://api.jquery.com/scrollTop/

Http://api.jquery.com/prop/

 29
Author: Akira Yamamoto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-13 00:41:09

Nowsza Metoda:

this.scrollIntoView(false);
 19
Author: tnt-rox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 12:33:30

Jeśli nie chcesz polegać na scrollHeight, pomaga następujący kod:

$('#scroll').scrollTop(1000000);
 10
Author: Benny Neugebauer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-10 10:58:00

Używając jQuery, scrollTop służy do ustawiania pionowej pozycji scollbara dla dowolnego elementu. istnieje również ładny jQuery scrollTo plugin używany do przewijania z animacją i różnymi opcjami (dema)

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

Jeśli chcesz użyć metody jQuery animate , Aby dodać animację podczas przewijania w dół, sprawdź następujący fragment:

var myDiv = $("#div_id").get(0);
myDiv.animate({
    scrollTop: myDiv.scrollHeight
  }, 500);
 6
Author: msoliman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-21 09:22:20

Uważam, że to bardzo pomocne, dziękuję.

Dla kąta 1.XD:

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;

  }
]);

Tylko dlatego, że zawijanie elementów jQuery w elementy HTML DOM robi się trochę mylące z angular.

Również w przypadku aplikacji do czatu, stwierdziłem, że wykonanie tego zadania po załadowaniu czatów jest przydatne, możesz również potrzebować krótkiego limitu czasu.

 6
Author: devonj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-09 01:02:18

Mały dodatek: tylko przewijanie, jeśli ostatnia linia jest już widoczna. jeśli przewijany kawałek, pozostawia zawartość tam, gdzie jest (uwaga: nie testowane z różnymi rozmiarami czcionek. może to wymagać pewnych poprawek wewnątrz "> = comparison"):

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;
 4
Author: Bruno Jennrich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-03 13:58:01

Tylko jako bonus. Używam angular i próbowałem przewijać wątek wiadomości do dołu, gdy użytkownik wybrał różne rozmowy z użytkownikami. Aby upewnić się, że scroll działa po załadowaniu nowych danych do div za pomocą ng-repeat for messages, wystarczy zawinąć fragment przewijania w czasie.

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

To upewni się, że zdarzenie scroll zostanie wywołane po włożeniu danych do DOM.

 4
Author: mylescc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-21 12:41:38

Javascript lub jquery:

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

Css:

 .messages
 {
      height: 100%;
      overflow: auto;
  }
 4
Author: Lay Leangsros,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-18 18:44:25

To pozwoli Ci przewijać w dół o wysokość dokumentu

$('html, body').animate({scrollTop:$(document).height()}, 1000);
 3
Author: Navaneeth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-13 03:41:29

Możesz również, używając jQuery, dołączyć animację do html,body dokumentu poprzez:

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

Co spowoduje płynne przewinięcie do góry div o id "div-id".

 3
Author: John Dunne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-28 18:17:07

Napotkałem ten sam problem, ale z dodatkowym ograniczeniem: nie miałem kontroli nad kodem, który dołączał nowe elementy do kontenera przewijania. Żaden z przykładów, które tu znalazłem, nie pozwolił mi na to. Oto rozwiązanie, z którym skończyłem .

Używa Mutation Observers (https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver ), co sprawia, że można go używać tylko w nowoczesnych przeglądarkach (choć istnieją polyfills)

Więc w zasadzie kod robi właśnie to :

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

Zrobiłem skrzypce, aby zademonstrować koncepcję : https://jsfiddle.net/j17r4bnk/

 2
Author: Benkinass,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-09 07:08:01

Java Script:

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

Przewija do ostatniego wiersza obecnej zawartości.

 1
Author: Barath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-24 16:25:50

Bardzo prostą metodą jest ustawienie scroll to na wysokość div.

var myDiv = document.getElementById("myDiv");
window.scrollTo(0, myDiv.innerHeight);
 1
Author: Cubetastic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-26 15:56:16

Wiem, że to stare pytanie, ale żadne z tych rozwiązań mi nie wyszło. Skończyło się na użyciu offset ().top, aby uzyskać pożądane rezultaty. Oto, co kiedyś delikatnie przewiń ekran w dół do ostatniej wiadomości w mojej aplikacji na czacie:

$("#html, body").stop().animate({
     scrollTop: $("#last-message").offset().top
}, 2000);
Mam nadzieję, że to pomoże komuś innemu.
 0
Author: BrianLegg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-12 20:09:43