Estoy usando un cuadro flexible para mostrar 8 elementos que cambiarán de tamaño dinámicamente con mi página. ¿Cómo lo obligo a dividir los elementos en dos filas? (4 por fila)?
Aquí hay un recorte relevante:
(O si prefiere jsfiddle - http://jsfiddle.net/vivmaha/oq6prk1p/2/ )
.parent-wrapper {
height: 100%;
width: 100%;
border: 1px solid black;
}
.parent {
display: flex;
font-size: 0;
flex-wrap: wrap;
margin: -10px 0 0 -10px;
}
.child {
display: inline-block;
background: blue;
margin: 10px 0 0 10px;
flex-grow: 1;
height: 100px;
}
<body>
<div class="parent-wrapper">
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
</div>
</body>
Respuestas:
Tienes
flex-wrap: wrap
en el contenedor. Eso es bueno, porque anula el valor predeterminado, que esnowrap
( fuente ). Esta es la razón por la cual los elementos no se ajustan para formar una cuadrícula en algunos casos .En este caso, el problema principal está
flex-grow: 1
en los elementos flexibles.La
flex-grow
propiedad en realidad no dimensiona elementos flexibles. Su tarea es distribuir espacio libre en el contenedor ( fuente ). Entonces, no importa cuán pequeño sea el tamaño de la pantalla, cada elemento recibirá una parte proporcional del espacio libre en la línea.Más específicamente, hay ocho artículos flexibles en su contenedor. Con
flex-grow: 1
, cada uno recibe 1/8 del espacio libre en la línea. Dado que no hay contenido en sus elementos, pueden reducirse a un ancho cero y nunca se ajustarán.La solución es definir un ancho en los artículos. Prueba esto:
Con la
flex-grow: 1
definiciónflex
abreviada, no es necesarioflex-basis
ser del 25%, lo que en realidad daría como resultado tres elementos por fila debido a los márgenes.Como
flex-grow
consumirá espacio libre en la fila,flex-basis
solo necesita ser lo suficientemente grande como para forzar un ajuste. En este caso, conflex-basis: 21%
, hay mucho espacio para los márgenes, pero nunca suficiente espacio para un quinto elemento.fuente
flex: 1 0 calc(25% - 10px);
margin: 2%;
lugar de un número de píxel fijo para evitar que los cuadros salten a una nueva línea en dispositivos pequeños / resoluciones. la fórmula general es(100 - (4 * box-width-percent)) / 8
% para diferentes anchos de cajaAgregue un ancho a los
.child
elementos. Personalmente, usaría porcentajes en elmargin-left
si desea tenerlo siempre 4 por fila.MANIFESTACIÓN
fuente
Aquí hay otro apporach.
También puedes lograrlo de esta manera:
Muestra: https://codepen.io/capynet/pen/WOPBBm
Y una muestra más completa: https://codepen.io/capynet/pen/JyYaba
fuente
Lo haría así usando márgenes negativos y cálculo para las canaletas:
Demostración: https://jsfiddle.net/9j2rvom4/
Método alternativo de cuadrícula CSS:
Demostración: https://jsfiddle.net/jc2utfs3/
fuente
Espero eso ayude. para más detalles puedes seguir este enlace
fuente
Creo que este ejemplo es más básico y más fácil de entender que @dowomenfart.
Esto logra los mismos cálculos de ancho mientras se corta directamente a la carne. La matemática es mucho más fácil y
em
es el nuevo estándar debido a su escalabilidad y facilidad de uso móvil.fuente
;)
fuente
justify-content: space-evenly;
al prent, entonces se alinean muy bien y no tiene que hacer lo mismocalc
con el niño. Gracias por el ejemplo, sin embargo!Flex wrap + margen negativo
¿Por qué la flexión frente
display: inline-block
?¿Por qué margen negativo?
O usa SCSS o CSS-in-JS para los casos de borde (es decir, el primer elemento en la columna), o establece un margen predeterminado y luego elimina el margen exterior.
Implementación
https://codepen.io/zurfyx/pen/BaBWpja
fuente
Aquí hay otra forma sin usar
calc()
.Eso es todo al respecto. Puede obtener fantasía con las dimensiones para obtener tamaños más estéticos, pero esta es la idea.
fuente