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.

Hier ist ein funktionierendes Beispiel. https://codepen.io/jimbol/pen/YVJzBg

  • 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

Lassen Sie das Uberlauf Div nach unten gescrollt es sei denn
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


1643912709 225 Lassen Sie das Uberlauf Div nach unten gescrollt es sei denn
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.

if(isScrolledToBottom)
    out.scrollTop = out.scrollHeight - out.clientHeight;

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 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.

    Benutzer1142217

    23. Juni 18 um 18:07 Uhr

Lassen Sie das Uberlauf Div nach unten gescrollt es sei denn
wener

Im Jahr 2020 können Sie verwenden CSS-Snapaber vor Chrome 81 ändert sich das Layout Re-Snap nicht auslösenein reine CSS-Chat-Benutzeroberfläche funktioniert auf Chrome 81, auch Sie können überprüfen Kann ich CSS-Snap verwenden.

Diese Demo rastet das letzte Element ein, falls sichtbar, scrollen Sie nach unten, um den Effekt zu sehen.

.container {
  overflow-y: scroll;
  overscroll-behavior-y: contain;
  scroll-snap-type: y proximity;
}

.container > div > div:last-child {
  scroll-snap-align: end;
}

.container > div > div {
  background: lightgray;
  height: 3rem;
  font-size: 1.5rem;
}
.container > div > div:nth-child(2n) {
  background: gray;
}
<div class="container" style="height:6rem">
<div>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
</div>

Geben Sie hier die Bildbeschreibung ein

BEARBEITEN

benutzen scroll-snap-type: y proximity;einfacher nach oben scrollen.

Lassen Sie das Uberlauf Div nach unten gescrollt es sei denn
Alvaro

$('#yourDiv').scrollTop($('#yourDiv')[0].scrollHeight);

Live-Demo: http://jsfiddle.net/KGfG2/

  • 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

1643912710 4 Lassen Sie das Uberlauf Div nach unten gescrollt es sei denn
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

    – Protagonist

    28. April 21 um 15:42 Uhr

.cont{
height: 100px;
overflow-x: hidden;
overflow-y: auto;
transform: rotate(180deg);
direction:rtl;
text-align:left;
}
ul{
overflow: hidden;
transform: rotate(180deg);
}
<div class="cont"> 
 <ul>
   <li>0</li>
   <li>1</li>
   <li>2</li>
   <li>3</li>
   <li>4</li>
   <li>5</li>
   <li>6</li>
   <li>7</li>
   <li>8</li>
   <li>9</li>
   <li>10</li>  
 </ul>
</div>
  1. Run code snippet um die Wirkung zu sehen. (PS: Wenn Run code snippet funktioniert nicht, versuchen Sie Folgendes: https://jsfiddle.net/Yeshen/xm2yLksu/3/ )

  2. Wie es funktioniert:

Der Standardüberlauf ist das Scrollen von oben nach unten.

transform: rotate(180deg) kann es scrollen lassen oder dynamische Blöcke von unten nach oben laden.

  1. Originale Idee:

https://blog.csdn.net/yeshennet/article/details/88880252

  • 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

.

758620cookie-checkLassen Sie das Überlauf-Div nach unten gescrollt, es sei denn, der Benutzer scrollt nach oben

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy