Le problème
Flexbox facilite le centrage.
En appliquant simplement align-items: center
et justify-content: center
sur le conteneur flexible, vos articles flexibles seront centrés verticalement et horizontalement.
Cependant, il y a un problème avec cette méthode lorsque l'élément flexible est plus grand que le conteneur flexible.
Comme indiqué dans la question, lorsque l'élément flexible déborde du conteneur, le dessus devient inaccessible.
Pour un débordement horizontal, la section gauche devient inaccessible (ou la section droite, dans les langues RTL).
Voici un exemple avec un conteneur LTR ayant justify-content: center
et trois éléments flex:
Voir le bas de cette réponse pour une explication de ce comportement.
Solution n ° 1
Pour résoudre ce problème, utilisez les marges automatiques de Flexbox au lieu de justify-content
.
Avec les auto
marges, un élément flexible débordant peut être centré verticalement et horizontalement sans perdre l'accès à aucune partie de celui-ci.
Donc, au lieu de ce code sur le conteneur flex:
#flex-container {
align-items: center;
justify-content: center;
}
Utilisez ce code sur l'article flexible:
.flex-item {
margin: auto;
}
Démo révisée
Solution n ° 2 (pas encore implémentée dans la plupart des navigateurs)
Ajoutez la safe
valeur à votre règle d'alignement des mots clés, comme ceci:
justify-content: safe center
ou
align-self: safe center
À partir de la spécification du module d'alignement de boîte CSS :
4.4. Alignement overflow: la safe
et unsafe
mots - clés et défilement des limites de sécurité
Lorsque [l'élément flexible] est plus grand que le [conteneur flexible], il débordera. Certains modes d'alignement, s'ils sont respectés dans cette situation, peuvent entraîner une perte de données: par exemple, si le contenu d'une barre latérale est centré, lorsqu'il déborde, il peut envoyer une partie de ses boîtes au-delà du bord de départ de la fenêtre, qui ne peut pas être défilée jusqu'à .
Pour contrôler cette situation, un mode d' alignement de débordement peut être spécifié explicitement. Unsafe
l'alignement respecte le mode d'alignement spécifié dans les situations de débordement, même s'il entraîne une perte de données, tandis que l' safe
alignement modifie le mode d'alignement dans les situations de débordement afin d'éviter la perte de données.
Le comportement par défaut consiste à contenir le sujet d'alignement dans la zone de défilement, bien qu'au moment de l'écriture, cette fonction de sécurité ne soit pas encore implémentée.
safe
Si la taille de [l'élément flexible] déborde du [conteneur flexible], [l'élément flexible] est plutôt aligné comme si le mode d'alignement était [ flex-start
].
unsafe
Quelles que soient les tailles relatives de [l'élément flexible] et du [conteneur flexible], la valeur d'alignement donnée est respectée.
Remarque: Le module d'alignement de boîte est destiné à être utilisé sur plusieurs modèles de disposition de boîte, pas seulement flex. Ainsi, dans l'extrait de spécification ci-dessus, les termes entre parenthèses disent en fait "sujet d'alignement", "conteneur d'alignement" et " start
". J'ai utilisé des termes spécifiques à Flex pour rester concentré sur ce problème particulier.
Explication de la limitation du défilement à partir de MDN:
Considérations sur les éléments flexibles
Les propriétés d'alignement de Flexbox effectuent un "vrai" centrage, contrairement aux autres méthodes de centrage en CSS. Cela signifie que les articles flexibles resteront centrés, même s'ils débordent du conteneur flexible.
Cependant, cela peut parfois poser problème s'ils dépassent le bord supérieur de la page ou le bord gauche, [...] car vous ne pouvez pas faire défiler jusqu'à cette zone, même s'il y a du contenu!
Dans une future version, les propriétés d'alignement seront étendues pour avoir également une option "sûre".
Pour l'instant, si cela vous inquiète, vous pouvez plutôt utiliser des marges pour réaliser le centrage, car elles répondront de manière "sûre" et cesseront de centrer si elles débordent.
Au lieu d'utiliser les align-
propriétés, placez simplement des auto
marges sur les éléments flexibles que vous souhaitez centrer.
Au lieu des justify-
propriétés, placez des marges automatiques sur les bords extérieurs des premier et dernier éléments flexibles dans le conteneur flexible.
Les auto
marges "fléchiront" et occuperont l'espace restant, en centrant les éléments flexibles lorsqu'il y a de l'espace restant et en passant à l'alignement normal dans le cas contraire.
Cependant, si vous essayez de remplacer justify-content
par un centrage basé sur les marges dans une boîte flexible multi-lignes, vous n'avez probablement pas de chance, car vous devez mettre les marges sur le premier et le dernier élément flexible sur chaque ligne. À moins que vous ne puissiez prédire à l'avance quels éléments se retrouveront sur quelle ligne, vous ne pouvez pas utiliser de manière fiable le centrage basé sur les marges dans l'axe principal pour remplacer la justify-content
propriété.
align-items: flex-start
au conteneur flex et conservezmargin: auto
pour l'élément flex.Eh bien, comme le prévoit la loi de Murphy, la lecture que j'ai faite après avoir posté cette question a donné quelques résultats - pas complètement résolus, mais quelque peu utiles néanmoins.
J'ai joué avec min-height un peu avant de poster, mais je n'étais pas au courant des contraintes de dimensionnement intrinsèques qui sont assez nouvelles pour la spécification.
http://caniuse.com/#feat=intrinsic-width
L'ajout d'un
min-height: min-content
à la zone flexbox résout le problème dans Chrome, et avec les préfixes des fournisseurs, il corrige également Opera et Safari, bien que Firefox ne soit toujours pas résolu.Toujours à la recherche d'idées sur Firefox et d'autres solutions potentielles.
la source
margin: auto
arrêtsflex-basis
de travailler pour moi alors que cette réponse a résolu les deux problèmes.J'ai réussi à retirer cela avec seulement 3 conteneurs. L'astuce consiste à séparer le conteneur flexbox du conteneur qui contrôle le défilement. Enfin, mettez tout dans un conteneur racine pour tout centrer. Voici les styles essentiels pour créer l'effet:
CSS:
HTML:
J'ai créé une démo ici: https://jsfiddle.net/r5jxtgba/14/
la source
flex: 1 1 auto
auscroll-container
. Je faisais ça avec habitude et j'ai eu des problèmes.Je pense avoir trouvé une solution. Cela fonctionne avec beaucoup de texte et un peu de texte . Vous n'avez pas besoin de spécifier la largeur de quoi que ce soit, et cela devrait fonctionner dans IE8.
la source
Selon MDN, la
safe
valeur peut désormais être fournie à des propriétés commealign-items
etjustify-content
. Il est décrit comme suit:Ainsi, il pourrait être utilisé comme suit.
Cependant, le support du navigateur n'est pas clair, je n'ai trouvé aucun exemple de son utilisation et j'ai eu quelques problèmes avec lui-même. Le mentionner ici pour attirer davantage l'attention sur lui.
la source
J'ai également réussi à le faire en utilisant un conteneur supplémentaire
HTML
CSS
dans jsfiddle> https://jsfiddle.net/Nash171/cpf4weq5/
changer les valeurs de largeur / hauteur de contenu et voir
la source
2 Méthode Flex du conteneur avec table de secours testée IE8-9, flex fonctionne dans IE10,11. Modifier: modifié pour assurer un centrage vertical en cas de contenu minimal, ajout de la prise en charge héritée.
Le problème provient de la taille héritée de la taille de la fenêtre d'affichage qui provoque un débordement des enfants, comme Michael a répondu. https://stackoverflow.com/a/33455342/3500688
quelque chose de plus simple et d'utiliser flex pour maintenir la mise en page dans le conteneur popup (contenu):
la source