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 .