Saya perlu menerapkan tata letak batu yang cukup run-off-the-mill. Namun, untuk sejumlah alasan saya tidak ingin menggunakan JavaScript untuk melakukannya.
Parameter:
- Semua elemen memiliki lebar yang sama
- Elemen memiliki tinggi yang tidak dapat dihitung sisi server (gambar ditambah berbagai jumlah teks)
- Saya bisa hidup dengan jumlah kolom yang tetap jika saya harus
ada solusi sepele untuk ini yang bekerja di browser modern, yang column-count
properti.
Masalah dengan solusi itu adalah bahwa elemen-elemen disusun dalam kolom:
Sementara saya membutuhkan elemen untuk dipesan dalam baris, setidaknya kira-kira:
Saya sudah mencoba pendekatan yang tidak berhasil:
- Membuat barang
display: inline-block
: membuang-buang ruang vertikal. - Membuat barang
float: left
: lol, tidak.
Sekarang saya bisa mengubah rendering sisi server dan menyusun ulang item yang membagi jumlah item dengan jumlah kolom, tapi itu rumit, rawan kesalahan (berdasarkan bagaimana browser memutuskan untuk membagi daftar item menjadi kolom), jadi saya ingin untuk menghindarinya jika memungkinkan.
Apakah ada sihir flexbox bermodel baru yang memungkinkan ini terjadi?
Jawaban:
Flexbox
Tata letak batu yang dinamis tidak dimungkinkan dengan flexbox, setidaknya tidak dengan cara yang bersih dan efisien.
Flexbox adalah sistem tata letak satu dimensi. Ini berarti dapat menyelaraskan item di sepanjang garis horizontal atau vertikal. Item fleksibel terbatas pada baris atau kolomnya.
Sistem grid yang sebenarnya adalah dua dimensi, artinya dapat menyelaraskan item di sepanjang garis horizontal DAN vertikal. Item konten dapat menjangkau seluruh baris dan kolom secara bersamaan, yang item fleksibel tidak dapat lakukan.
Inilah sebabnya mengapa flexbox memiliki kapasitas terbatas untuk membangun kisi-kisi. Itu juga alasan mengapa W3C telah mengembangkan teknologi CSS3 lain, Grid Layout .
row wrap
Dalam wadah fleksibel dengan
flex-flow: row wrap
, item fleksibel harus dibungkus dengan baris baru .Ini berarti bahwa item fleksibel tidak dapat dibungkus di bawah item lain di baris yang sama .
Perhatikan di atas bagaimana div # 3 membungkus di bawah div # 1 , membuat baris baru. Itu tidak dapat membungkus di bawah div # 2 .
Akibatnya, ketika item bukan yang tertinggi di baris, ruang putih tetap ada, menciptakan celah yang tidak sedap dipandang.
column wrap
Jika Anda beralih ke
flex-flow: column wrap
, tata letak seperti grid lebih dapat dicapai. Namun, wadah pengarah kolom memiliki empat masalah potensial segera:Akibatnya, wadah arah kolom bukan merupakan pilihan dalam kasus ini, dan dalam banyak kasus lainnya.
Kotak CSS dengan dimensi item tidak ditentukan
Layout Kotak akan menjadi solusi sempurna untuk masalah Anda jika berbagai ketinggian item konten dapat ditentukan sebelumnya . Semua persyaratan lain berada dalam kapasitas Grid.
Lebar dan tinggi item kisi harus diketahui untuk menutup celah dengan item di sekitarnya.
Jadi Grid, yang merupakan CSS terbaik yang ditawarkan untuk membangun tata letak batu yang mengalir secara horizontal, gagal dalam hal ini.
Bahkan, sampai teknologi CSS tiba dengan kemampuan untuk secara otomatis menutup kesenjangan, CSS secara umum tidak memiliki solusi. Sesuatu seperti ini mungkin perlu merefleksikan dokumen, jadi saya tidak yakin seberapa berguna atau efisiennya dokumen itu.
Anda membutuhkan skrip.
Solusi JavaScript cenderung menggunakan penentuan posisi absolut, yang menghapus item konten dari aliran dokumen untuk mengaturnya kembali tanpa ada celah. Berikut ini dua contoh:
Desandro Masonry
Cara Membangun Situs yang Berfungsi Seperti Pinterest
CSS Grid dengan dimensi item didefinisikan
Untuk tata letak tempat lebar dan tinggi item konten diketahui, berikut ini adalah tata letak pasangan bata yang mengalir secara horizontal di CSS murni:
Demo jsFiddle
Bagaimana itu bekerja
inline-grid
akan menjadi pilihan lain)grid-auto-rows
properti menetapkan ketinggian baris secara otomatis. Di kotak ini setiap baris tingginya 50px.grid-gap
properti adalah singkatan untukgrid-column-gap
dangrid-row-gap
. Aturan ini menetapkan kesenjangan 10px antara item kisi. (Ini tidak berlaku untuk area antara item dan wadah.)The
grid-template-columns
properti menetapkan lebar kolom didefinisikan secara eksplisit.The
repeat
notasi mendefinisikan pola berulang kolom (atau baris).The
auto-fill
Fungsi memberitahu grid untuk berbaris banyak kolom (atau baris) mungkin tanpa meluap wadah. (Ini dapat membuat perilaku yang mirip dengan tata letak fleksibelflex-wrap: wrap
.)The
minmax()
fungsi menetapkan minimum dan maksimum rentang ukuran untuk masing-masing kolom (atau baris). Dalam kode di atas, lebar setiap kolom akan menjadi minimum 30% dari wadah dan maksimum ruang kosong apa pun yang tersedia.The
fr
Unit mewakili sebagian kecil dari ruang bebas dalam wadah kotak. Ini sebanding denganflex-grow
properti flexbox .Dengan
grid-row
danspan
kami memberi tahu item kisi berapa banyak baris yang harus mereka bentangkan.Dukungan Browser untuk Grid CSS
Inilah gambaran lengkapnya: http://caniuse.com/#search=grid
Fitur overlay kisi keren di Firefox
Di alat pengembang Firefox, ketika Anda memeriksa wadah kotak, ada ikon kotak kecil di deklarasi CSS. Pada klik itu akan menampilkan garis besar grid Anda pada halaman.
Lebih detail di sini: https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Examine_grid_layouts
sumber
Baru-baru ini ditemukan teknik yang melibatkan flexbox: https://tobiasahlin.com/blog/masonry-with-css/ .
Artikel itu masuk akal bagi saya, tetapi saya belum mencoba menggunakannya, jadi saya tidak tahu apakah ada peringatan, selain yang disebutkan dalam jawaban Michael.
Berikut ini contoh dari artikel tersebut, yang memanfaatkan
order
properti tersebut, dikombinasikan dengan:nth-child
.Potongan tumpukan
sumber
order
properti, membuatnya terlihat seperti barang mengalir dari kiri ke kanan. Namun, trik utamanya adalahflex-flow: column wrap
, yang disebutkan dalam jawaban di atas. Selain itu, item tidak dapat mengalirkan barang seperti yang dilakukan pasangan bata asli, mis. Jika barang ke-3 dan ke-4 cocok di kolom ke-3, mereka akan, barang yang ditautkan tidak. Tetapi sekali lagi seperti yang saya katakan, itu semua tergantung pada apa persyaratannya, dan dalam hal ini (pertanyaan ini), itu tidak akan berfungsi seperti yang diminta.