Pracuję nad zagnieżdżonym układem flexbox, który powinien działać w następujący sposób:
Najbardziej zewnętrzny poziom ( ul#main
) to lista pozioma, która musi zostać rozszerzona w prawo, gdy zostanie do niej dodanych więcej elementów. Jeśli będzie zbyt duży, powinien pojawić się poziomy pasek przewijania.
#main {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
overflow-x: auto;
/* ...and more... */
}
Każda pozycja tej listy ( ul#main > li
) ma nagłówek ( ul#main > li > h2
) i wewnętrzną listę ( ul#main > li > ul.tasks
). Ta wewnętrzna lista jest pionowa i w razie potrzeby powinna być zawijana w kolumny. Przy zawijaniu w więcej kolumn jego szerokość powinna się zwiększyć, aby zrobić miejsce na więcej elementów. To zwiększenie szerokości powinno dotyczyć również pozycji zawierającej wykaz zewnętrzny.
.tasks {
flex-direction: column;
flex-wrap: wrap;
/* ...and more... */
}
Mój problem polega na tym, że wewnętrzne listy nie zawijają się, gdy wysokość okna jest zbyt mała. Próbowałem wielu zmian we wszystkich właściwościach flex, starając się skrupulatnie przestrzegać wytycznych CSS-Tricks , ale bez powodzenia.
Ten JSFiddle pokazuje, co mam do tej pory.
Oczekiwany wynik (czego chcę) :
Rzeczywisty wynik (co otrzymuję) :
Starszy wynik (jaki uzyskałem w 2015 roku) :
AKTUALIZACJA
Po pewnym dochodzeniu zaczyna wyglądać na większy problem. Wszystkie główne przeglądarki zachowują się w ten sam sposób i nie ma to nic wspólnego z zagnieżdżeniem mojego projektu flexbox. Jeszcze prostsze układy kolumn flexbox odmawiają zwiększenia szerokości listy, gdy elementy są zawijane.
Ten inny JSFiddle wyraźnie pokazuje problem. W aktualnych wersjach przeglądarek Chrome, Firefox i IE11 wszystkie elementy są poprawnie zawijane; wysokość listy wzrasta w row
trybie, ale jej szerokość nie zwiększa się w column
trybie. Ponadto nie ma żadnego natychmiastowego ponownego przepływu elementów podczas zmiany wysokości column
trybu, ale jest wrow
trybie.
Jednak oficjalne specyfikacje (spójrz konkretnie na przykład 5) wydają się wskazywać, że to, co chcę zrobić, powinno być możliwe.
Czy ktoś może wymyślić obejście tego problemu?
AKTUALIZACJA 2
Po wielu eksperymentach z wykorzystaniem JavaScript do aktualizowania wysokości i szerokości różnych elementów podczas zdarzeń zmiany rozmiaru, doszedłem do wniosku, że próba rozwiązania tego problemu w ten sposób jest zbyt złożona i zbyt trudna. Ponadto dodanie JavaScript zdecydowanie łamie model flexbox, który powinien być tak czysty, jak to tylko możliwe.
Na razie cofam się do overflow-y: auto
zamiast, aby w flex-wrap: wrap
razie potrzeby wewnętrzny pojemnik przewijał się pionowo. Nie jest ładna, ale jest to jedna z możliwości, która przynajmniej nie narusza zbytnio użyteczności.
column wrap
nie rozszerzał swojej szerokości podczas zawijania. Więcej informacji znajdziesz na code.google.com/p/chromium/issues/detail?id=247963 .