Ich arbeite an einem verschachtelten Flexbox-Layout, das wie folgt funktionieren sollte:
Die äußerste Ebene ( ul#main
) ist eine horizontale Liste, die nach rechts erweitert werden muss, wenn weitere Elemente hinzugefügt werden. Wenn es zu groß wird, sollte eine horizontale Bildlaufleiste vorhanden sein.
#main {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
overflow-x: auto;
/* ...and more... */
}
Jedes Element dieser Liste ( ul#main > li
) hat einen Header ( ul#main > li > h2
) und eine innere Liste ( ul#main > li > ul.tasks
). Diese innere Liste ist vertikal und sollte bei Bedarf in Spalten eingeschlossen werden. Wenn Sie mehr Spalten einschließen, sollte sich die Breite erhöhen, um Platz für mehr Elemente zu schaffen. Diese Breitenerhöhung sollte auch für das enthaltene Element der äußeren Liste gelten.
.tasks {
flex-direction: column;
flex-wrap: wrap;
/* ...and more... */
}
Mein Problem ist, dass die inneren Listen nicht umbrochen werden, wenn die Höhe des Fensters zu klein wird. Ich habe viele Manipulationen an allen Flex-Eigenschaften versucht und versucht, die Richtlinien bei CSS-Tricks akribisch zu befolgen , aber kein Glück.
Diese JSFiddle zeigt, was ich bisher habe.
Erwartetes Ergebnis (was ich will) :
Tatsächliches Ergebnis (was ich bekomme) :
Älteres Ergebnis (was ich 2015 bekommen habe) :
AKTUALISIEREN
Nach einigen Untersuchungen scheint dies ein größeres Problem zu sein. Alle gängigen Browser verhalten sich gleich und haben nichts damit zu tun, dass mein Flexbox-Design verschachtelt ist. Noch einfachere Flexbox-Spaltenlayouts weigern sich, die Listenbreite zu erhöhen, wenn die Elemente umbrochen werden.
Diese andere JSFiddle zeigt das Problem deutlich. In aktuellen Versionen von Chrome, Firefox und IE11 werden alle Elemente korrekt verpackt. Die Höhe der Liste nimmt im row
Modus zu, die Breite im column
Modus jedoch nicht . Es gibt auch überhaupt keinen sofortigen Rückfluss von Elementen, wenn die Höhe eines column
Modus geändert wird, aber es gibt einen row
Modus.
Die offiziellen Spezifikationen (siehe Beispiel 5) scheinen jedoch darauf hinzudeuten, dass das, was ich tun möchte, möglich sein sollte.
Kann jemand eine Problemumgehung für dieses Problem finden?
UPDATE 2
Nachdem ich viel mit JavaScript experimentiert habe, um die Höhe und Breite verschiedener Elemente während Größenänderungsereignissen zu aktualisieren, bin ich zu dem Schluss gekommen, dass es zu komplex und zu schwierig ist, es auf diese Weise zu lösen. Durch das Hinzufügen von JavaScript wird das Flexbox-Modell definitiv beschädigt, das so sauber wie möglich gehalten werden sollte.
Im Moment greife ich auf zurück, overflow-y: auto
anstatt flex-wrap: wrap
dass der innere Container bei Bedarf vertikal rollt. Es ist nicht schön, aber es ist ein Weg nach vorne, der zumindest die Benutzerfreundlichkeit nicht zu sehr beeinträchtigt.
column wrap
seine Breite beim Umbrechen nicht vergrößert. Weitere Informationen finden Sie unter code.google.com/p/chromium/issues/detail?id=247963 .Antworten:
Das Problem
Dies scheint ein grundlegender Mangel im Flex-Layout zu sein.
Ein Flex-Container in Spaltenrichtung wird nicht erweitert, um zusätzliche Spalten aufzunehmen. (Dies ist kein Problem in
flex-direction: row
.)Diese Frage wurde oft gestellt (siehe Liste unten), ohne saubere Antworten in CSS.
Es ist schwierig, dies als Fehler zu erkennen, da das Problem in allen gängigen Browsern auftritt. Aber es wirft die Frage auf:
Sie würden denken, mindestens einer von ihnen würde es richtig machen. Ich kann nur über den Grund spekulieren. Vielleicht war es eine technisch schwierige Implementierung und wurde für diese Iteration zurückgestellt.
UPDATE: Das Problem scheint in Edge v16 behoben zu sein.
Illustration des Problems
Das OP hat eine nützliche Demo erstellt, die das Problem veranschaulicht. Ich kopiere es hier: http://jsfiddle.net/nwccdwLw/1/
Problemumgehungsoptionen
Hacky-Lösungen aus der Stack Overflow-Community:
"Es scheint, dass dieses Problem nicht nur mit CSS gelöst werden kann. Ich schlage Ihnen daher eine JQuery-Lösung vor."
"Es ist merkwürdig, dass die meisten Browser Spaltenflexcontainer nicht korrekt implementiert haben, aber die Unterstützung für Schreibmodi ist recht gut. Daher können Sie einen Zeilenflexcontainer mit vertikalem Schreibmodus verwenden."
Weitere Analyse
Chromium Bug Report
Mark Amerys Antwort
Andere Beiträge, die das gleiche Problem beschreiben
quelle
Spät zur Party, aber noch Jahre später auf diese Ausgabe gestoßen. Am Ende fand ich eine Lösung mit Grid. Auf dem Container können Sie verwenden
Ich habe ein Beispiel für CodePen, das zwischen dem Flexbox-Problem und dem Grid-Fix umschaltet: https://codepen.io/MandeeD/pen/JVLdLd
quelle
grid-row-end: span X;
wenn Sie einige der Elemente benötigen, um mehr Zeilen aufzunehmen.Es ist bedauerlich, dass so viele große Browser nach vielen Jahren unter diesem Fehler leiden. Betrachten Sie eine Javascript-Problemumgehung. Wenn das Browserfenster die Größe ändert oder dem Element Inhalt hinzugefügt wird, führen Sie diesen Code aus, damit die Größe auf die richtige Breite geändert wird. Sie können in Ihrem Framework eine Direktive definieren, die dies für Sie erledigt.
quelle
Da noch keine Lösung oder geeignete Problemumgehung vorgeschlagen wurde, gelang es mir, das angeforderte Verhalten mit einem etwas anderen Ansatz zu erhalten. Anstatt das Layout in 3 verschiedene Divs zu unterteilen, füge ich alle Elemente zu 1 Div hinzu und erstelle die Trennung mit einigen weiteren Divs dazwischen.
Die vorgeschlagene Lösung ist hartcodiert, vorausgesetzt, wir haben drei Abschnitte, kann aber auf einen generischen erweitert werden. Die Hauptidee ist zu erklären, wie wir dieses Layout erreichen können.
:before
jedes ersten Elements können wir den Titel jedes Abschnitts ermitteln.space
wird die Lücke zwischen den Abschnitten erstelltspace
Abschnitt nicht die gesamte Höhe des Abschnitts abdeckt, füge ich ihn auch:after
zu den Abschnitten hinzu , sodass er mit absoluter Position und weißem Hintergrund positioniert wird.z-index: -1
.quelle
Mögliche JS-Lösung ..
quelle
columns
style-Eigenschaft könnte jedoch ein Ausgangspunkt für eine funktionierende Lösung sein. Vielleicht die Anzahl der Spalten und die Breite der Ul anpassen .