Le conteneur n'augmente pas sa largeur lorsque l'élément Flexbox est renvoyé en mode colonne
P粉924915787
P粉924915787 2023-10-17 22:05:01
0
2
587

Je développe une mise en page Flexbox imbriquée qui fonctionne comme ceci :

Le niveau le plus externe (ul#main) est une liste horizontale qui doit s'étendre vers la droite lorsque d'autres éléments 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) 都有一个标头 (ul#main > li > h2) 和一个内部列表 (ul#main > li > ul.tasks). Cette liste interne est verticale et doit être divisée en colonnes si nécessaire. Au fur et à mesure qu'il s'enroule dans davantage de colonnes, sa largeur devrait augmenter pour laisser de la place à davantage d'éléments. Cette augmentation de largeur devrait également s'appliquer aux éléments contenant de la liste externe.

.tasks {
    flex-direction: column;
    flex-wrap: wrap;
    /* ...and more... */
}

Mon problème est que lorsque la hauteur de la fenêtre est trop petite, la liste intérieure ne s'enroule pas. J'ai essayé beaucoup de falsification de toutes les propriétés Flex, en essayant de suivre strictement les directives de CSS-Tricks, mais sans succès.

Ce JSFiddle montre ce que j'ai jusqu'à présent.

Résultats attendus (ce que je veux) :

Résultats réels (ce que j'ai obtenu) :

Résultats plus anciens (résultats que j'ai obtenus en 2015) :

Mise à jour

Après quelques investigations, cela a commencé à ressembler à un problème plus grave. Tous les principaux navigateurs se comportent de la même manière, cela n'a rien à voir avec la conception de ma Flexbox imbriquée. Même la disposition plus simple des colonnes Flexbox n'augmente pas la largeur de la liste à mesure que les éléments sont renvoyés à la ligne.

Un autre JSFiddle démontre clairement le problème. Dans les versions actuelles de Chrome, Firefox et IE11, tous les éléments s'ajustent correctement ; row 模式下列表的高度会增加,但在 column 模式下其宽度不会增加。另外,当更改 column 模式的高度时,根本不会立即回流元素,但在 row

Cependant, la spécification officielle

(voir exemple 5 pour plus de détails) semble indiquer que ce que je veux faire devrait être possible.

Quelqu'un peut-il trouver une solution à ce problème ?

Mise à jour 2

Après de nombreuses tentatives d'utilisation de JavaScript pour mettre à jour la hauteur et la largeur de divers éléments lors d'événements de redimensionnement, je suis arrivé à la conclusion qu'essayer de le résoudre de cette façon est trop compliqué et fastidieux. De plus, l'ajout de JavaScript brisera définitivement le modèle Flexbox, qui doit rester aussi propre que possible.

Maintenant, je reviens sur

pour que le conteneur intérieur défile verticalement si nécessaire. Ce n'est pas joli, mais c'est une approche qui au moins ne perturbe pas trop la convivialité. overflow-y: auto 而不是 flex-wrap:wrapper

P粉924915787
P粉924915787

répondre à tous(2)
P粉221046425

En retard à la fête mais j'ai toujours ce problème des années plus tard. J'ai finalement trouvé une solution en utilisant une grille. Sur le contenant, vous pouvez utiliser

display: grid;
grid-auto-flow: column;
grid-template-rows: repeat(6, auto);

J'ai un exemple sur CodePen pour basculer entre les problèmes Flexbox et les correctifs de maillage : https://codepen .io/MandeeD/pen/JVLdLd

P粉011912640

Question

Cela ressemble à un défaut fondamental dans la disposition flexible.

Les conteneurs flexibles orientés colonnes ne s'étendent pas pour accueillir des colonnes supplémentaires. (Ce n'est pas un problème en flex-direction: row.)

Cette question a été posée à plusieurs reprises (voir liste ci-dessous) et il n'y a pas de réponse claire en CSS.

Il est difficile d'identifier cela comme un bug car le problème se produit dans tous les principaux navigateurs. Mais cela soulève une question :

On pourrait penser qu'au moins l'un d'entre eux réussirait. Je ne peux que spéculer sur la raison. Il s’agissait peut-être d’une implémentation techniquement difficile et donc mise de côté pour cette itération.

Mise à jour : Ce problème semble avoir été résolu dans Edge v16.


Description du problème

OP a créé une démo utile pour illustrer le problème. Je l'ai copié ici : http://jsfiddle.net/nwccdwLw/1/ p>


Options de solution de contournement

Solutions Hacky de la communauté Stack Overflow :


Rapport de bug Chrome
  • Réponse de Mark Emery

Autres articles décrivant le même problème

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal