Je travaille sur une mise en page flexbox imbriquée qui devrait fonctionner comme suit:
Le niveau le plus à l'extérieur ( ul#main
) est une liste horizontale qui doit s'étendre vers la droite lorsque d'autres éléments y sont ajoutés. S'il devient trop grand, il devrait y avoir une barre de défilement horizontale.
#main {
display: flex;
flex-direction: row;
flex-wrap: nowrap;
overflow-x: auto;
/* ...and more... */
}
Chaque élément de cette liste ( ul#main > li
) a un en-tête ( ul#main > li > h2
) et une liste interne ( ul#main > li > ul.tasks
). Cette liste interne est verticale et doit être intégrée dans des colonnes si nécessaire. Lors de l'encapsulation dans plus de colonnes, sa largeur doit augmenter pour faire de la place pour plus d'éléments. Cette augmentation de largeur doit également s'appliquer à l'élément contenant de la liste externe.
.tasks {
flex-direction: column;
flex-wrap: wrap;
/* ...and more... */
}
Mon problème est que les listes internes ne s'enroulent pas lorsque la hauteur de la fenêtre devient trop petite. J'ai essayé beaucoup de falsification de toutes les propriétés flex, en essayant de suivre méticuleusement les directives de CSS-Tricks , mais pas de chance.
Ce JSFiddle montre ce que j'ai jusqu'à présent.
Résultat attendu (ce que je veux) :
Résultat réel (ce que j'obtiens) :
Résultat plus ancien (ce que j'ai obtenu en 2015) :
METTRE À JOUR
Après quelques recherches, cela commence à ressembler à un problème plus important. Tous les principaux navigateurs se comportent de la même manière , et cela n'a rien à voir avec l'imbrication de ma conception flexbox. Les dispositions de colonne Flexbox encore plus simples refusent d'augmenter la largeur de la liste lorsque les éléments sont enveloppés.
Cet autre JSFiddle démontre clairement le problème. Dans les versions actuelles de Chrome, Firefox et IE11, tous les éléments sont correctement enveloppés; la hauteur de la liste augmente en row
mode, mais sa largeur n'augmente pas en column
mode. De plus, il n'y a pas du tout de redistribution immédiate des éléments lors du changement de hauteur d'un column
mode, mais il y en a en row
mode.
Cependant, les spécifications officielles (regardez spécifiquement l'exemple 5) semblent indiquer que ce que je veux faire devrait être possible.
Quelqu'un peut-il trouver une solution de contournement à ce problème?
MISE À JOUR 2
Après de nombreuses expériences en utilisant JavaScript pour mettre à jour la hauteur et la largeur de divers éléments lors des événements de redimensionnement, j'en suis venu à la conclusion qu'il est trop complexe et trop difficile d'essayer de le résoudre de cette façon. De plus, l'ajout de JavaScript rompt définitivement le modèle de flexbox, qui doit être maintenu aussi propre que possible.
Pour l'instant, je reviens à la overflow-y: auto
place de flex-wrap: wrap
pour que le conteneur interne défile verticalement en cas de besoin. Ce n'est pas joli, mais c'est une voie à suivre qui au moins ne rompt pas trop la convivialité.
column wrap
ne pas étendre sa largeur lors de l'emballage. Voir code.google.com/p/chromium/issues/detail?id=247963 pour plus d'informations.