Właśnie to zaimplementowałem i być może możesz użyć mojego podejścia.
Powiedzmy, że mamy następujący kod HTML:
<div id="out" style="overflow:auto"></div>
Następnie możemy sprawdzić, czy przewinął do dołu za pomocą:
var out = document.getElementById("out");
// allow 1px inaccuracy by adding 1
var isScrolledToBottom = out.scrollHeight - out.clientHeight <= out.scrollTop + 1;
scrollHeight daje wysokość elementu, w tym każdy niewidoczny obszar z powodu przepełnienia. clientHeight podaje wysokość CSS lub, mówiąc inaczej, rzeczywistą wysokość elementu. Obie metody zwracają wysokość bez margin
, więc nie musisz się o to martwić. scrollTop podaje pozycję przewijania w pionie. 0 to góra, a max to scrollHeight elementu minus jego wysokość. Podczas korzystania z paska przewijania może być trudno (dla mnie było to w Chrome), aby pasek przewijania znalazł się na samym dole. więc rzuciłem niedokładność 1px. Tak isScrolledToBottom
będzie, nawet jeśli pasek przewijania znajduje się 1 piksel od dołu. Możesz ustawić to, co ci się podoba.
Następnie wystarczy po prostu ustawić scrollTop elementu na dole.
if(isScrolledToBottom)
out.scrollTop = out.scrollHeight - out.clientHeight;
Zrobiłem dla ciebie skrzypce, aby pokazać koncepcję: http://jsfiddle.net/dotnetCarpenter/KpM5j/
EDYCJA: Dodano fragment kodu, aby wyjaśnić, kiedy isScrolledToBottom
jest true
.
Przyklej pasek przewijania do dołu
const out = document.getElementById("out")
let c = 0
setInterval(function() {
// allow 1px inaccuracy by adding 1
const isScrolledToBottom = out.scrollHeight - out.clientHeight <= out.scrollTop + 1
const newElement = document.createElement("div")
newElement.textContent = format(c++, 'Bottom position:', out.scrollHeight - out.clientHeight, 'Scroll position:', out.scrollTop)
out.appendChild(newElement)
// scroll to bottom if isScrolledToBottom is true
if (isScrolledToBottom) {
out.scrollTop = out.scrollHeight - out.clientHeight
}
}, 500)
function format () {
return Array.prototype.slice.call(arguments).join(' ')
}
#out {
height: 100px;
}
<div id="out" style="overflow:auto"></div>
<p>To be clear: We want the scrollbar to stick to the bottom if we have scrolled all the way down. If we scroll up, then we don't want the content to move.
</p>
{position : relative; bottom:0;}
. Usuń właściwość css po przewinięciu przez użytkownika.