Lassen Sie das Überlauf-Div nach unten gescrollt, es sei denn, der Benutzer scrollt nach oben
Lesezeit: 9 Minuten
Ich habe ein Div, das nur 300 Pixel groß ist, und ich möchte, dass es beim Laden der Seite zum Ende des Inhalts scrollt. Diesem Div wird dynamisch Inhalt hinzugefügt und es muss ganz nach unten gescrollt werden. Wenn sich der Benutzer jetzt entscheidet, nach oben zu scrollen, möchte ich nicht, dass er wieder nach unten springt, bis der Benutzer wieder ganz nach unten scrollt
Ist es möglich, ein Div zu haben, das nach unten gescrollt bleibt, es sei denn, der Benutzer scrollt nach oben, und wenn der Benutzer nach unten scrollt, muss es sich selbst am unteren Rand halten, selbst wenn neuer dynamischer Inhalt hinzugefügt wird. Wie würde ich vorgehen, um dies zu erstellen.
Verwenden Sie die CSS-Position oben, halten Sie sie unten {position : relative; bottom:0;}. Entfernen Sie die CSS-Eigenschaft, sobald der Benutzer gescrollt hat.
– TCHdvlp
4. September 13 um 12:58 Uhr
Da Sie keine Antwort akzeptiert haben, möchte ich fragen: Hat es bei Ihnen funktioniert?
– Herr Manhattan
5. September 13 um 6:53 Uhr
Klingt nach einer Chatbox, die Sie erreichen möchten
– Thielicious
7. Juli 17 um 13:39 Uhr
Wenn Sie diese Frage noch nicht kennen, sollten Sie es mit CSS-Snap-In versuchen 2020.
– Wener
5. März 20 um 13:45 Uhr
Hier ist ein Nur CSS Methode, die in vielen Fällen funktioniert.
– Ashleedawg
21. August 21 um 16:41 Uhr
Ich konnte dies nur mit CSS zum Laufen bringen.
Der Trick ist zu verwenden display: flex; und flex-direction: column-reverse;
Der Browser behandelt die Unterseite wie die Oberseite. Vorausgesetzt, die Browser, auf die Sie abzielen, werden unterstützt flex-boxist die einzige Einschränkung, dass das Markup in umgekehrter Reihenfolge erfolgen muss.
Sie können die Umkehrung des Inhalts umgehen, indem Sie einen zusätzlichen Wrapper hinzufügen und anwenden overflow:auto; display:flex; flex-direction:column-reverse; auf die Außenhülle statt auf die Innenhülle.
– Nathan Arthur
8. September 17 um 15:10 Uhr
wahrscheinlich die beste Lösung, weil es kein Javascript benötigt.
– Amit Kumar Khare
23. Oktober 17 um 10:47 Uhr
@NathanArthur In der Tat, wenn Sie einfach ein div unter dem Container hinzufügen, um alles rückgängig zu machen: codepen.io/anon/pen/pdrLEZ
– Coo
15. November 17 um 5:44 Uhr
Leider scheint diese Lösung in Firefox nicht zu funktionieren 🙁
– Stuart
19. November 19 um 17:33 Uhr
Es ist Oktober 2020. Und ich habe überprüft, ob es auch mit Firefox funktioniert. Danke für die schnelle Lösung.
– Imtiaz
10. Oktober 20 um 21:11 Uhr
Herr Manhattan
Das könnte dir helfen:
var element = document.getElementById("yourDivID");
element.scrollTop = element.scrollHeight;
[EDIT]passend zum Kommentar…
function updateScroll(){
var element = document.getElementById("yourDivID");
element.scrollTop = element.scrollHeight;
}
Rufen Sie beim Hinzufügen von Inhalten die Funktion updateScroll() auf oder stellen Sie einen Timer ein:
//once a second
setInterval(updateScroll,1000);
Wenn Sie NUR aktualisieren möchten, wenn sich der Benutzer nicht bewegt hat:
var scrolled = false;
function updateScroll(){
if(!scrolled){
var element = document.getElementById("yourDivID");
element.scrollTop = element.scrollHeight;
}
}
$("#yourDivID").on('scroll', function(){
scrolled=true;
});
Dadurch wird es beim Laden der Seite nach unten gescrollt, aber ich brauche es, um am Ende zu bleiben, wenn dynamischer Inhalt hinzugefügt wird, es sei denn, der Benutzer hat nach oben gescrollt.
– Robert E. McIntosh
4. September 13 um 13:07 Uhr
Soweit ich das beurteilen kann, wird das dynamische Scrollen nicht wieder aktiviert, wenn der Benutzer nach unten scrollt …
– Fernsehen
16. November 15 um 4:05 Uhr
@TvE es nicht könnten wir diese Unterstützung hinzugefügt werden?
– Barkermn01
23. Dezember 15 um 15:31 Uhr
Schlechte Lösung. Es gibt keinen Grund, a hinzuzufügen setInterval für dieses milde ein problem.
– Ethankrist
9. Juni 18 um 7:29 Uhr
@ethancrist, du bietest jedoch keine Alternative an … Achselzucken.
– Jarett Lloyd
19. Oktober 18 um 14:26 Uhr
dotnetZimmermann
Ich habe dies gerade implementiert und vielleicht können Sie meinen Ansatz verwenden.
Angenommen, wir haben den folgenden HTML-Code:
<div id="out" style="overflow:auto"></div>
Dann können wir überprüfen, ob es nach unten gescrollt hat mit:
var out = document.getElementById("out");
// allow 1px inaccuracy by adding 1
var isScrolledToBottom = out.scrollHeight - out.clientHeight <= out.scrollTop + 1;
Bildlaufhöhe gibt Ihnen die Höhe des Elements an, einschließlich aller nicht sichtbaren Bereiche aufgrund von Überlauf. clientHöhe gibt Ihnen die CSS-Höhe oder anders gesagt die tatsächliche Höhe des Elements an. Beide Methoden geben die Höhe ohne zurück margindarum brauchen Sie sich also keine Sorgen zu machen. nach oben scrollen gibt Ihnen die Position des vertikalen Bildlaufs an. 0 ist top und max ist die scrollHeight des Elements abzüglich der Elementhöhe selbst. Bei Verwendung der Bildlaufleiste kann es schwierig sein (bei mir war es in Chrome), die Bildlaufleiste ganz nach unten zu bringen. Also habe ich eine Ungenauigkeit von 1px eingeworfen. So isScrolledToBottom gilt auch dann, wenn die Bildlaufleiste 1 Pixel vom unteren Rand entfernt ist. Sie können dies so einstellen, wie es sich für Sie richtig anfühlt.
Dann geht es einfach darum, scrollTop des Elements ganz nach unten zu setzen.
BEARBEITEN: Code-Snippet hinzugefügt, um zu verdeutlichen, wann isScrolledToBottom ist true.
Bildlaufleiste nach unten kleben
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>
Dies ist eigentlich die einzige Lösung, die die gestellte Frage erfüllt. Und hätte als richtige Antwort markiert werden sollen.
– prickelnd
04. September 15 um 0:02 Uhr
@dotnetCarpenter: Es sieht für mich so aus, als ob Sie brauchen if(!isScrolledToBottom): Der Test sieht für mich falsch aus (und hat nicht funktioniert mein Code, bis ich es behoben habe).
– Süßwasser
6. September 17 um 13:31 Uhr
@luskwater kannst du eine fsfiddle mit deinem Fix bereitstellen? Ich verstehe das Problem mit nicht out.scrollHeight - out.clientHeight <= out.scrollTop + 1. Verwenden Sie Padding in Ihrem CSS?
– dotnetZimmermann
19. September 17 um 13:06 Uhr
Das habe ich gesucht. Und dies ist die Antwort auf die Frage, die OP gestellt hat. Danke dotnetCarperter.
– Luis Menjivar
10. Oktober 17 um 22:27 Uhr
Vielleicht bin ich verwirrt, aber sollte es nicht “if (!isScrolledToBottom)” mit einem not sein? Das Hinzufügen des Not scheint das zu tun, was das OP verlangt hat.
Dadurch wird es beim Laden der Seite nach unten gescrollt, aber ich brauche es, um am Ende zu bleiben, wenn dynamischer Inhalt hinzugefügt wird, es sei denn, der Benutzer hat nach oben gescrollt.
– Robert E. McIntosh
4. September 13 um 13:07 Uhr
Das funktioniert perfekt. Ich aktualisiere mit dynamischen Inhalten und die Bildlaufleiste befindet sich immer unten.
– Andy Bajka
5. März 20 um 20:48 Uhr
Dies funktioniert nur für ein div mit fester Höhe. Funktioniert nicht für eine variable div-Höhe
– Protagonist
28. April 21 um 15:42 Uhr
Sasidharan
$('#div1').scrollTop($('#div1')[0].scrollHeight);
Or animated:
$("#div1").animate({ scrollTop: $('#div1')[0].scrollHeight}, 1000);
Dadurch wird es beim Laden der Seite nach unten gescrollt, aber ich brauche es, um am Ende zu bleiben, wenn dynamischer Inhalt hinzugefügt wird, es sei denn, der Benutzer hat nach oben gescrollt.
– Robert E. McIntosh
4. September 13 um 13:07 Uhr
Das funktioniert perfekt. Ich aktualisiere mit dynamischen Inhalten und die Bildlaufleiste befindet sich immer unten.
– Andy Bajka
5. März 20 um 20:48 Uhr
Dies funktioniert nur für ein div mit fester Höhe. Funktioniert nicht für eine variable div-Höhe
Bitte fügen Sie weitere Erläuterungen hinzu, wie Ihr Code die Frage des OP löst
– jro
31. März 19 um 4:22 Uhr
1, hat eine zusätzliche Einleitung hinzugefügt. 2, bitte Run code snippet sehen Sie direkt den Effekt.
– yisheng wu
1. April 19 um 2:33 Uhr
Die Schaltfläche „Code-Snippet ausführen“ wird bei mir nicht angezeigt. Überprüfen Sie Ihre Formatierung
– jro
1. April 19 um 5:13 Uhr
Das ist großartig. Bitte geben Sie den Link in Ihre Antwort ein
– jro
2. April 19 um 4:41 Uhr
Sehr kreative Lösung. Es kehrt jedoch den normalen Betrieb des Scrollrads meiner Maus um. Um nach oben zu gehen, muss ich “nach unten” scrollen und umgekehrt.
– mflühr
10. Juli 19 um 13:10 Uhr
.
7586200cookie-checkLassen Sie das Überlauf-Div nach unten gescrollt, es sei denn, der Benutzer scrollt nach obenyes
Verwenden Sie die CSS-Position oben, halten Sie sie unten
{position : relative; bottom:0;}
. Entfernen Sie die CSS-Eigenschaft, sobald der Benutzer gescrollt hat.– TCHdvlp
4. September 13 um 12:58 Uhr
Da Sie keine Antwort akzeptiert haben, möchte ich fragen: Hat es bei Ihnen funktioniert?
– Herr Manhattan
5. September 13 um 6:53 Uhr
Klingt nach einer Chatbox, die Sie erreichen möchten
– Thielicious
7. Juli 17 um 13:39 Uhr
Wenn Sie diese Frage noch nicht kennen, sollten Sie es mit CSS-Snap-In versuchen 2020.
– Wener
5. März 20 um 13:45 Uhr
Hier ist ein Nur CSS Methode, die in vielen Fällen funktioniert.
– Ashleedawg
21. August 21 um 16:41 Uhr