Ich habe das gerade implementiert und vielleicht kannst du meinen Ansatz verwenden.
Sagen wir, wir haben das folgende HTML:
Dann können wir überprüfen, ob es am unteren Rand gescrollt ist mit:
var out = document.getElementById("out");
// Erlaube eine Abweichung von 1px, indem du 1 hinzufügst
var isScrolledToBottom = out.scrollHeight - out.clientHeight <= out.scrollTop + 1;
scrollHeight gibt Ihnen die Höhe des Elements, einschließlich aller nicht sichtbaren Bereiche aufgrund von Überlauf. clientHeight gibt Ihnen die CSS-Höhe oder anders ausgedrückt die tatsächliche Höhe des Elements. Beide Methoden geben die Höhe ohne margin
zurück, also brauchen Sie sich keine Sorgen darum zu machen. scrollTop gibt Ihnen die Position des vertikalen Scrolls. 0 ist oben und max ist das scrollHeight des Elements minus die Höhe des Elements selbst. Wenn Sie den Bildlaufbalken verwenden, kann es schwierig sein (für mich war es in Chrome), den Bildlaufbalken ganz nach unten an den Boden zu bringen. Deshalb habe ich eine Ungenauigkeit von 1px hinzugefügt. Daher wird isScrolledToBottom
auch wahr sein, wenn der Bildlaufbalken 1px vom Boden entfernt ist. Sie können dies auf das einstellen, was sich für Sie richtig anfühlt.
Dann ist es einfach eine Sache, den scrollTop des Elements nach unten zu setzen.
if(isScrolledToBottom)
out.scrollTop = out.scrollHeight - out.clientHeight;
Ich habe für Sie eine Fiddle erstellt, um das Konzept zu zeigen: http://jsfiddle.net/dotnetCarpenter/KpM5j/
EDIT: Hinzugefügter Code-Schnipsel, um zu klären, wann isScrolledToBottom
true
ist.
Bildlaufbalken am unteren Rand fixieren
const out = document.getElementById("out")
let c = 0
setInterval(function() {
// Erlaube eine Abweichung von 1px, indem du 1 hinzufügst
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;
}
Um es klar zu sagen: Wir möchten, dass der Bildlaufbalken am unteren Rand kleben bleibt, wenn wir ganz nach unten gescrollt haben. Wenn wir nach oben scrollen, möchten wir nicht, dass der Inhalt sich bewegt.