Con la flexbox, la creazione di grondaie è una seccatura, soprattutto quando si tratta di avvolgimento.
Devi utilizzare i margini negativi ( come mostrato nella domanda ):
#box {
display: flex;
width: 100px;
margin: 0 -5px;
}
... o modifica l'HTML ( come mostrato in un'altra risposta ):
<div class='flex-wrapper'>
<div class='flex'>
<div class='box'></div>
<div class='box'></div>
...
</div>
</div>
... o qualcos'altro.
In ogni caso, hai bisogno di un brutto hack per farlo funzionare perché flexbox non fornisce una flex-gap
funzione " " ( almeno per ora ).
Il problema delle grondaie, tuttavia, è semplice e facile con CSS Grid Layout.
Le specifiche Grid forniscono proprietà che creano spazio tra gli elementi della griglia, ignorando allo stesso tempo lo spazio tra gli elementi e il contenitore. Queste proprietà sono:
grid-column-gap
grid-row-gap
grid-gap
(la scorciatoia per entrambe le proprietà sopra)
Di recente, le specifiche sono state aggiornate per essere conformi al Modulo di allineamento box CSS , che fornisce una serie di proprietà di allineamento da utilizzare in tutti i modelli di box. Quindi le proprietà sono ora:
column-gap
row-gap
gap
(abbreviazione)
Tuttavia, non tutti i browser che supportano Grid supportano le proprietà più recenti, quindi userò le versioni originali nella demo di seguito.
Inoltre, se è necessaria una spaziatura tra gli articoli e il contenitore, padding
sul contenitore funziona perfettamente (vedere il terzo esempio nella demo di seguito).
Dalle specifiche:
10.1. Grondaie: i row-gap
, column-gap
e gap
proprietà
Le proprietà row-gap
e column-gap
(e la loro gap
scorciatoia), quando specificate su un contenitore della griglia, definiscono le grondaie tra le righe della griglia e le colonne della griglia. La loro sintassi è definita in CSS Box Alignment 3 §8 Gaps Between Boxes .
L'effetto di queste proprietà è come se le linee della griglia interessate avessero acquisito spessore: la traccia della griglia tra due linee della griglia è lo spazio tra le grondaie che le rappresentano.
.box {
display: inline-grid;
grid-auto-rows: 50px;
grid-template-columns: repeat(4, 50px);
border: 1px solid black;
}
.one {
grid-column-gap: 5px;
}
.two {
grid-column-gap: 10px;
grid-row-gap: 10px;
}
.three {
grid-gap: 10px;
padding: 10px;
}
.item {
background: lightgray;
}
<div class='box one'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
<hr>
<div class='box two'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
<hr>
<div class='box three'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
Maggiori informazioni: