Das Problem
Flexbox macht das Zentrieren sehr einfach.
Durch einfaches Aufbringen align-items: center
und justify-content: center
auf den Flex-Container werden Ihre Flex-Elemente vertikal und horizontal zentriert.
Bei dieser Methode tritt jedoch ein Problem auf, wenn das Flex-Element größer als der Flex-Container ist.
Wie in der Frage erwähnt, ist der Deckel nicht mehr zugänglich, wenn der Flexgegenstand über den Behälter läuft.
Bei horizontalem Überlauf ist der linke Abschnitt nicht mehr zugänglich (oder der rechte Abschnitt in RTL-Sprachen).
Hier ist ein Beispiel mit einem LTR-Container mit justify-content: center
drei flexiblen Elementen:
Eine Erklärung dieses Verhaltens finden Sie am Ende dieser Antwort.
Lösung Nr. 1
Um dieses Problem zu beheben, verwenden Sie anstelle von Flexbox Auto Randsjustify-content
.
Mit auto
Rändern kann ein überlaufendes flexibles Element vertikal und horizontal zentriert werden, ohne den Zugriff auf einen Teil davon zu verlieren.
Also anstelle dieses Codes auf dem Flex-Container:
#flex-container {
align-items: center;
justify-content: center;
}
Verwenden Sie diesen Code für das Flex-Element:
.flex-item {
margin: auto;
}
Überarbeitete Demo
Lösung 2 (in den meisten Browsern noch nicht implementiert)
Fügen Sie den safe
Wert wie folgt zu Ihrer Keyword-Ausrichtungsregel hinzu:
justify-content: safe center
oder
align-self: safe center
Aus der Spezifikation des CSS-Box-Ausrichtungsmoduls :
4.4. Überlauf Ausrichtung: die safe
und unsafe
Keywords und Scroll - Sicherheitsgrenzen
Wenn das [Flex-Element] größer als der [Flex-Container] ist, läuft es über. Einige Ausrichtungsmodi können, wenn sie in dieser Situation berücksichtigt werden, zu Datenverlust führen. Wenn beispielsweise der Inhalt einer Seitenleiste zentriert ist und sie überlaufen, senden sie möglicherweise einen Teil ihrer Felder über die Startkante des Ansichtsfensters hinaus, zu der kein Bildlauf durchgeführt werden kann .
Um diese Situation zu steuern, kann ein Überlaufausrichtungsmodus explizit angegeben werden. Unsafe
Die Ausrichtung berücksichtigt den angegebenen Ausrichtungsmodus in Überlaufsituationen, auch wenn dies zu Datenverlust führt, während die safe
Ausrichtung den Ausrichtungsmodus in Überlaufsituationen ändert, um Datenverlust zu vermeiden.
Das Standardverhalten besteht darin, das Ausrichtungsobjekt im scrollbaren Bereich zu enthalten, obwohl diese Sicherheitsfunktion zum Zeitpunkt des Schreibens noch nicht implementiert ist.
safe
Wenn die Größe des [Flex-Elements] den [Flex-Container] überschreitet, wird das [Flex-Element] stattdessen so ausgerichtet, als wäre der Ausrichtungsmodus [ flex-start
].
unsafe
Unabhängig von den relativen Größen des [Flex-Elements] und des [Flex-Containers] wird der angegebene Ausrichtungswert berücksichtigt.
Hinweis: Das Box-Ausrichtungsmodul kann für mehrere Box-Layout-Modelle verwendet werden, nicht nur für Flex. Im obigen Spezifikationsauszug sagen die Begriffe in Klammern tatsächlich "Ausrichtungsgegenstand", "Ausrichtungscontainer" und " start
". Ich habe flex-spezifische Begriffe verwendet, um mich auf dieses spezielle Problem zu konzentrieren.
Erläuterung zur Bildlaufbeschränkung von MDN:
Überlegungen zu Flex-Elementen
Die Ausrichtungseigenschaften von Flexbox führen im Gegensatz zu anderen Zentrierungsmethoden in CSS eine "echte" Zentrierung durch. Dies bedeutet, dass die Flex-Elemente zentriert bleiben, auch wenn sie den Flex-Container überlaufen.
Dies kann jedoch manchmal problematisch sein, wenn sie über den oberen Rand der Seite oder den linken Rand [...] hinauslaufen, da Sie nicht in diesen Bereich scrollen können, selbst wenn dort Inhalt vorhanden ist!
In einer zukünftigen Version werden die Ausrichtungseigenschaften erweitert, um auch eine "sichere" Option zu haben.
Wenn dies ein Problem darstellt, können Sie stattdessen Ränder verwenden, um die Zentrierung zu erreichen, da diese "sicher" reagieren und die Zentrierung beenden, wenn sie überlaufen.
Anstatt die align-
Eigenschaften zu verwenden, setzen auto
Sie einfach Ränder auf die Flex-Elemente, die Sie zentrieren möchten.
Platzieren Sie anstelle der justify-
Eigenschaften automatische Ränder an den Außenkanten des ersten und letzten Flex-Elements im Flex-Container.
Die auto
Ränder "biegen" sich und nehmen den verbleibenden Platz ein, zentrieren die Flex-Elemente, wenn noch Platz übrig ist, und wechseln zur normalen Ausrichtung, wenn dies nicht der Fall ist.
Wenn Sie jedoch versuchen, justify-content
in einer mehrzeiligen Flexbox durch eine randbasierte Zentrierung zu ersetzen , haben Sie wahrscheinlich kein Glück, da Sie die Ränder auf das erste und letzte Flexelement in jeder Zeile setzen müssen. Wenn Sie nicht im Voraus vorhersagen können, welche Elemente in welcher Zeile landen, können Sie die justify-content
Eigenschaft nicht zuverlässig durch randbasierte Zentrierung in der Hauptachse ersetzen .
align-items: flex-start
es dem Flex-Container hinzu und bewahren Sie esmargin: auto
für das Flex-Element auf.Nun, wie Murphys Gesetz es wollte, führte die Lektüre, die ich nach dem Posten dieser Frage gemacht habe, zu einigen Ergebnissen - nicht vollständig gelöst, aber dennoch etwas nützlich.
Ich habe vor dem Posten ein wenig mit der Mindesthöhe herumgespielt, war mir jedoch der Größenbeschränkungen nicht bewusst, die für die Spezifikation ziemlich neu sind.
http://caniuse.com/#feat=intrinsic-width
Durch Hinzufügen eines
min-height: min-content
zum Flexbox-Bereich wird das Problem in Chrome behoben, und mit Herstellerpräfixen werden auch Opera und Safari behoben, obwohl Firefox weiterhin ungelöst ist.Ich suche immer noch nach Ideen für Firefox und andere mögliche Lösungen.
quelle
margin: auto
Anschlägenflex-basis
aus für mich arbeiten , während diese Antwort beider Probleme gelöst.Ich habe es mit nur 3 Containern geschafft. Der Trick besteht darin, den Flexbox-Container von dem Container zu trennen, der das Scrollen steuert. Zuletzt legen Sie alles in einen Root-Container, um alles zu zentrieren. Hier sind die wesentlichen Stile, um den Effekt zu erzielen:
CSS:
HTML:
Ich habe hier eine Demo erstellt: https://jsfiddle.net/r5jxtgba/14/
quelle
flex: 1 1 auto
an diescroll-container
. Ich tat dies aus Gewohnheit und geriet in ein Problem.Ich glaube, ich habe eine Lösung gefunden. Es funktioniert mit viel Text und ein wenig Text . Sie müssen die Breite von nichts angeben, und es sollte in IE8 funktionieren.
quelle
Laut MDN kann der
safe
Wert nun für Eigenschaften wiealign-items
und bereitgestellt werdenjustify-content
. Es wird wie folgt beschrieben:Es könnte also wie folgt verwendet werden.
Es ist jedoch unklar, wie viel Browserunterstützung es hat, ich konnte keine Beispiele für seine Verwendung finden und ich hatte selbst einige Probleme damit. Erwähnen Sie es hier, um mehr Aufmerksamkeit darauf zu lenken.
quelle
Ich habe es auch mit einem zusätzlichen Container geschafft
HTML
CSS
in jsfiddle> https://jsfiddle.net/Nash171/cpf4weq5/
Ändern Sie die Werte für die Breite / Höhe des Inhalts und sehen Sie
quelle
2 Container Flex-Methode mit Table Fallback getestet IE8-9, Flex funktioniert in IE10,11. Bearbeiten: Bearbeitet, um eine vertikale Zentrierung bei minimalem Inhalt sicherzustellen. Unterstützung für ältere Benutzer hinzugefügt.
Das Problem ist darauf zurückzuführen, dass die Höhe von der Größe des Ansichtsfensters geerbt wird, wodurch Kinder überlaufen, wie Michael antwortete. https://stackoverflow.com/a/33455342/3500688
etwas einfacheres und verwenden Sie flex, um das Layout innerhalb des Popup-Containers (Inhalt) zu pflegen:
quelle