Saya sedang mengerjakan tata letak flexbox bersarang yang seharusnya berfungsi sebagai berikut:
Level terluar ( ul#main
) adalah daftar horizontal yang harus diperluas ke kanan ketika lebih banyak item ditambahkan ke dalamnya. Jika terlalu besar, harus ada bilah gulir horizontal.
#main {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
overflow-x: auto;
/* ...and more... */
}
Setiap item dari daftar ini ( ul#main > li
) memiliki header ( ul#main > li > h2
) dan daftar dalam ( ul#main > li > ul.tasks
). Daftar dalam ini adalah vertikal dan harus membungkus ke dalam kolom saat diperlukan. Ketika membungkus lebih banyak kolom, lebarnya harus bertambah untuk memberi ruang bagi lebih banyak item. Peningkatan lebar ini harus berlaku juga untuk item yang berisi daftar luar.
.tasks {
flex-direction: column;
flex-wrap: wrap;
/* ...and more... */
}
Masalah saya adalah bahwa daftar bagian dalam tidak membungkus ketika ketinggian jendela terlalu kecil. Saya telah mencoba banyak gangguan dengan semua properti fleksibel, mencoba mengikuti panduan di CSS-Trik dengan cermat, tetapi tidak berhasil.
JSFiddle ini menunjukkan apa yang saya miliki sejauh ini.
Hasil yang diharapkan (apa yang saya inginkan) :
Hasil aktual (apa yang saya dapatkan) :
Hasil yang lebih lama (apa yang saya dapatkan di 2015) :
MEMPERBARUI
Setelah beberapa penyelidikan, ini mulai terlihat seperti masalah yang lebih besar. Semua browser utama berperilaku dengan cara yang sama , dan tidak ada hubungannya dengan desain flexbox saya yang bersarang. Layout kolom flexbox yang lebih sederhana menolak untuk menambah lebar daftar saat item dibungkus.
JSFiddle lainnya ini dengan jelas menunjukkan masalahnya. Dalam versi Chrome, Firefox dan IE11 saat ini, semua item terbungkus dengan benar; tinggi daftar bertambah dalam row
mode, tetapi lebarnya tidak bertambah dalam column
mode. Juga, tidak ada reflow langsung elemen sama sekali ketika mengubah ketinggian column
mode, tetapi ada dalam row
mode.
Namun, spesifikasi resmi (lihat contoh 5) tampaknya mengindikasikan bahwa apa yang ingin saya lakukan harus dimungkinkan.
Bisakah seseorang menemukan solusi untuk masalah ini?
PEMBARUAN 2
Setelah banyak bereksperimen menggunakan JavaScript untuk memperbarui tinggi dan lebar berbagai elemen selama acara pengubahan ukuran, saya sampai pada kesimpulan bahwa itu terlalu rumit dan terlalu banyak kesulitan untuk mencoba menyelesaikannya dengan cara itu. Juga, menambahkan JavaScript pasti merusak model flexbox, yang harus dijaga sebersih mungkin.
Untuk saat ini, saya jatuh kembali ke overflow-y: auto
bukan flex-wrap: wrap
sehingga wadah bagian dalam bergulir secara vertikal saat diperlukan. Ini tidak cantik, tetapi ini adalah salah satu cara maju yang setidaknya tidak terlalu merusak kegunaan.
column wrap
tidak memperluas lebarnya saat membungkus. Lihat code.google.com/p/chromium/issues/detail?id=247963 untuk informasi lebih lanjut.Jawaban:
Masalah
Ini terlihat seperti kekurangan mendasar dalam tata letak fleksibel.
Wadah fleksibel dengan arah kolom tidak akan memuai untuk mengakomodasi kolom tambahan. (Ini bukan masalah di
flex-direction: row
.)Pertanyaan ini telah ditanyakan berkali-kali (lihat daftar di bawah), tanpa jawaban bersih di CSS.
Sulit untuk menyematkan ini sebagai bug karena masalah terjadi di semua browser utama. Tapi itu menimbulkan pertanyaan:
Anda akan berpikir setidaknya salah satu dari mereka akan melakukannya dengan benar. Saya hanya bisa berspekulasi tentang alasannya. Mungkin itu implementasi yang sulit secara teknis dan dibatalkan untuk iterasi ini.
UPDATE: Masalah ini tampaknya diselesaikan di Edge v16.
Ilustrasi Masalah
OP menciptakan demo bermanfaat yang menggambarkan masalah. Saya menyalinnya di sini: http://jsfiddle.net/nwccdwLw/1/
Opsi Penanganan Masalah
Solusi peretasan dari komunitas Stack Overflow:
"Sepertinya masalah ini tidak dapat diselesaikan hanya dengan CSS, jadi saya mengusulkan Anda solusi JQuery."
"Sungguh mengherankan bahwa sebagian besar browser belum menerapkan wadah flex kolom dengan benar, tetapi dukungan untuk mode penulisan cukup baik. Oleh karena itu, Anda dapat menggunakan wadah flex baris dengan mode penulisan vertikal."
Analisis Lebih Lanjut
Laporan Bug Chromium
Tandai jawaban Amery
Posting Lain Menggambarkan Masalah yang Sama
sumber
Terlambat ke pesta, tetapi masih mengalami masalah ini TAHUN kemudian. Akhirnya menemukan solusi menggunakan kisi. Pada wadah yang bisa Anda gunakan
Saya punya contoh pada CodePen yang beralih antara masalah flexbox dan perbaikan grid: https://codepen.io/MandeeD/pen/JVLdLd
sumber
grid-row-end: span X;
jika Anda membutuhkan beberapa item untuk mengambil lebih banyak baris.Sangat disayangkan bahwa begitu banyak browser utama menderita bug ini setelah bertahun-tahun. Pertimbangkan solusi Javascript. Setiap kali jendela browser mengubah ukuran, atau konten ditambahkan ke elemen, jalankan kode ini untuk membuatnya untuk mengubah ukuran ke lebar yang tepat. Anda dapat menentukan arahan dalam kerangka kerja Anda untuk melakukannya untuk Anda.
sumber
Saya baru saja menemukan solusi PURE CSS yang benar-benar mengagumkan di sini.
https://jsfiddle.net/gcob492x/3/
Caranya: atur
writing-mode: vertical-lr
di daftar div laluwriting-mode: horizontal-tb
di daftar item. Saya harus mengubah style di JSFiddle (menghapus banyak style alignment, yang tidak diperlukan untuk solusinya).Catatan: komentar mengatakan itu hanya berfungsi di browser berbasis Chromium, dan bukan Firefox. Saya hanya diuji secara pribadi di Chrome. Mungkin saja ada cara untuk memodifikasi ini agar berfungsi di browser lain atau ada pembaruan untuk browser yang membuat ini berfungsi.
Teriakan besar untuk komentar ini: Saat item flexbox terbungkus dalam mode kolom, kontainer tidak tumbuh lebarnya . Menggali utas masalah itu mengarahkan saya ke https://bugs.chromium.org/p/chromium/issues/detail?id=507397#c39 yang membawa saya ke JSFiddle ini.
sumber
Karena tidak ada solusi atau solusi yang tepat yang disarankan, saya berhasil mendapatkan perilaku yang diminta dengan pendekatan yang sedikit berbeda. Alih-alih memisahkan tata letak menjadi 3 div yang berbeda, saya menambahkan semua item menjadi 1 div dan membuat pemisahan dengan beberapa div di antaranya.
Solusi yang diusulkan adalah kode keras, dengan asumsi kita memiliki 3 bagian, tetapi dapat diperluas ke yang umum. Ide utamanya adalah menjelaskan bagaimana kita bisa mencapai tata letak ini.
:before
pada setiap item pertama, kami dapat menemukan judul setiap bagian.space
menciptakan kesenjangan antara bagian-bagianspace
tidak akan menutupi ketinggian penuh bagian saya juga menambahkan:after
ke bagian sehingga memposisikannya dengan posisi absolut dan latar belakang putih.z-index: -1
.sumber
Kemungkinan solusi JS ..
sumber
columns
properti style bisa menjadi titik awal untuk solusi yang bekerja. Mungkin menyesuaikan jumlah kolom dan lebar ul.