Scrollbare div-stick nach unten, wenn die äußeren div-änderungen in der Größe
Hier ist ein Beispiel-chat-app ->
Die Idee hier ist, um die .messages-container
nehmen so viel von dem Bildschirm, wie Sie können. Innerhalb .messages-container
, .scroll
hält die Liste der Nachrichten, und in Fall gibt es mehr Nachrichten, die dann die Größe des Bildschirms, scrollt.
Nun, betrachten diesen Fall:
- Der Benutzer führt einen Bildlauf auf der Unterseite von der Gespräch
- Die
.text-input
dynamisch größer
Nun, statt die user bleiben gerollt um die Unterseite des Gesprächs, der text-input erhöht, und Sie nicht mehr auf den Grund sehen.
Einen Weg, um es zu beheben, wenn wir reagieren, berechnen Sie die Höhe der text-input, und wenn sich etwas ändert, lassen .Nachrichten-container weiß
componentDidUpdate() {
window.setTimeout(_ => {
const newHeight = this.calcHeight();
if (newHeight !== this._oldHeight) {
this.props.onResize();
}
this._oldHeight = newHeight;
});
}
Aber, dies verursacht sichtbare performance-Probleme, und es ist traurig, übergeben werden Nachrichten wie diese.
Gibt es eine bessere Möglichkeit? Könnte ich den Einsatz von css in einer Weise, um auszudrücken, dass, wenn .text-input-erhöht, ich möchte im wesentlichen shift up
alle .Nachrichten-container
- Bitte erläutern Sie das css/js verwendet, um zu wachsen die text-Eingabe.
- Können Sie eine Geige besser zu aufwendige dein problem?
- Über die Größe des input-Textes, darf ich Fragen, warum ein Benutzer sollte in der Lage sein, das zu tun? ... Die meisten chat-apps nicht, und wenn Sie es tun, Sie nicht step-up-Nachrichten, wenn ein Benutzer die Größe ändern, damit die Benutzer eine bewusst dieses Verhalten (Skype zum Beispiel).
- Warum willst du die Größe des text-input?
- Die chat-app, die wir verwenden bei der Arbeit nicht lassen Sie das Feld "Eingabe" geändert werden, und es ist ein sehr praktisches feature (nicht das Gespräch Bildlauf nach unten, aber es wäre schön, wenn es auch Tat). Normalerweise habe ich die Größe auf nur eine oder zwei Zeilen, so dass ich sehen kann, mehr von der Konversation, aber manchmal ich brauche, um längere Kommentare dazu kann gehören, dass copy/Paste-Inhalt, code-Schnipsel, oder sogar Listen mit Aufzählungszeichen. In diesen Fällen, die ich mag in der Lage sein zu sehen, wie mein ganzer Kommentar, bevor ich Sie senden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
2:nd revision dieser Antwort
Dein Freund hier ist
flex-direction: column-reverse;
die Sie bitten, während richten Sie die Nachrichten am unteren Rand des message-Containers, wie zum Beispiel Skype und viele andere chat-apps tun.Den Nachteil mit
flex-direction: column-reverse;
ist ein bug in IE/Edge/Firefox, wo die Scrollbalken nicht erscheinen, die Ihr mehr dazu Lesen Sie hier: Flexbox-column-reverse-und überlauf in Firefox/IEDen Kopf ist Sie ~ 90% browser-Unterstützung auf mobile/Tabletten und ~ 65% für desktop und zählen als Fehler wird behoben, ...und gibt es einen workaround.
In den folgenden code-snippet habe ich die 2 Funktionen von oben, um IE/Edge/Firefox Verhalten sich in der gleichen Weise
flex-direction: column-reverse;
tut.JS:
CSS:
HTML:
Seite Hinweis 1: Das Nachweisverfahren ist nicht vollständig getestet, aber es sollte funktionieren auf neueren Browsern.
Seite Hinweis 2: Befestigen Sie eine resize-Ereignisprozedur für die chat-Eingabe könnte effizienter sein, dann ruft die updateScroll Funktion.
Hinweis: die Credits zu Gefährliche für die Wiederverwendung seiner html-Struktur
scrollbar
Problem, für den rest, ein work-around, um zu versuchen, halten Sie dasselbe Verhalten.flex-direction: column-reverse;
aus der css-Datei und kommentieren Sie die// updateScroll(msgdiv);
Teil im Skript, es wirkt fast das gleiche wie in webkit-Browsern..input-container { height: 80px }
hatte Feste Höhe und müssen Flüssigkeit.input-container { min-height: 80px }
Sie brauchen nur eine CSS-Regel festlegen:
Ist es, Sie sind fertig!
, Wie es funktioniert: Erstens, es vertikal spiegelt das container-element, so dass die oben wird unten (geben Sie uns die gewünschte scroll-Orientierung), dann schlägt das content-element, so dass die Nachrichten nicht auf den Kopf.
Dieser Ansatz funktioniert in allen modernen Browsern. Es ist eine seltsame Nebenwirkung, obwohl: wenn Sie ein Mausrad verwenden, die in der message-box, die Laufrichtung ist Umgekehrt. Dies kann behoben werden, mit ein paar JavaScript-Zeilen, wie unten gezeigt.
Hier ist eine demo und ein fiddle zu spielen:
JS:
CSS:
HTML:
justify-content
oderalign-content
) wird schließlich erforderlich sein, wenn Webkit folgt die neuesten spec, aber ich könnte falsch sein.flex-direction:column; justify-content:flex-end
macht das gleiche wieflex-direction: column-reverse; justify-content:flex-start
obwohl die scrollbar fehlt in webkit, also die fehlenden Blättern ist ein Problem, dass webkit behoben haben für die column-reverse-Eigenschaft und die anderen, die noch kommen werden.flex-direction
Eigenschaft. Ich würde die nehmen, die meinen, dass Sie dem hinzufügen müssten, eine dieser anderen Eigenschaften zu befassen sich mit Inhalten, die überläufe in der Spitze des Containers, anstatt unten. Ich könnte falsch, aber es. Lest Ihr das anders???justify-content:flex-end
wird der sein, der für die Zukunft zu erhalten top-überlauf.flex-direction: column-reverse;
verschiebt automatisch dieflex-start
Lage nach unten (was Sinn machen würde), dann vielleicht würden Sie nicht explizit gesetzt, wird die Rechtfertigung, daflex-start
ist die Standardeinstellung. Die Start-scroll-position wäre beiflex-start
würde, oder nicht? Dies wird beginnen, um mir Kopfschmerzen.flex-direction:column; justify-content:flex-end
macht das gleiche, obwohl der Mangel scrollen in allen Browsern webkit enthalten. Wir werden sehen, was die großen Jungs später beschließt Sie Ihre updates/specs zu kommen.Bitte versuchen Sie die folgenden fiddle - https://jsfiddle.net/Hazardous/bypxg25c/. Obwohl die fiddle ist derzeit mit jQuery zu wachsen/ändern der Größe der text-Bereich, der Knackpunkt ist in der flex Verwandte Stilrichtungen verwendet für den Nachrichten-container und input-container-Klassen -
Flex-shrink-Wert ist " 1 " gesetzt .Nachrichten-container und 0 für .input-container. Dadurch wird sichergestellt, dass Nachrichten-container schrumpft, wenn es eine Umverteilung von der Größe.
Habe ich verschoben
text-input
innerhalbmessages
absolute positioniert, es an der Unterseite des Containers und in Anbetrachtmessages
genug unten padding-space entsprechend.Ausführen von code, um eine Klasse zu
conversation
werden, ändert sich die Höhe dertext-input
- und bottom-padding vonmessages
mit einem schönen CSS-transition animation.JavaScript läuft ein "scrollTo" - Funktion zur gleichen Zeit wie die CSS-übergang ausgeführt wird, halten Sie die scroll am unteren Rand.
Wenn die scroll kommt aus dem Boden wieder, entfernen wir die Klasse von
conversation
Hoffe, das hilft.
https://jsfiddle.net/cnvzLfso/5/
JS:
CSS:
HTML:
Schreibst du;
JS:
Wäre das nicht die Methode, die dynamisch legt der .text-Eingabe die logische Ort, um Feuer.Requisiten.onResize().