Con flexbox, crear canales es un dolor, especialmente cuando se trata de envolver.
Debe usar márgenes negativos ( como se muestra en la pregunta ):
#box {
display: flex;
width: 100px;
margin: 0 -5px;
}
... o modifique el HTML ( como se muestra en otra respuesta ):
<div class='flex-wrapper'>
<div class='flex'>
<div class='box'></div>
<div class='box'></div>
...
</div>
</div>
... o algo mas.
En cualquier caso, necesitas un truco feo para que funcione porque flexbox no proporciona una función " flex-gap
" ( al menos por ahora ).
Sin embargo, el problema de las canaletas es simple y fácil con CSS Grid Layout.
La especificación de cuadrícula proporciona propiedades que crean espacio entre los elementos de la cuadrícula, mientras ignora el espacio entre los elementos y el contenedor. Estas propiedades son:
grid-column-gap
grid-row-gap
grid-gap
(la abreviatura de ambas propiedades anteriores)
Recientemente, la especificación se ha actualizado para cumplir con el Módulo de alineación de cajas CSS , que proporciona un conjunto de propiedades de alineación para usar en todos los modelos de cajas. Entonces las propiedades son ahora:
column-gap
row-gap
gap
(taquigrafía)
Sin embargo, no todos los navegadores compatibles con Grid admiten las propiedades más nuevas, por lo que utilizaré las versiones originales en la demostración a continuación.
Además, si se necesita espacio entre los artículos y el contenedor, padding
el contenedor funciona bien (consulte el tercer ejemplo en la demostración a continuación).
De la especificación:
10.1 Canales: los row-gap
, column-gap
y gap
propiedades
Las propiedades row-gap
y column-gap
(y su gap
abreviatura), cuando se especifican en un contenedor de cuadrícula, definen los canales entre las filas y las columnas de la cuadrícula. Su sintaxis se define en CSS Box Alignment 3 §8 Brechas entre cuadros .
El efecto de estas propiedades es como si las líneas de cuadrícula afectadas adquirieran grosor: la pista de cuadrícula entre dos líneas de cuadrícula es el espacio entre las canaletas que las representan.
.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>
Más información: