Estou trabalhando em um layout aninhado de flexbox que deve funcionar da seguinte maneira:
O nível mais externo ( ul#main
) é uma lista horizontal que deve ser expandida para a direita quando mais itens forem adicionados a ela. Se crescer muito, deve haver uma barra de rolagem horizontal.
#main {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
overflow-x: auto;
/* ...and more... */
}
Cada item desta lista ( ul#main > li
) possui um cabeçalho ( ul#main > li > h2
) e uma lista interna ( ul#main > li > ul.tasks
). Essa lista interna é vertical e deve quebrar em colunas quando necessário. Ao agrupar em mais colunas, sua largura deve aumentar para abrir espaço para mais itens. Esse aumento de largura deve ser aplicado também ao item que contém a lista externa.
.tasks {
flex-direction: column;
flex-wrap: wrap;
/* ...and more... */
}
Meu problema é que as listas internas não quebram quando a altura da janela fica muito pequena. Eu tentei muitas adulterações com todas as propriedades flex, tentando seguir as diretrizes do CSS-Tricks meticulosamente, mas sem sorte.
Este JSFiddle mostra o que tenho até agora.
Resultado esperado (o que eu quero) :
Resultado real (o que eu recebo) :
Resultado mais antigo (o que obtive em 2015) :
ATUALIZAR
Após alguma investigação, isso está começando a parecer um problema maior. Todos os principais navegadores se comportam da mesma maneira e não tem nada a ver com o design do meu flexbox sendo aninhado. Layouts de colunas flexbox ainda mais simples se recusam a aumentar a largura da lista quando os itens são quebrados.
Este outro JSFiddle demonstra claramente o problema. Nas versões atuais do Chrome, Firefox e IE11, todos os itens são agrupados corretamente; a altura da lista aumenta no row
modo, mas sua largura não aumenta no column
modo. Além disso, não há refluxo imediato de elementos ao alterar a altura de um column
modo, mas existe no row
modo.
No entanto, as especificações oficiais (veja especificamente o exemplo 5) parecem indicar que o que eu quero fazer deve ser possível.
Alguém pode apresentar uma solução alternativa para esse problema?
ATUALIZAÇÃO 2
Depois de muitas experiências usando o JavaScript para atualizar a altura e a largura de vários elementos durante eventos de redimensionamento, cheguei à conclusão de que é muito complexo e complicado demais tentar resolvê-lo dessa maneira. Além disso, adicionar JavaScript definitivamente quebra o modelo do flexbox, que deve ser mantido o mais limpo possível.
Por enquanto, estou retornando ao overflow-y: auto
invés de flex-wrap: wrap
para que o contêiner interno role verticalmente quando necessário. Não é bonito, mas é um caminho a seguir que pelo menos não quebra muito a usabilidade.
column wrap
não exiba sua largura ao quebrar. Consulte code.google.com/p/chromium/issues/detail?id=247963 para obter mais informações.