Ich habe ein Div, das nur 300 Pixel groß ist, und ich möchte, dass beim Laden der Seite zum Ende des Inhalts gescrollt wird. Diesem Div werden Inhalte dynamisch hinzugefügt und müssen bis zum Anschlag gescrollt werden. Wenn der Benutzer sich entscheidet, nach oben zu scrollen, möchte ich nicht, dass er nach unten zurückspringt, 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 zurückblättert, muss er sich selbst dann unten halten, wenn neuer dynamischer Inhalt hinzugefügt wird. Wie würde ich das schaffen?
{position : relative; bottom:0;}
. Entfernen Sie die CSS-Eigenschaft, sobald der Benutzer einen Bildlauf durchgeführt hat.Antworten:
Dies könnte Ihnen helfen:
[BEARBEITEN], passend zum Kommentar ...
Rufen Sie beim Hinzufügen von Inhalten die Funktion updateScroll () auf oder stellen Sie einen Timer ein:
Wenn Sie NUR aktualisieren möchten, wenn sich der Benutzer nicht bewegt hat:
quelle
setInterval
für dieses leichte Problem hinzuzufügen .Ich konnte dies nur mit CSS zum Laufen bringen.
Der Trick ist,
display: flex;
und zu verwendenflex-direction: column-reverse;
Der Browser behandelt die Unterseite wie die Oberseite. Angenommen, die Browser, auf die Sie abzielen, unterstützen
flex-box
, besteht die einzige Einschränkung darin, dass das Markup in umgekehrter Reihenfolge erfolgen muss.Hier ist ein Arbeitsbeispiel. https://codepen.io/jimbol/pen/YVJzBg
quelle
overflow:auto; display:flex; flex-direction:column-reverse;
auf den äußeren Wrapper anstelle des inneren Wrappers anwenden .Ich habe das gerade implementiert und vielleicht können Sie meinen Ansatz verwenden.
Angenommen, wir haben den folgenden HTML-Code:
Dann können wir überprüfen, ob es nach unten gescrollt hat mit:
scrollHeight gibt die Höhe des Elements an, einschließlich aller nicht sichtbaren Bereiche aufgrund von Überlauf. clientHeight gibt Ihnen die CSS-Höhe oder auf andere Weise die tatsächliche Höhe des Elements an. Beide Methoden geben die Höhe ohne zurück
margin
, sodass Sie sich darüber keine Sorgen machen müssen. scrollTop gibt Ihnen die Position des vertikalen Bildlaufs an . 0 ist oben und max ist die scrollHeight des Elements minus der Elementhöhe selbst. Bei Verwendung der Bildlaufleiste kann es schwierig sein (für mich in Chrome), die Bildlaufleiste ganz nach unten zu bringen. Also warf ich eine 1px Ungenauigkeit ein. SoisScrolledToBottom
wird wahr sein , selbst wenn die Scrollbar von unten ist 1px. Sie können dies auf das einstellen, was sich für Sie richtig anfühlt.Dann geht es einfach darum, das scrollTop des Elements nach unten zu setzen.
Ich habe eine Geige für Sie gemacht, um das Konzept zu zeigen: http://jsfiddle.net/dotnetCarpenter/KpM5j/
BEARBEITEN: Code-Snippet hinzugefügt, um zu verdeutlichen, wann dies der Fall
isScrolledToBottom
isttrue
.Scrollen Sie die Bildlaufleiste nach unten
quelle
if(!isScrolledToBottom)
: Der Test sieht für mich falsch aus (und hat in meinem Code nicht funktioniert , bis ich ihn behoben habe).out.scrollHeight - out.clientHeight <= out.scrollTop + 1
. Verwenden Sie Padding in Ihrem CSS?document.getScrollingElement
wie hier vorgeschlagen zu verwenden: stackoverflow.com/questions/36227559/scrolltop-always-returns-0/…Live-Demo: http://jsfiddle.net/KGfG2/
quelle
quelle
Im Jahr 2020 können Sie CSS-Snap verwenden , aber vor Chrome 81 löst die Layoutänderung keinen erneuten Snap aus . Eine reine CSS-Chat-Benutzeroberfläche funktioniert unter Chrome 81. Sie können auch überprüfen, ob ich CSS-Snap verwenden kann .
Diese Demo fängt das letzte Element ein, wenn es sichtbar ist. Scrollen Sie nach unten, um den Effekt zu sehen.
quelle
Run code snippet
um den Effekt zu sehen. (PS: WennRun code snippet
es nicht funktioniert, versuchen Sie Folgendes: https://jsfiddle.net/Yeshen/xm2yLksu/3/ )Wie es funktioniert:
Der Standardüberlauf ist das Scrollen von oben nach unten.
transform: rotate(180deg)
kann den dynamischen Block von unten nach oben scrollen oder laden.https://blog.csdn.net/yeshennet/article/details/88880252
quelle
Run code snippet
sehen Sie direkt den Effekt.Dadurch wird die ScrollTop-Position aus der Höhe der
#yourDivID
Verwendung der$(document).height()
Eigenschaft berechnet, sodass sich der Scroller auch dann an der unteren Position befindet, wenn dem div dynamische Inhalte hinzugefügt werden. Hoffe das hilft. Aber es hat auch einen kleinen Fehler, selbst wenn wir nach oben scrollen und den Mauszeiger vom Scroller lassen, wird es automatisch an die unterste Position gebracht. Wenn jemand das auch korrigieren könnte, wäre es schön.quelle
Hier ist meine Version basierend auf der Antwort von dotnetCarpenter. Mein Ansatz ist eine reine jQuery und ich habe die Variablen benannt, um die Dinge ein bisschen klarer zu machen. Was passiert, ist, wenn die Inhaltshöhe größer ist als der Container, den wir den zusätzlichen Abstand nach unten scrollen, um das gewünschte Ergebnis zu erzielen.
Funktioniert in IE und Chrome ..
quelle
Die Antwort von Jim Hall ist vorzuziehen, da sie beim Scrollen zwar nicht nach unten scrollt, aber auch reines CSS ist.
Leider ist dies jedoch keine stabile Lösung: In Chrome (möglicherweise aufgrund des von dotnetCarpenter oben beschriebenen 1-px-Problems)
scrollTop
verhält es sich auch ohne Benutzerinteraktion (beim Hinzufügen von Elementen) um 1 Pixel ungenau. Sie können festlegenscrollTop = scrollHeight - clientHeight
, aber das hält das div in Position, wenn ein anderes Element hinzugefügt wird, auch bekannt als die Funktion "Selbst unten bleiben" funktioniert nicht mehr.Kurz gesagt, wenn Sie eine kleine Menge Javascript (Seufzer) hinzufügen, wird dies behoben und alle Anforderungen erfüllt:
So etwas wie https://codepen.io/anon/pen/pdrLEZ this (Beispiel von Coo) und nach dem Hinzufügen eines Elements zur Liste auch das Folgende:
Dabei ist 29 die Höhe einer Linie.
Wenn der Benutzer eine halbe Zeile nach oben scrollt (wenn das überhaupt möglich ist?), Ignoriert das Javascript diese und scrollt nach unten. Aber ich denke, das ist vernachlässigbar. Und es behebt das Chrome 1 px-Ding.
quelle
Hier ist eine Lösung, die auf einem Blogbeitrag von Ryan Hunt basiert . Dies hängt von der
overflow-anchor
CSS-Eigenschaft ab, mit der die Bildlaufposition an ein Element am unteren Rand des Bildlaufinhalts angehängt wird.Beachten Sie, dass
overflow-anchor
dies derzeit nicht in Safari oder Edge funktioniert, sodass diese Lösung derzeit nicht in allen Browsern funktioniert.quelle
Sie können so etwas verwenden,
quelle
Hier ist, wie ich es angegangen bin. Meine Div-Höhe beträgt 650px. Ich entschied, dass wenn die Bildlaufhöhe innerhalb von 150px vom Boden liegt, automatisch gescrollt wird. Andernfalls überlassen Sie es dem Benutzer.
quelle