Necesito implementar un diseño de mampostería bastante descuidado. Sin embargo, por varias razones, no quiero usar JavaScript para hacerlo.
Parámetros:
- Todos los elementos tienen el mismo ancho.
- Los elementos tienen una altura que no se puede calcular del lado del servidor (una imagen más varias cantidades de texto)
- Puedo vivir con un número fijo de columnas si tengo que
Hay una solución trivial para esto que funciona en los navegadores modernos, la column-count
propiedad.
El problema con esa solución es que los elementos están ordenados en columnas:
Si bien necesito que los elementos se ordenen en filas, al menos aproximadamente:
Enfoques que he probado que no funcionan:
- Fabricación de artículos
display: inline-block
: desperdicia espacio vertical. - Hacer artículos
float: left
: jajaja, no.
Ahora podría cambiar la representación del lado del servidor y reordenar los elementos dividiendo el número de elementos por el número de columnas, pero eso es complicado, propenso a errores (en función de cómo los navegadores deciden dividir la lista de elementos en columnas), por lo que me gustaría para evitarlo si es posible.
¿Hay alguna magia flexbox novedosa que lo haga posible?
Respuestas:
Flexbox
Un diseño de mampostería dinámico no es posible con flexbox, al menos no de una manera limpia y eficiente.
Flexbox es un sistema de diseño unidimensional. Esto significa que puede alinear elementos a lo largo de líneas horizontales O verticales. Un elemento flexible se limita a su fila o columna.
Un verdadero sistema de cuadrícula es bidimensional, lo que significa que puede alinear elementos a lo largo de líneas horizontales Y verticales. Los elementos de contenido pueden abarcar filas y columnas simultáneamente, lo que los elementos flexibles no pueden hacer.
Es por eso que flexbox tiene una capacidad limitada para construir redes. También es una razón por la cual el W3C ha desarrollado otra tecnología CSS3, Grid Layout .
row wrap
En un contenedor flexible con
flex-flow: row wrap
, los elementos flexibles deben ajustarse a nuevas filas .Esto significa que un elemento flexible no puede ajustarse debajo de otro elemento en la misma fila .
Observe arriba cómo div # 3 se ajusta debajo de div # 1 , creando una nueva fila. No puede envolverse debajo del div # 2 .
Como resultado, cuando los elementos no son los más altos de la fila, queda espacio en blanco, creando huecos antiestéticos.
column wrap
Si cambia a
flex-flow: column wrap
, un diseño similar a una cuadrícula es más alcanzable. Sin embargo, un contenedor de dirección de columna tiene cuatro problemas potenciales desde el principio:Como resultado, un contenedor de dirección de columna no es una opción en este caso, y en muchos otros casos.
CSS Grid con dimensiones de elementos indefinidas
El diseño de cuadrícula sería una solución perfecta para su problema si las diferentes alturas de los elementos de contenido pudieran predeterminarse . Todos los demás requisitos están dentro de la capacidad de Grid.
Se debe conocer el ancho y la altura de los elementos de la cuadrícula para cerrar las brechas con los elementos circundantes.
Entonces, Grid, que es el mejor CSS que tiene para ofrecer para construir un diseño de mampostería de flujo horizontal, se queda corto en este caso.
De hecho, hasta que llegue una tecnología CSS con la capacidad de cerrar automáticamente las brechas, CSS en general no tiene solución. Algo como esto probablemente requeriría refluir el documento, por lo que no estoy seguro de cuán útil o eficiente sería.
Necesitarás un guión.
Las soluciones de JavaScript tienden a utilizar un posicionamiento absoluto, que elimina elementos de contenido del flujo de documentos para reorganizarlos sin espacios. Aquí hay dos ejemplos:
Albañilería Desandro
Cómo construir un sitio que funcione como Pinterest
CSS Grid con dimensiones de elementos definidas
Para diseños donde se conoce el ancho y alto de los elementos de contenido, aquí hay un diseño de mampostería que fluye horizontalmente en CSS puro:
jsFiddle demo
Cómo funciona
inline-grid
sería la otra opción)grid-auto-rows
propiedad establece la altura de las filas generadas automáticamente. En esta cuadrícula, cada fila mide 50 px de alto.grid-gap
propiedad es una abreviatura degrid-column-gap
ygrid-row-gap
. Esta regla establece un espacio de 10 píxeles entre los elementos de la cuadrícula. (No se aplica al área entre los artículos y el contenedor).La
grid-template-columns
propiedad establece el ancho de las columnas definidas explícitamente.La
repeat
notación define un patrón de columnas repetidas (o filas).La
auto-fill
función le dice a la cuadrícula que alinee tantas columnas (o filas) como sea posible sin desbordar el contenedor. (Esto puede crear un comportamiento similar al del diseño flexibleflex-wrap: wrap
).La
minmax()
función establece un rango de tamaño mínimo y máximo para cada columna (o fila). En el código anterior, el ancho de cada columna será un mínimo del 30% del contenedor y un máximo de cualquier espacio libre disponible.La
fr
unidad representa una fracción del espacio libre en el contenedor de la cuadrícula. Es comparable a laflex-grow
propiedad de flexbox .Con
grid-row
yspan
les estamos diciendo a los elementos de la cuadrícula cuántas filas deben abarcar.Soporte de navegador para CSS Grid
Aquí está la imagen completa: http://caniuse.com/#search=grid
Genial función de superposición de cuadrícula en Firefox
En las herramientas de desarrollo de Firefox, cuando inspeccionas el contenedor de cuadrícula, hay un pequeño icono de cuadrícula en la declaración CSS. Al hacer clic, muestra un esquema de su cuadrícula en la página.
Más detalles aquí: https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Examine_grid_layouts
fuente
Esta es una técnica recientemente descubierta que involucra flexbox: https://tobiasahlin.com/blog/masonry-with-css/ .
El artículo tiene sentido para mí, pero no he tratado de usarlo, así que no sé si hay algunas advertencias, aparte de las mencionadas en la respuesta de Michael.
Aquí hay una muestra del artículo, haciendo uso de la
order
propiedad, combinada con:nth-child
.Fragmento de pila
fuente
order
propiedad, haciendo que parezca que los elementos fluyen de izquierda a derecha. Aún así, su truco principal esflex-flow: column wrap
, que se menciona en la respuesta anterior. Además, no puede hacer fluir los elementos de la misma manera que lo hace una mampostería real, por ejemplo, si el tercer y cuarto elemento encajarían en la tercera columna, lo harían, el vinculado no lo hace. Pero nuevamente, como dije, todo depende de cuáles sean los requisitos y, en este caso (esta pregunta), no funcionará como se solicitó.