Para establecer la distancia mínima entre los elementos de flexbox que estoy usando margin: 0 5px
en .item
y margin: 0 -5px
en 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.gap
propiedad en contenedores flexibles ( caniuse )Respuestas:
border-spacing
tablas (excepto la propiedad CSSgap
que 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-child
y funciona sin ninguna modificaciónflex-wrap:wrap
es establecerpadding:5px
en el contenedor ymargin:5px
en los niños. Eso producirá una10px
brecha entre cada niño y entre cada niño y sus padres.Manifestación
fuente
order
establece la propiedad?:first-child/:last-child
No 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-basis
valores 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-box
Esta 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#box
envoltorio.Una muestra de trabajo para usted:
fuente
grid-template-columns
que definimos no dinámicamente. Entonces, si le das el valor1fr 1fr 1fr 1fr
, dividirá el div en4fractions
e 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,gid
esto 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!important
a la regla si hay otros selectores que aplican margen a ese elemento.Supongamos que si desea establecer
10px
espacio 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-child
que 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
gap
propiedad 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
gap
propiedad a flexbox. Hasta entonces, podría usar la cuadrícula CSS que ya tiene lagap
propiedad, y solo tener una sola fila. Más agradable que lidiar con los márgenes.fuente
CSS
gap
Propiedad :¡Hay una nueva
gap
propiedad 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-content
propiedad para el elemento padre (contenedor) y he especificado los márgenes dentro de laflex-basis
propiedad 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-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:
Más información:
fuente
¿Por qué no hacerlo así?
Esto usa el selector de hermanos adyacentes , para dar todos los
.item
elementos, 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 + .item
en el selector para que coincida desde el segundo.item
fuente
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) .::after
para 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
gap
ya 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-child
selector / 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