Estoy trabajando en un diseño de caja flexible anidado que debería funcionar de la siguiente manera:
El nivel más externo ( ul#main
) es una lista horizontal que debe expandirse a la derecha cuando se le agregan más elementos. Si crece demasiado, debe haber una barra de desplazamiento horizontal.
#main {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
overflow-x: auto;
/* ...and more... */
}
Cada elemento de esta lista ( ul#main > li
) tiene un encabezado ( ul#main > li > h2
) y una lista interna ( ul#main > li > ul.tasks
). Esta lista interna es vertical y debe ajustarse en columnas cuando sea necesario. Al envolver en más columnas, su ancho debe aumentar para dejar espacio para más artículos. Este aumento de ancho debería aplicarse también al elemento contenedor de la lista externa.
.tasks {
flex-direction: column;
flex-wrap: wrap;
/* ...and more... */
}
Mi problema es que las listas internas no se ajustan cuando la altura de la ventana es demasiado pequeña. He intentado muchas manipulaciones con todas las propiedades de flex, tratando de seguir las pautas de CSS-Tricks meticulosamente, pero no tuve suerte.
Este JSFiddle muestra lo que tengo hasta ahora.
Resultado esperado (lo que quiero) :
Resultado real (lo que obtengo) :
Resultado anterior (lo que obtuve en 2015) :
ACTUALIZAR
Después de algunas investigaciones, esto comienza a parecer un problema mayor. Todos los principales navegadores se comportan de la misma manera , y no tiene nada que ver con que mi diseño de Flexbox esté anidado. Diseños de columna de flexbox aún más simples se niegan a aumentar el ancho de la lista cuando los elementos se ajustan.
Este otro JSFiddle demuestra claramente el problema. En las versiones actuales de Chrome, Firefox e IE11, todos los elementos se ajustan correctamente; la altura de la lista aumenta en row
modo, pero su ancho no aumenta en column
modo. Además, no hay reflujo inmediato de elementos cuando se cambia la altura de un column
modo, pero sí está en row
modo.
Sin embargo, las especificaciones oficiales (mira específicamente el ejemplo 5) parecen indicar que lo que quiero hacer debería ser posible.
¿Alguien puede encontrar una solución a este problema?
ACTUALIZACIÓN 2
Después de mucho experimentar usando JavaScript para actualizar la altura y el ancho de varios elementos durante los eventos de cambio de tamaño, he llegado a la conclusión de que es demasiado complejo y demasiados problemas tratar de resolverlo de esa manera. Además, agregar JavaScript definitivamente rompe el modelo de flexbox, que debe mantenerse lo más limpio posible.
Por ahora, me estoy volviendo hacia atrás en overflow-y: auto
lugar de flex-wrap: wrap
que el contenedor interno se desplace verticalmente cuando sea necesario. No es bonito, pero es un camino a seguir que al menos no rompe demasiado la usabilidad.
column wrap
no expanda su ancho cuando se ajusta. Consulte code.google.com/p/chromium/issues/detail?id=247963 para obtener más información.Respuestas:
El problema
Esto parece una deficiencia fundamental en el diseño flexible.
Un contenedor flexible en la dirección de la columna no se expandirá para acomodar columnas adicionales. (Esto no es un problema en
flex-direction: row
)Esta pregunta se ha hecho muchas veces (ver la lista a continuación), sin respuestas claras en CSS.
Es difícil identificar esto como un error porque el problema ocurre en todos los principales navegadores. Pero plantea la pregunta:
Uno pensaría que al menos uno de ellos lo entendería bien. Solo puedo especular sobre la razón. Tal vez fue una implementación técnicamente difícil y se archivó para esta iteración.
ACTUALIZACIÓN: El problema parece resolverse en Edge v16.
Ilustración del problema
El OP creó una demostración útil que ilustra el problema. Lo estoy copiando aquí: http://jsfiddle.net/nwccdwLw/1/
Opciones de solución
Soluciones de Hacky de la comunidad Stack Overflow:
"Parece que este problema no se puede resolver solo con CSS, así que le propongo una solución JQuery".
"Es curioso que la mayoría de los navegadores no hayan implementado contenedores flexibles de columna correctamente, pero el soporte para los modos de escritura es razonablemente bueno. Por lo tanto, puede usar un contenedor flexible de filas con un modo de escritura vertical".
Más análisis
Informe de errores de cromo
La respuesta de Mark Amery
Otras publicaciones que describen el mismo problema
fuente
Llegó tarde a la fiesta, pero todavía se encontraba con este problema AÑOS más tarde. Terminé buscando una solución usando la cuadrícula. En el contenedor puedes usar
Tengo un ejemplo en CodePen que alterna entre el problema de flexbox y la corrección de la cuadrícula: https://codepen.io/MandeeD/pen/JVLdLd
fuente
grid-row-end: span X;
si necesita algunos de los elementos para ocupar más filas.Es lamentable que tantos navegadores importantes sufran este error después de muchos años. Considere una solución alternativa de Javascript. Siempre que la ventana del navegador cambie de tamaño, o se agregue contenido al elemento, ejecute este código para que cambie el tamaño al ancho adecuado. Puede definir una directiva en su marco para hacerlo por usted.
fuente
Acabo de encontrar una solución CSS PURE realmente increíble aquí.
https://jsfiddle.net/gcob492x/3/
El complicado: establecer
writing-mode: vertical-lr
en la lista div luegowriting-mode: horizontal-tb
en el elemento de la lista. Tuve que ajustar los estilos en JSFiddle (eliminar muchos de los estilos de alineación, que no son necesarios para la solución).Nota: el comentario dice que solo funciona en navegadores basados en Chromium, y no en Firefox. Solo lo he probado personalmente en Chrome. Es posible que haya una forma de modificar esto para que funcione en otros navegadores o que haya actualizaciones en dichos navegadores que hagan que esto funcione.
Gran agradecimiento a este comentario: cuando los elementos de flexbox se ajustan en modo columna, el contenedor no aumenta su ancho . Excavar a través de ese tema me llevó a https://bugs.chromium.org/p/chromium/issues/detail?id=507397#c39 que me llevó a este JSFiddle.
fuente
Como todavía no se sugirió ninguna solución o solución adecuada, logré obtener el comportamiento solicitado con un enfoque un poco diferente. En lugar de separar el diseño en 3 divs diferentes, estoy agregando todos los elementos en 1 div y creando la separación con algunos divs más en el medio.
La solución propuesta está codificada, suponiendo que tengamos 3 secciones, pero puede extenderse a una genérica. La idea principal es explicar cómo podemos lograr este diseño.
:before
cada primer elemento, podemos ubicar el título de cada sección.space
crea el espacio entre las seccionesspace
no cubrirá toda la altura de la sección, también agregaré:after
a las secciones, de modo que la coloque con posición absoluta y fondo blanco.z-index: -1
.fuente
Posible solución JS ..
fuente
columns
propiedad de estilo podría ser un punto de partida para una solución de trabajo. Tal vez ajustando el número de columnas y el ancho de la ul.