Saya menggunakan kotak fleksibel untuk menampilkan 8 item yang secara dinamis akan mengubah ukuran dengan halaman saya. Bagaimana saya memaksanya untuk membagi item menjadi dua baris? (4 per baris)?
Ini snip yang relevan:
(Atau jika Anda lebih suka jsfiddle - http://jsfiddle.net/vivmaha/oq6prk1p/2/ )
.parent-wrapper {
height: 100%;
width: 100%;
border: 1px solid black;
}
.parent {
display: flex;
font-size: 0;
flex-wrap: wrap;
margin: -10px 0 0 -10px;
}
.child {
display: inline-block;
background: blue;
margin: 10px 0 0 10px;
flex-grow: 1;
height: 100px;
}
<body>
<div class="parent-wrapper">
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
</div>
</body>
Jawaban:
Anda sudah berada
flex-wrap: wrap
di wadah. Itu bagus, karena mengesampingkan nilai default, yaitunowrap
( sumber ). Ini adalah alasan item tidak membungkus untuk membentuk kisi dalam beberapa kasus .Dalam hal ini, masalah utama adalah
flex-grow: 1
pada item fleksibel.The
flex-grow
properti tidak benar-benar ukuran item fleksibel. Tugasnya adalah mendistribusikan ruang kosong dalam wadah ( sumber ). Jadi, sekecil apa pun ukuran layar, setiap item akan menerima bagian proporsional dari ruang kosong di telepon.Lebih khusus, ada delapan item fleksibel dalam wadah Anda. Dengan
flex-grow: 1
, masing-masing menerima 1/8 dari ruang kosong di telepon. Karena tidak ada konten di item Anda, mereka dapat menyusut menjadi nol lebar dan tidak akan pernah membungkus.Solusinya adalah menentukan lebar pada item. Coba ini:
Dengan
flex-grow: 1
didefinisikan dalamflex
steno, tidak perluflex-basis
menjadi 25%, yang sebenarnya akan menghasilkan tiga item per baris karena margin.Karena
flex-grow
akan mengkonsumsi ruang kosong di baris,flex-basis
hanya perlu cukup besar untuk menegakkan bungkus. Dalam hal ini, denganflex-basis: 21%
, ada banyak ruang untuk margin, tetapi tidak pernah cukup ruang untuk item kelima.sumber
flex: 1 0 calc(25% - 10px);
margin: 2%;
bukan angka piksel tetap untuk mencegah kotak melompat ke baris baru pada perangkat kecil / resolusi. rumus umum adalah(100 - (4 * box-width-percent)) / 8
% untuk lebar kotak yang berbedaTambahkan lebar ke
.child
elemen. Saya pribadi akan menggunakan persentasemargin-left
jika Anda ingin selalu 4 per baris.DEMO
sumber
Ini adalah apporach lain.
Anda dapat melakukannya dengan cara ini juga:
Contoh: https://codepen.io/capynet/pen/WOPBBm
Dan contoh yang lebih lengkap: https://codepen.io/capynet/pen/JyYaba
sumber
Saya akan melakukannya seperti ini menggunakan margin negatif dan kalk untuk talang:
Demo: https://jsfiddle.net/9j2rvom4/
Metode Kotak CSS Alternatif:
Demo: https://jsfiddle.net/jc2utfs3/
sumber
Semoga ini bisa membantu. untuk lebih detail Anda bisa mengikuti tautan ini
sumber
Saya percaya contoh ini lebih barebones dan lebih mudah dipahami daripada @dowomenfart.
Ini menghasilkan perhitungan lebar yang sama sambil memotong langsung ke daging. Matematika lebih mudah dan
em
merupakan standar baru karena skalabilitas dan keramahannya pada perangkat seluler.sumber
;)
sumber
justify-content: space-evenly;
prent, maka mereka menyelaraskan dengan baik dan Anda tidak harus melakukancalc
pada anak. Terima kasih untuk contohnya!Bungkus fleksibel + margin negatif
Mengapa fleksibel vs
display: inline-block
?Mengapa margin negatif?
Baik Anda menggunakan SCSS atau CSS-in-JS untuk kasus tepi (yaitu elemen pertama dalam kolom), atau Anda menetapkan margin default dan menyingkirkan margin luar nanti.
Penerapan
https://codepen.io/zurfyx/pen/BaBWpja
sumber
Inilah cara lain tanpa menggunakan
calc()
.Hanya itu yang ada untuk itu. Anda bisa menyukai dimensi untuk mendapatkan ukuran yang lebih estetis tetapi ini adalah idenya.
sumber