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?
18 answers
Oto, czego używam na mojej stronie:
var objDiv = document.getElementById("your_div");
objDiv.scrollTop = objDiv.scrollHeight;
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);
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);
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:
Ref: scrollTop, scrollHeight, clientHeight
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
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);
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);
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);
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.
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;
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.
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;
}
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);
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".
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/
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.
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);
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.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