262 votes

Centrer un élément flexbox et aligner les autres à droite et à gauche

J'aimerais avoir A B y C alignés au milieu.

Comment puis-je obtenir D pour aller complètement à droite ?

AVANT :

enter image description here

APRÈS :

enter image description here

ul {
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
}
li {
  display: flex;
  margin: 1px;
  padding: 5px;
  background: #aaa;
}
li:last-child {
  background: #ddd;
  /* magic to throw to the right*/
}

<ul>
  <li>A</li>
  <li>B</li>
  <li>C</li>
  <li>D</li>
</ul>

https://jsfiddle.net/z44p7bsx/

0voto

Saba Ahang Points 522

Inspiré par la Méthode n° 5 : Grille CSS de @Michal Benjamin et parce que j'utilise Tailwind et que je n'ai pas encore accès à toutes les options de la grille par défaut. Cela semble fonctionner :

ul {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
}
li:nth-child(1) { justify-content: flex-start; } // OR: margin-right: auto
li:nth-child(3) { justify-content: flex-end; } // OR: margin-left:auto
li: {align-self: center;}

<ul>
  <li>A</li>
  <li>B</li>
  <li>C</li>
</ul>

PS : Je ne suis pas sûr que mélanger flex et grid de cette manière soit une bonne idée !

2 votes

Vous ne mélangez pas grid et flex, justifty-content est une propriété CSS grid ET flexbox (idem pour align-self)

0 votes

De même, la grille et la flexion sont conçues pour fonctionner ensemble.

-1voto

rgfx Points 39

Question très claire. Je n'ai pas pu m'empêcher de poster la réponse après quelques heures de recherche. Nous aurions pu résoudre ce problème avec des tables, des cellules de table, des positions absolues, des transformations, mais nous avons dû le faire avec flexbox :)

.parent {
  display: flex;
  justify-content: flex-end;
}

.center {
  margin: auto;
}

http://codepen.io/rgfx/pen/BLorgd

8 votes

Cette méthode ne permet pas de centrer véritablement les éléments du milieu, car elle ne prend en compte que les éléments du milieu. restant et non l'espace entière l'espace. codepen.io/anon/pen/QKGrRk

0 votes

@Michael_B, vous avez raison, je ne l'avais pas remarqué, c'est ma faute. Je reviens à l'utilisation des positions absolues :( Peut-être qu'avec votre haut niveau de réputation, vous devriez mettre en place une prime pour que ce problème soit résolu pour de bon. Je le ferais bien mais j'ai une très faible réputation, encore plus faible maintenant en essayant de vous aider.

0 votes

Aucun bounty ne va ajouter un nouveau comportement au modèle flexbox, la réponse donnée par Michael_B est aussi bonne qu'elle puisse l'être... aujourd'hui.

-2voto

HerrSerker Points 9005

J'ai développé Michael_B 's responder

.center-flex__2-of-3 > :nth-child(1), .center-flex__2-of-3 > :nth-child(3) {
  flex: 1;
}
.center-flex__2-of-3 > :nth-child(1) {
  justify-content: flex-start;
}
.center-flex__2-of-3 > :nth-child(3) {
  justify-content: flex-end;
}
.center-flex__1-of-2 > :nth-child(1) {
  margin: auto;
}
.center-flex__1-of-2 > :nth-child(2) {
  flex: 1;
  justify-content: flex-end;
}
.center-flex__2-of-2 > :nth-child(1) {
  flex: 1;
  justify-content: flex-start;
}
.center-flex__2-of-2 > :nth-child(2) {
  margin: auto;
}
.center-flex__1-of-2:before, .center-flex__1-of-1:before {
  content: '';
  flex: 1;
}
.center-flex__1-of-1:after, .center-flex__2-of-2:after {
  content: '';
  flex: 1;
}

[class*=center-flex] {
  display: flex;
  list-style: none;
  margin: 0;
  padding: 0;
  border: 10px solid rgba(0, 0, 0, 0.1);
}
[class*=center-flex] > * {
  display: flex;
}

li {
  padding: 3px 5px;
}

2 of 3
<ul class="center-flex__2-of-3">
  <span>
    <li>Accusamus</li>
    <li>Porro</li>
  </span>
  <span>
    <li>Center</li>
    <li>this</li>
  </span>
  <span>
    <li>Accusamus</li>
    <li>Porro</li>
    <li>Culpa</li>
    <li>Sit</li>
  </span>
</ul>

<br><br>
1 of 2
<ul class="akex center-flex__1-of-2">
  <span>
    <li>Center</li>
    <li>this</li>
  </span>
  <span>
    <li>Accusamus</li>
    <li>Porro</li>
    <li>Culpa</li>
    <li>Sit</li>
  </span>
</ul>

<br><br>
2 of 2
<ul class="akex center-flex__2-of-2">
  <span>
    <li>Accusamus</li>
    <li>Porro</li>
    <li>Culpa</li>
    <li>Sit</li>
  </span>
  <span>
    <li>Center</li>
    <li>this</li>
  </span>
</ul>

<br><br>
1 of 1
<ul class="center-flex__1-of-1">
  <span>
    <li>Center</li>
    <li>this</li>
  </span>
</ul>

Ici, avec l'aide de SASS comme codepen

-2voto

repo Points 178

La réponse acceptée peut être légèrement modifiée car il est possible d'utiliser des zones de modèle de grille et de le faire sans faux élément.

grid-template-areas '. b c'
grid-template-columns: 1fr 1fr 1fr

-4voto

SUDHIR KUMAR Points 181
ul { 
  padding: 0; 
  margin: 0;
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
}
li {
  display: flex;
  margin: 1px;
  padding: 5px;
  background: #aaa;
}
li:last-child {
  background: #ddd;
  position:absolute;
  right:10px;

}

<ul>
  <li>A</li>
  <li>B</li>
  <li>C</li>
  <li>D</li>
</ul>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X