Para establecer la distancia mínima entre los elementos de flexbox que estoy usando margin: 0 5pxen .itemy margin: 0 -5pxen el contenedor. Para mí parece un truco, pero no puedo encontrar una mejor manera de hacerlo.
#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>

row-gap: 5px- hecho.gappropiedad en contenedores flexibles ( caniuse )Respuestas:
border-spacingtablas (excepto la propiedad CSSgapque no es compatible con la mayoría de los navegadores, caniuse )Por lo tanto, lograr lo que está pidiendo es un poco más difícil.
En mi experiencia, la forma "más limpia" que no utiliza
:first-child/:last-childy funciona sin ninguna modificaciónflex-wrap:wrapes establecerpadding:5pxen el contenedor ymargin:5pxen los niños. Eso producirá una10pxbrecha entre cada niño y entre cada niño y sus padres.Manifestación
fuente
orderestablece la propiedad?:first-child/:last-childNo funcionará como se esperaba.Esto no es un truco. Bootstrap y su cuadrícula también utilizan la misma técnica, aunque, en lugar de margen, bootstrap utiliza relleno para sus cols.
fuente
height:100%; width:100%ignora el relleno del elemento.flex-basisvalores no tienen en cuentabox-sizing: border-box, por lo que un niño con cualquier relleno o borde desbordará al padre (o se ajustará en este caso). FuenteFlexbox y css calc con soporte para múltiples filas
Hola, a continuación es mi solución de trabajo para todos los navegadores que admiten flexbox. Sin márgenes negativos.
Fiddle Demo
Tome nota de que este código puede ser más corto usando SASS
Actualización 2020.II.11 Columnas alineadas en la última fila a la izquierda
Actualización 2020.II.14 Se eliminó el margen inferior en la última fila
fuente
justify-content.justify-content: space-evenly;ojustify-content: space-around;.Puedes usar bordes transparentes.
He contemplado este problema al intentar construir un modelo de cuadrícula flexible que puede recurrir a un modelo de tablas + celdas de tabla para navegadores más antiguos. Y las fronteras para canalones de columna me parecieron la mejor opción apropiada. es decir, las celdas de tabla no tienen márgenes.
p.ej
También tenga en cuenta que necesita
min-width: 50px;flexbox. El modelo flexible no manejará tamaños fijos a menos que lo hagaflex: none;en el elemento secundario particular que desea como fijo y, por lo tanto, excluido de ser"flexi". http://jsfiddle.net/GLpUp/4/ Pero todas las columnas juntasflex:none;ya no es un modelo flexible. Aquí hay algo más cercano a un modelo flexible: http://jsfiddle.net/GLpUp/5/Por lo tanto, puede usar los márgenes normalmente si no necesita el respaldo de celda de tabla para navegadores más antiguos. http://jsfiddle.net/GLpUp/3/
La configuración
background-clip: padding-box;será necesaria al usar un fondo, ya que de lo contrario el fondo fluirá hacia el área del borde transparente.fuente
background-clip: padding-boxEsta solución funcionará para todos los casos, incluso si hay varias filas o cualquier número de elementos. Pero el recuento de la sección debe ser el mismo que desea 4 en la primera fila y 3 es la segunda fila, no funcionará de esa manera, el espacio para el 4to contenido estará en blanco y el contenedor no se llenará.
Estamos usando
display: grid;y sus propiedades.La desventaja de este método es que Mobile Opera Mini no será compatible y en PC solo funciona después de IE10 .
Nota para la compatibilidad completa del navegador, incluido IE11, utilice Autoprefixer
ANTIGUA RESPUESTA
No lo piense como una solución antigua, sigue siendo una de las mejores si solo desea una sola fila de elementos y funcionará con todos los navegadores.
Este método lo utiliza la combinación de hermanos CSS , por lo que también puede manipularlo de muchas otras maneras, pero si su combinación es incorrecta, también puede causar problemas.
El siguiente código hará el truco. En este método, no hay necesidad de dar
margin: 0 -5px;al#boxenvoltorio.Una muestra de trabajo para usted:
fuente
grid-template-columnsque definimos no dinámicamente. Entonces, si le das el valor1fr 1fr 1fr 1fr, dividirá el div en4fractionse intentará llenar los elementos secundarios en cada unofractions, que yo sepa, esa es la única forma de hacerlogrid. Lo que he dicho en la respuesta es que si el usuario necesita dividir el div en 4 y usarlos con muchos elementos, incluso para varias filas,gidesto ayudará.Puede usarlo
& > * + *como selector para emular unflex-gap(para una sola línea):Si necesita admitir envoltura flexible , puede usar un elemento envoltorio:
fuente
*operador no aumenta la especificidad como cabría esperar. Entonces, dependiendo de su CSS existente, es posible que necesite aumentar la especificidad en el.flex > *selector o agregar!importanta la regla si hay otros selectores que aplican margen a ese elemento.Supongamos que si desea establecer
10pxespacio entre los elementos, puede configurarlo.item {margin-right:10px;}para todos y restablecerlo en el último.item:last-child {margin-right:0;}También puede usar el hermano general
~o el siguiente+selector de hermanos para establecer el margen izquierdo en los elementos, excluyendo el primero.item ~ .item {margin-left:10px;}o usar.item:not(:last-child) {margin-right: 10px;}Flexbox es tan inteligente que recalcula automáticamente y distribuye equitativamente la cuadrícula.
Si desea permitir el ajuste flexible , consulte el siguiente ejemplo.
fuente
:last-childque no afecta a cada último niño al final de una línea, ¿correcto?He encontrado una solución que se basa en el selector general de hermanos,
~, y permite el anidamiento infinito.Vea este bolígrafo de código para un ejemplo de trabajo
Básicamente, dentro de los contenedores de columnas, cada niño precedido por otro niño obtiene un margen superior. Del mismo modo, dentro de cada contenedor de filas, cada niño precedido por otro obtiene un margen izquierdo.
fuente
Continuando con la respuesta de sawa, aquí hay una versión ligeramente mejorada que le permite establecer un espacio fijo entre los elementos sin el margen circundante.
http://jsfiddle.net/chris00/s52wmgtq/49/
También se incluye la versión Safari "-webkit-flex".
fuente
Según #ChromDevSummit, hay una implementación de
gappropiedad para Flexbox, aunque en este momento (14 de noviembre de 2019) solo es compatible con Firefox, pero debería implementarse en Chrome pronto:Demo en vivo
Actualizaré mi respuesta una vez que llegue a Chrome también.
fuente
He usado esto para columnas de ancho fijo y envuelto. La clave aquí es
calc()Muestra SCSS
Muestra completa de Codepen
fuente
Un contenedor flexible con margen -x (negativo) y elementos flexibles con margen x (positivo) o relleno, ambos conducen al resultado visual deseado: los elementos flexibles tienen un espacio fijo de 2x solo entre sí.
Parece ser simplemente una cuestión de preferencia, ya sea usar margen o relleno en los elementos flexibles.
En este ejemplo, los elementos flexibles se escalan dinámicamente para preservar el espacio fijo:
fuente
Eventualmente agregarán la
gappropiedad a flexbox. Hasta entonces, podría usar la cuadrícula CSS que ya tiene lagappropiedad, y solo tener una sola fila. Más agradable que lidiar con los márgenes.fuente
CSS
gapPropiedad :¡Hay una nueva
gappropiedad CSS para diseños de múltiples columnas, flexbox y cuadrícula que funciona en algunos navegadores ahora! (Consulte ¿Puedo usar el enlace 1 ; enlace 2 ).Al momento de escribir, esto solo funciona en Firefox tristemente. Actualmente funciona en Chrome si habilita "Habilitar funciones experimentales de la plataforma web" en
about:flags.fuente
Usando Flexbox en mi solución, he usado la
justify-contentpropiedad para el elemento padre (contenedor) y he especificado los márgenes dentro de laflex-basispropiedad de los elementos. Verifique el fragmento de código a continuación:fuente
Con flexbox, crear canales es un dolor, especialmente cuando se trata de envolver.
Debe usar márgenes negativos ( como se muestra en la pregunta ):
... o modifique el HTML ( como se muestra en otra respuesta ):
... 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-gapgrid-row-gapgrid-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-gaprow-gapgap(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,
paddingel contenedor funciona bien (consulte el tercer ejemplo en la demostración a continuación).De la especificación:
Más información:
fuente
¿Por qué no hacerlo así?
Esto usa el selector de hermanos adyacentes , para dar todos los
.itemelementos, excepto el primero amargin-left. Gracias a flexbox, esto incluso da como resultado elementos igualmente anchos. Esto también podría hacerse con elementos posicionados verticalmente ymargin-top, por supuesto.fuente
Aquí está mi solución, que no requiere establecer ninguna clase en los elementos secundarios:
Uso:
La misma técnica se puede utilizar para filas y columnas flexibles normales además del ejemplo en línea dado anteriormente, y se puede ampliar con clases para espaciado que no sea 4px.
fuente
A menudo uso el operador + para tales casos
fuente
Creo que la forma más fácil de hacerlo es con porcentajes y simplemente permitiendo que el margen aumente su ancho
Esto significa que terminas con algo como esto si usas tu ejemplo
Significa que sus valores se basan en el ancho, lo que podría no ser bueno para todos.
fuente
Aquí hay una cuadrícula de elementos de la interfaz de usuario de la tarjeta con el espacio completado usando un cuadro flexible:
Estaba frustrado con el espaciado manual de las tarjetas al manipular el relleno y los márgenes con resultados dudosos. Aquí están las combinaciones de atributos CSS que he encontrado muy efectivas:
Espero que esto ayude a la gente, presente y futuro.
fuente
Columnify: una clase individual para N columnas
Flexbox y SCSS
Flexbox y CSS
Juega con él en JSFiddle .
fuente
fuente
Simplemente use
.item + .itemen el selector para que coincida desde el segundo.itemfuente
Asumiendo:
Establezca un margen izquierdo en cada elemento, excepto el 1º, 5º, 9º elemento, etc. y establecer ancho fijo en cada artículo. Si el margen izquierdo es de 10 píxeles, cada fila tendrá un margen de 30 píxeles entre 4 elementos, el ancho porcentual del elemento se puede calcular de la siguiente manera:
Esta es una solución decente para problemas relacionados con la última fila de flexbox.
fuente
De hecho, hay una manera agradable, ordenada y solo de CSS para hacer esto (que uno puede considerar "mejor").
De todas las respuestas publicadas aquí, solo encontré una que usa calc () con éxito (por Dariusz Sikorski). Pero cuando se plantea con: "pero falla si solo hay 2 elementos en la última fila", no hubo solución expandida.
Esta solución aborda la pregunta del OP con una alternativa a los márgenes negativos y aborda el problema planteado a Dariusz.
notas:
calc()para permitir que el navegador haga las matemáticas de la manera que desee100%/3(aunque el 33.3333% debería funcionar igual de bien) y(1em/3)*2(aunque .66em también debería funcionar bien) .::afterpara rellenar la última fila si hay menos elementos que columnasTambién en https://codepen.io/anon/pen/rqWagE
fuente
Podrías usar la nueva propiedad
gap. Copio y pego la explicación que encontré en este artículo , así como más informaciónDesafortunadamente en este momento, solo FireFox admite la brecha en los diseños flexibles.
fuente
gapya fue recomendado en una respuesta aquí stackoverflow.com/a/58041749/2756409 Además, esto no es CSS.No funcionará en todos los casos, pero si tiene anchos secundarios flexibles (%) y conoce la cantidad de elementos por fila, puede especificar de manera muy clara los márgenes de los elementos necesarios utilizando
nth-childselector / s.Depende en gran medida de lo que quiere decir con "mejor". De esta manera no se requiere un marcado adicional para elementos secundarios o elementos negativos, pero ambas cosas tienen su lugar.
fuente
Me encontré con el mismo problema anteriormente, luego me topé con la respuesta para esto. Espero que ayude a otros para futuras referencias.
respuesta larga corta, agregue un borde a los elementos flexibles de su hijo. entonces puede especificar márgenes entre elementos flexibles a lo que quiera. En el fragmento, uso el negro con fines ilustrativos, puede usar 'transparente' si lo desea.
fuente
El truco del margen negativo en el contenedor de la caja funciona muy bien. Aquí hay otro ejemplo que funciona muy bien con el orden, la envoltura y lo que no.
fuente