Considérez l'axe principal et l'axe transversal d'un conteneur flexible:
Source: W3C
Pour aligner les éléments flexibles le long de l'axe principal, il existe une propriété:
Pour aligner les éléments flexibles le long de l'axe transversal, il existe trois propriétés:
Dans l'image ci-dessus, l'axe principal est horizontal et l'axe transversal est vertical. Ce sont les directions par défaut d'un conteneur flexible.
Cependant, ces directions peuvent être facilement échangées avec la flex-direction
propriété.
/* main axis is horizontal, cross axis is vertical */
flex-direction: row;
flex-direction: row-reverse;
/* main axis is vertical, cross axis is horizontal */
flex-direction: column;
flex-direction: column-reverse;
(L'axe transversal est toujours perpendiculaire à l'axe principal.)
Mon point en décrivant comment le travail des axes est qu'il ne semble y avoir rien de spécial dans l'une ou l'autre direction. Axe principal, axe transversal, ils sont tous deux égaux en importance et flex-direction
facilitent les allers-retours.
Alors pourquoi l'axe transversal obtient-il deux propriétés d'alignement supplémentaires?
Pourquoi align-content
et align-items
consolidé en une seule propriété pour l'axe principal?
Pourquoi l'axe principal n'obtient-il pas de justify-self
propriété?
Scénarios où ces propriétés seraient utiles:
placer un élément flexible dans le coin du conteneur flexible
#box3 { align-self: flex-end; justify-self: flex-end; }
création d'un groupe d'éléments flexibles align-right (
justify-content: flex-end
) mais le premier élément s'aligne left (justify-self: flex-start
)Considérez une section d'en-tête avec un groupe d'éléments de navigation et un logo. Avec
justify-self
le logo pourrait être aligné à gauche tandis que les éléments de navigation restent à l'extrême droite, et le tout s'ajuste en douceur ("fléchit") à différentes tailles d'écran.dans une rangée de trois éléments flexibles, fixez l'élément du milieu au centre du conteneur (
justify-content: center
) et alignez les éléments adjacents sur les bords du conteneur (justify-self: flex-start
etjustify-self: flex-end
).Notez que les valeurs
space-around
etspace-between
sur lajustify-content
propriété ne gardera pas l'élément Centré au milieu autour du récipient si les éléments adjacents ont des largeurs différentes.
Au moment d'écrire ces lignes , il n'y a aucune mention de justify-self
ou justify-items
dans la spécification flexbox .
Cependant, dans le module d'alignement de boîtes CSS , qui est la proposition inachevée du W3C d'établir un ensemble commun de propriétés d'alignement à utiliser sur tous les modèles de boîtes, il y a ceci:
Source: W3C
Vous le remarquerez justify-self
et justify-items
êtes envisagé ... mais pas pour la flexbox .
Je terminerai en réitérant la question principale:
Pourquoi n'y a-t-il pas de propriétés "justifier-articles" et "justifier-soi"?
la source
justify-self
à travailler pour un article flexible? Supposons que vous ayez des éléments a, b, c, d avec un espace supplémentaire à distribuer autour d'eux, et que le conteneur flexible en disposejustify-content: space-between
, de sorte qu'ils finissent comme | abcd |. Qu'est-ce que cela signifierait d'ajouter par exemplejustify-self: center
ou «justifier-soi: flex-end» juste pour l'élément «b»? Où vous attendriez-vous à ce qu'il aille? (Je vois quelques démos dans l'une des réponses ici, mais je ne vois pas de manière claire que cela fonctionnerait en général.)justify-content: flex-start
, donc les éléments sont encombrés au début comme | abcd |. Que vous attendriez-vous à ce que cela sejustify-self: [anything]
justify-self
à travailler pour un élément flexible? Je dirais pas si différemment que lesauto
marges fonctionnent déjà sur les éléments flexibles. Dans votre deuxième exemple, l'justify-self: flex-end
élément d le déplacerait vers le bord éloigné. Ce serait en soi une grande fonctionnalité, ce que lesauto
marges peuvent déjà faire. J'ai posté une réponse avec une démonstration.justify-content
etjustify-self
sont spécifiés, de sorte que les cas avec les conflits (comme les scénarios je leur ai demandé) sont clairement et sensiblement définis. Comme je l'ai noté dans ma réponse ici, il{justify|align}-self
s'agit d'aligner les éléments dans une boîte plus grande qui est dimensionnée indépendamment de la{justify|align}-self
valeur - et il n'y a pas une telle boîte, dans l'axe principal, pour un élément flexible à aligner.justify-self
etjustify-content
interagiriez, en cas de conflit (comme les scénarios que j'ai exposés). Marges automatiques ne suffit pas d' interagir avecjustify-content
du tout - ils volent tout l'espace d'emballage avantjustify-content
obtient une chance de l' utiliser. Ainsi, les marges automatiques ne sont pas vraiment un bon analogue pour savoir comment cela fonctionnerait.Réponses:
Méthodes d'alignement des éléments flexibles le long de l'axe principal
Comme indiqué dans la question:
La question demande alors:
Une réponse peut être: parce qu'elles ne sont pas nécessaires.
La spécification flexbox fournit deux méthodes pour aligner les éléments flexibles le long de l'axe principal:
justify-content
propriété du mot clé, etauto
margesjustifier-contenu
le
justify-content
propriété aligne les éléments flexibles le long de l'axe principal du conteneur flexible.Il est appliqué au conteneur flexible mais n'affecte que les éléments flexibles.
Il existe cinq options d'alignement:
flex-start
~ Les articles flexibles sont emballés vers le début de la ligne.flex-end
~ Les articles flexibles sont emballés vers la fin de la ligne.center
~ Les articles flexibles sont emballés vers le centre de la ligne.space-between
~ Les éléments flexibles sont régulièrement espacés, le premier élément étant aligné sur un bord du conteneur et le dernier élément aligné sur le bord opposé. Les bords utilisés par les premier et dernier éléments dépendentflex-direction
et mode d'écriture (ltr
ourtl
).space-around
~ Identiquespace-between
sauf avec des espaces demi-taille aux deux extrémités.Marges automatiques
Avec
auto
marges , les éléments flexibles peuvent être centrés, espacés ou regroupés en sous-groupes.Contrairement à
justify-content
ce qui est appliqué au conteneur flexible,auto
marges vont aux éléments flexibles.Ils fonctionnent en consommant tout l'espace libre dans la direction spécifiée.
Aligner le groupe d'éléments flexibles à droite, mais le premier élément à gauche
Scénario de la question:
Autres scénarios utiles:
Placer un élément flexible dans le coin
Scénario de la question:
Centrer un élément flexible verticalement et horizontalement
margin: auto
est une alternative àjustify-content: center
etalign-items: center
.Au lieu de ce code sur le conteneur flex:
Vous pouvez l'utiliser sur l'élément flexible:
Cette alternative est utile lors du centrage d'un élément flexible qui déborde du conteneur .
Centrer un élément flexible et centrer un deuxième élément flexible entre le premier et le bord
Un conteneur flexible aligne les articles flexibles en distribuant de l'espace libre.
Par conséquent, afin de créer un équilibre égal , de sorte qu'un élément intermédiaire puisse être centré dans le conteneur avec un seul élément à côté, un contrepoids doit être introduit.
Dans les exemples ci-dessous, des troisièmes éléments flexibles invisibles (cases 61 et 68) sont introduits pour équilibrer les «vrais» éléments (cases 63 et 66).
Bien sûr, cette méthode n'a rien de génial en termes de sémantique.
Alternativement, vous pouvez utiliser un pseudo-élément au lieu d'un élément DOM réel. Ou vous pouvez utiliser un positionnement absolu. Les trois méthodes sont traitées ici: Éléments flexibles centrés et alignés en bas
REMARQUE: Les exemples ci-dessus ne fonctionneront - en termes de centrage réel - que lorsque les éléments les plus externes sont égaux en hauteur / largeur. Lorsque les éléments flexibles sont de longueurs différentes, voir l'exemple suivant.
Centrer un élément flexible lorsque les éléments adjacents varient en taille
Scénario de la question:
Comme indiqué, à moins que tous les éléments flexibles soient de largeur ou de hauteur égales (selon
flex-direction
), l'élément central ne peut pas être vraiment centré. Ce problème constitue un argument solide pour unejustify-self
propriété (conçue pour gérer la tâche, bien sûr).Afficher l'extrait de code
Voici deux méthodes pour résoudre ce problème:
Solution n ° 1: positionnement absolu
La spécification flexbox permet un positionnement absolu des éléments flexibles . Cela permet à l'élément du milieu d'être parfaitement centré quelle que soit la taille de ses frères et sœurs.
N'oubliez pas que, comme tous les éléments positionnés de manière absolue, les éléments sont supprimés du flux de documents . Cela signifie qu'ils ne prennent pas de place dans le conteneur et peuvent chevaucher leurs frères et sœurs.
Dans les exemples ci-dessous, l'élément central est centré avec un positionnement absolu et les éléments externes restent en flux. Mais la même mise en page peut être réalisée de manière inverse: Centrez l'élément du milieu avec
justify-content: center
et positionnez absolument les éléments extérieurs.Solution n ° 2: conteneurs Flex imbriqués (pas de positionnement absolu)
Voici comment ça fonctionne:
.container
) est un conteneur flexible..box
) est désormais un élément flexible..box
article est donnéflex: 1
afin de répartir également l'espace du conteneur.justify-content: center
.span
élément est un élément flexible centré.auto
marges flexibles pour décaler les extrémités externes vers laspan
gauche et la droite.Vous pouvez également renoncer
justify-content
et utiliser desauto
marges exclusivement.Mais
justify-content
peut fonctionner ici car lesauto
marges ont toujours la priorité. De la spécification:justifier-contenu: espace-même (concept)
Pour revenir à
justify-content
une minute, voici une idée pour une option de plus.space-same
~ Un hybride despace-between
etspace-around
. Les éléments flexibles sont régulièrement espacés (commespace-between
), sauf qu'au lieu d'espaces demi-taille aux deux extrémités (commespace-around
), il y a des espaces pleine taille aux deux extrémités.Cette disposition peut être réalisé avec
::before
et::after
pseudo-éléments sur le conteneur flexible.(crédit: @oriol pour le code et @crl pour l'étiquette)
MISE À JOUR: Les navigateurs ont commencé à mettre en œuvre
space-evenly
, ce qui accomplit ce qui précède. Voir cet article pour plus de détails: Espace égal entre les éléments flexiblesAIRE DE JEUX (inclut le code pour tous les exemples ci-dessus)
la source
justify-content
et lesauto
marges. Pour l'autre côté de la médaille - l' axe croix ,align-items
,align-self
etalign-content
- voir ce post: stackoverflow.com/q/42613359/3597276justify-self
propriété ... lesauto
marges sont utiles, maisjustify-self: center
seraient idéales. La façon de résoudre le problème que vous avez présenté serait de créer des doublons invisibles du côté opposé. Voir ma réponse ici: stackoverflow.com/q/38948102/3597276space-same
concept est une chose réelle maintenant. Il s'appellespace-evenly
, mais il n'est pris en charge que par Firefox pour le moment: developer.mozilla.org/en-US/docs/Web/CSS/justify-contentspace-evenly
dans d'autres réponses: stackoverflow.com/q/45134400/3597276space-evenly
était pris en charge dans Chrome 57-60, mais uniquement pour la disposition de la grille. C'était un bug qui a été corrigé, et depuis Chrome 61, il est également pris en charge pour Flexbox. En outre, il y a la façon d'imiter sans pseudo-éléments:.item { margin-right: auto } .item:first-child { margin-left: auto }
.Je sais que ce n'est pas une réponse, mais j'aimerais contribuer à cette question pour ce qu'elle vaut. Ce serait formidable s'ils pouvaient libérer
justify-self
Flexbox pour le rendre vraiment flexible.Je pense que lorsqu'il y a plusieurs éléments sur l'axe, la manière la plus logique de
justify-self
se comporter est de s'aligner sur ses voisins (ou bords) les plus proches, comme illustré ci-dessous.J'espère vraiment que le W3C en prend note et y réfléchira au moins. =)
De cette façon, vous pouvez avoir un élément qui est vraiment centré quelle que soit la taille des cases gauche et droite. Lorsque l'une des boîtes atteint le point de la boîte centrale, elle la poussera simplement jusqu'à ce qu'il n'y ait plus d'espace à distribuer.
La facilité de faire des mises en page impressionnantes est infinie, jetez un oeil à cet exemple "complexe".
la source
justify-self
etjustify-items
.auto
marges ne sont pas un substitut completjustify-self
. J'ai pris soin de formuler mon commentaire précédent en disant que lesauto
marges couvriront certains des cas d'utilisation . Comme vous l'avez noté, il ne peut pas centrer un élément en place lorsque les éléments adjacents sont de tailles différentes. Cependant, il offre plus d'options pour aligner les éléments flexibles. Quand j'ai commencé à apprendre sur Flexbox, je pensaisjustify-content
que les éléments d'espacement invisibles étaient le seul moyen.Cela a été demandé sur la liste de style www, et Tab Atkins (éditeur de spécifications) a fourni une réponse expliquant pourquoi . Je vais en parler un peu ici.
Pour commencer, supposons d'abord que notre conteneur flexible est à une seule ligne (
flex-wrap: nowrap
). Dans ce cas, il y a clairement une différence d'alignement entre l'axe principal et l'axe transversal - il y a plusieurs éléments empilés dans l'axe principal, mais un seul élément empilé dans l'axe transversal. Il est donc logique d'avoir un "align-self" personnalisable par élément dans l'axe transversal (puisque chaque élément est aligné séparément, seul), alors qu'il n'a pas de sens dans l'axe principal (car là, le les éléments sont alignés collectivement).Pour la flexbox multiligne, la même logique s'applique à chaque "flex line". Dans une ligne donnée, les éléments sont alignés individuellement dans l'axe transversal (car il n'y a qu'un seul élément par ligne, dans l'axe transversal), contre collectivement dans l'axe principal.
Voici une autre façon de le formuler: ainsi, toutes les propriétés
*-self
et*-content
concernent la répartition de l'espace supplémentaire autour des choses. Mais la principale différence est que les*-self
versions sont pour les cas où il n'y a qu'une seule chose dans cet axe , et les*-content
versions sont pour quand il y a potentiellement beaucoup de choses dans cet axe . Les scénarios à une seule chose ou à plusieurs choses sont différents types de problèmes, et ils ont donc différents types d'options disponibles - par exemple, les valeursspace-around
/ ontspace-between
un sens pour*-content
, mais pas pour*-self
.SO: Dans l'axe principal d'une flexbox, il y a beaucoup de choses pour répartir l'espace autour. Une
*-content
propriété a donc un sens, mais pas un*-self
propriété.En revanche, dans l'axe transversal, nous avons à la fois une
*-self
et une*-content
propriété. L'un détermine comment nous allons répartir l'espace autour des nombreuses lignes flexibles (align-content
), tandis que l'autre (align-self
) détermine comment répartir l'espace autour des éléments flex individuels dans l'axe transversal, au sein d'une ligne flexible donnée.(J'ignore les
*-items
propriétés ici, car elles établissent simplement des valeurs par défaut pour*-self
.)la source
justify-self
pourrait être un problème sur un axe avec plusieurs éléments plutôt qu'un seul. Cependant, j'espère vraiment qu'ils approfondiront la question, dans une situation à éléments multiples, comment sejustify-self
comporterait-il, car il y a des situations où cela pourrait être vraiment utile. Par exemple ( stackoverflow.com/questions/32378953/… ).justify-self
.*-self
s'agit de cas où nous n'avons qu'une seule chose à aligner, alors qu'il*-content
s'agit de cas où nous avons beaucoup de choses à aligner. Est-ce que cela le rend un peu plus clair?auto
marges, qui font également partie de la spécification, permettent l'alignement * -self avec plusieurs éléments de la ligne. Aucune raison claire pour laquelle les propriétés des mots clés ne le peuvent pas également.Je sais que cela n'utilise pas flexbox, mais pour le cas d'utilisation simple de trois éléments (un à gauche, un au centre, un à droite), cela peut être accompli facilement en utilisant
display: grid
le parent,grid-area: 1/1/1/1;
les enfants et lejustify-self
positionnement de ces enfants.la source
Je viens de trouver ma propre solution à ce problème, ou du moins mon problème.
J'utilisais
justify-content: space-around
au lieu dejustify-content: space-between;
.De cette façon, les éléments finaux resteront en haut et en bas, et vous pourriez avoir des marges personnalisées si vous le souhaitez.
la source