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é.