Gostaria de dispor glifos unicode semelhantes a este :
Pode haver de 13 a 100 itens na coleção exibida (alfabetos, abjads, abugidas, silabários, etc.), então pode haver um conjunto com 99 itens, ou um com 16 itens, etc.
Como você pode dispor os elementos de forma mais bonita (e automática) (para que também fique bonito quando responsivo)? Aqui está o que eu tenho por padrão com o flexbox:
Cada item tem uma altura fixa e a largura é responsiva (mas a mesma para cada elemento).
O objetivo é que cada linha tenha um número par ou ímpar de itens. Dessa forma, todas as colunas verticais ficarão alinhadas (e não fará o que meu gif animado está fazendo, onde linhas pares/ímpares são intercaladas).
- É possível fazer alguma fórmula matemática para calcular algo como "você precisa de 5 itens por linha, exceto que a última linha terá 3 (ou 1)"? Dada alguma contagem total como 99?
Como você faria isso?
Eu tenho um componente React que faz o layout do Flexbox como <Grid minWidth={96} gap={8} maxColumns={5} breakpoints={[5, 3, 1]} />
, onde breakpoints
estão o número de itens permitidos por linha, e maxColumns
são as colunas máximas (breakpoints/maxColumn é meio redundante, você pode definir qualquer um ou, talvez eu limpe isso mais tarde) . Todas essas informações podem ser irrelevantes, mas apenas apontando para o caso, é meu componente de grade responsivo.
Como posso dividir meu total por x para descobrir se deve haver linhas pares ou ímpares e, então, definir o maxColumns
ou breakpoints
para o que for "mais compacto"? Então, por exemplo:
- Se forem 26 elementos , ficaria melhor com 6 linhas de 4, seguidas de 1 linha de 2. - Se forem 27 elementos ,
A "beleza" disso pode ser subjetiva, e não há uma regra clara para o que é mais bonito. Apenas procurando por qualquer coisa que não deixe facilmente um nó único órfão no final e então tenha 7 itens em todas as outras linhas. Idealmente, temos:
- Entre 3 e 7 colunas.
- A última linha deve ter o mesmo número de itens em todas as linhas anteriores, ou não menos que isso
maxRowCount - 2
(portanto, se todas as linhas tiverem 7, a última linha poderá ter 5 ou apenas 7, ou se todas as linhas tiverem 5, a última linha poderá ter apenas 3 ou 5, etc.). - O item de linha tem um
minWidth: 96px
, e cresce para preencher o espaço. Posso descobrir como tornar as coisas responsivas quando tivermos o básico disso funcionando, mas suponha que acontainerWidth
exista.
Então, na minha cabeça, digamos que temos containerWidth === 700px
. Então, 700/96 == 7+
, então talvez 7 por linha. Se tivermos 99 itens (por exemplo), então 99 % 7 == 1
, então 7
não vai funcionar porque teremos 1 na última linha. 6
não vai funcionar porque 99
é par, então tente 5
? 99 % 5 == 4
, isso não vai funcionar porque 4
é par. Então tente 3
, 99 % 3 == 0
, então isso funcionaria como está, use isso!
Como você implementaria algo assim?
Algo assim parece correto, mas será que resolvi corretamente?
Aqui está um exemplo que testa repetidamente se o número de colunas corresponde aos seus critérios