Cara yang lebih baik untuk mengatur jarak antara flexbox item
Untuk mengatur jarak minimal antara flexbox item I'm menggunakan margin: 0 5px
on .item
dan margin: 0 -5px
pada wadah. Bagi saya tampaknya seperti hack, tapi saya dapat't menemukan cara yang lebih baik untuk melakukan hal ini.
[Contoh][1]
#box {
display: flex;
width: 100px;
margin: 0 -5px;
}
.item {
background: gray;
width: 50px;
height: 50px;
margin: 0 5px;
}
<div id='box'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
648
39
border-spacing
untuk tabel (kecuali untuk CSS propertygap
yang isn't didukung dengan baik di sebagian besar browser, caniuse)Oleh karena itu untuk mencapai apa yang anda minta adalah sedikit lebih sulit.
Dalam pengalaman saya, "terbersih" yang't menggunakan
:first-child
/:last-child
dan bekerja tanpa modifikasi apapun padaflex-bungkus:bungkus
adalah untuk mengaturpadding:5px
pada wadah danmargin:5px
pada anak-anak. Yang akan menghasilkan10px
gap antara masing-masing anak-anak dan antara masing-masing anak-anak dan orang tua mereka.[Demo](http://jsfiddle.net/7XD8s/)
Ini bukan hack. Teknik yang sama juga digunakan oleh bootstrap dan grid, meskipun, bukan margin, bootstrap menggunakan padding untuk cols.
flexbox dan css calc()
Halo, di bawah ini saya bekerja solusi untuk semua browser mendukung flexbox. Tidak ada margin negatif, tidak ada hacks, tidak ada penyelesaian, Css murni.
[Biola Demo][1]
.flexbox { tampilan: flex; flex-arah: - turut; flex-bungkus: bungkus; membenarkan-content: ruang-antara; }
Anda dapat menggunakan transparan perbatasan.
Saya telah merenungkan masalah ini ketika mencoba untuk membangun sebuah flex grid model yang dapat mundur ke meja + meja-model sel untuk browser lama. Dan Perbatasan untuk kolom talang sepertinya saya yang terbaik sesuai pilihan. yaitu Meja-sel don't memiliki margin.
misalnya
Juga perhatikan bahwa anda perlu
min-width: 50px;
untuk flexbox. Flex model tidak akan menangani ukuran tetap kecuali anda melakukanflex: none;
pada anak tertentu elemen yang anda inginkan sebagai tetap dan oleh karena itu dikecualikan dari menjadi"flexi"
. http://jsfiddle.net/GLpUp/4/ Tapi semua kolom bersama-sama denganflex:none;
tidak lagi flex model. Di sini adalah sesuatu yang lebih dekat ke model flex: http://jsfiddle.net/GLpUp/5/Jadi anda benar-benar dapat menggunakan margin biasanya jika anda don't membutuhkan meja-sel mundur untuk browser lama. http://jsfiddle.net/GLpUp/3/
Pengaturan
background-clip: padding-box;
akan diperlukan ketika menggunakan latar belakang, karena kalau latar belakang akan mengalir ke dalam transparan daerah perbatasan.Ini akan bekerja untuk semua kasus, bahkan jika ada beberapa baris atau jumlah elemen.
Kami menggunakan [
tampilan: grid;
]1 dan sifat-sifatnya.Kelemahan dari metode ini adalah dalam Mobile Opera Mini tidak akan didukung dan di PC ini bekerja hanya setelah IE10.
Catatan untuk menyelesaikan browser kompatibilitas termasuk IE11 silakan gunakan Autoprefixer
LAMA MENJAWAB
Don't pikir itu adalah solusi,'s masih salah satu yang terbaik jika anda hanya ingin satu baris dari unsur-unsur dan itu akan bekerja dengan semua browser.
Metode ini digunakan oleh CSS saudara kombinasi, sehingga anda dapat memanipulasi banyak cara lain juga, tapi jika anda kombinasi yang salah dapat menyebabkan masalah juga.
Kode di bawah ini akan melakukan trik. Dalam metode ini, ada tidak perlu untuk memberikan
margin: 0 -5px;
ke#kotak
wrapper.Contoh untuk anda:
Anda dapat menggunakan
& > * + *
sebagai pemilih untuk meniruflex-gap
(untuk satu baris):Jika anda perlu dukungan flex pembungkus, anda dapat menggunakan pembungkus elemen:
Let's mengatakan jika anda ingin mengatur
10px
ruang antara barang-barang, anda hanya dapat mengatur.item {margin-right:10px;}
untuk semua, dan me-reset pada yang terakhir.item:last-child {margin-right:0;}
Anda juga dapat menggunakan general sibling
~
atau berikutnya+
sibling selector untuk mengatur margin kiri pada item tidak termasuk yang pertama.item ~ .item {margin-left:10px;}
, atau gunakan.item:tidak(:last-child) {margin-right: 10px;}
Flexbox begitu cerdas yang secara otomatis kalkulasi ulang dan sama-sama mendistribusikan grid.
Jika anda ingin mengizinkan flex bungkus, lihat contoh berikut.
Saya telah menemukan solusi yang didasarkan pada general sibling selector,
~
, dan memungkinkan terbatas bersarang.Lihat kode ini pen untuk contoh kerja
Pada dasarnya, dalam kolom kontainer, setiap anak yang didahului oleh anak lain mendapat margin atas. Demikian juga, dalam setiap baris wadah, setiap anak yang didahului oleh orang lain mendapat margin kiri.
Beranjak dari sawa's jawaban, di sini's sedikit peningkatan versi yang memungkinkan anda untuk menetapkan jarak antara barang-barang tanpa marjin sekitarnya.
http://jsfiddle.net/chris00/s52wmgtq/49/
Juga termasuk adalah Safari "-webkit-flex" versi.
A flex container dengan -x (negatif) margin dan flex item dengan x (positif) margin atau padding kedua menyebabkan visual yang diinginkan hasil: Flex item memiliki tetap kesenjangan 2x hanya antara satu sama lain.
Tampaknya hanya masalah preferensi, apakah akan menggunakan margin atau padding di bagian flex item.
Dalam contoh ini, flex item skala dinamis dalam rangka untuk melestarikan kesenjangan tetap:
Saya telah menggunakan ini untuk dibungkus dan tetap lebar kolom. Kuncinya di sini adalah
calc()
SCSS sampel
Full Codepen sampel
Akhirnya mereka akan menambahkan
gap
properti untuk flexbox. Sampai maka anda bisa menggunakan CSS grid, bukan yang sudah memilikigap
property, dan hanya memiliki satu baris. Lebih bagus daripada berurusan dengan margin.Dengan flexbox, menciptakan talang adalah nyeri, terutama ketika pembungkus yang terlibat.
Anda perlu menggunakan margin negatif (seperti yang ditunjukkan dalam pertanyaan):
... atau mengubah HTML (seperti yang ditunjukkan pada jawaban lain):
... atau sesuatu yang lain.
Dalam hal apapun, anda perlu jelek hack untuk membuatnya bekerja karena flexbox doesn't memberikan "
flex-gap
" fitur (setidaknya untuk saat ini).Masalah talang, bagaimanapun, adalah sederhana dan mudah dengan CSS Grid Layout.
Grid spec memberikan sifat yang membuat ruang antara grid item, sementara mengabaikan ruang antara barang dan kontainer. Sifat-sifat ini adalah:
grid-column-gap
grid baris-gap
grid-gap
(singkatan untuk kedua sifat di atas)Baru-baru ini, spec telah diperbarui agar sesuai dengan CSS Box Modul Keselarasan, yang menyediakan satu set keselarasan sifat untuk digunakan di semua kotak model. Jadi sifat yang sekarang:
celah
baris-gap
gap
(singkatan)Namun, tidak semua Jaringan-mendukung browser mendukung properti baru, jadi saya'll gunakan versi asli dalam demo di bawah ini.
Juga, jika jarak yang dibutuhkan antara barang dan kontainer,
padding
pada wadah bekerja dengan baik (lihat contoh ketiga dalam demo di bawah ini).Dari spec:
Informasi lebih lanjut:
Menggunakan Flexbox di solusi saya've digunakan
membenarkan-content
properti untuk elemen induk (wadah) dan I've ditentukan margin dalamflex-dasar
properti dari item. Cek cuplikan kode di bawah ini:Berikut ini's solusi saya, yang doesn't memerlukan pengaturan setiap kelas pada anak-unsur:
Penggunaan:
Teknik yang sama dapat digunakan untuk normal flex baris dan kolom di samping inline contoh yang diberikan di atas, dan diperpanjang dengan kelas-kelas untuk jarak lain dari 4px.
Mengapa tidak melakukannya seperti ini:
Ini menggunakan adjacent sibling selector, untuk memberikan semua
.item
unsur-unsur, kecuali yang pertama yangmargin-left
. Terima kasih untuk flexbox, ini hasil yang di sama-sama berbagai elemen. Ini juga bisa dilakukan dengan elemen diposisikan secara vertikal danmargin-top
, tentu saja.Saya sering menggunakan + operator untuk kasus seperti ini
Aku menemukan cara termudah untuk melakukan ini adalah dengan persentase dan hanya memungkinkan margin untuk menghitung sampai anda lebar
Ini berarti anda berakhir dengan sesuatu seperti ini jika di tempat anda menggunakan contoh
Tidak berarti nilai-nilai anda didasarkan pada lebar meskipun yang mungkin tidak baik untuk semua orang.
CSS
gap
properti:Ada yang baru
gap
CSS properti untuk multi-kolom, flexbox, dan grid layout yang bekerja di beberapa browser sekarang! (Lihat Bisa saya gunakan link 1; link 2).Seperti menulis, ini hanya bekerja pada Firefox sedih.
Columnify - solo kelas untuk N kolom
Flexbox dan SCSS
Flexbox dan CSS
Bermain dengan itu di [JSFiddle][1].