CSS aligner un élément à droite avec flexbox

212

https://jsfiddle.net/vhem8scs/

Est-il possible d'avoir deux éléments alignés à gauche et un élément aligné à droite avec flexbox? Le lien le montre plus clairement. Le dernier exemple est ce que je veux réaliser.

Dans flexbox, j'ai un bloc de code. Avec float, j'ai quatre blocs de code. C'est une des raisons pour lesquelles je préfère la flexbox.

HTML

<div class="wrap">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</div>

<!-- DESIRED RESULT -->

<div class="result">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</div>

CSS

.wrap {
  display: flex;
  background: #ccc;
  width: 100%;
  justify-content: space-between;
}

.result {
  background: #ccc;
  margin-top: 20px;
}

.result:after {
  content: '';
  display: table;
  clear: both;
}

.result div {
  float: left;
}
.result div:last-child {
  float: right;
}
Jens Törnell
la source

Réponses:

525

Pour aligner un enfant flexible à droite, définissez-le avecmargin-left: auto;

De la spécification flex :

Une utilisation des marges automatiques dans l'axe principal consiste à séparer les éléments flexibles en "groupes" distincts. L'exemple suivant montre comment l'utiliser pour reproduire un modèle d'interface utilisateur commun - une seule barre d'actions avec certaines alignées à gauche et d'autres alignées à droite.

.wrap div:last-child {
  margin-left: auto;
}

Violon mis à jour

Remarque:

Vous pouvez obtenir un effet similaire en définissant flex-grow: 1 sur l'élément flex central (ou raccourci flex:1 ), ce qui pousserait le dernier élément complètement vers la droite. ( Démo )

Cependant, la différence évidente est que l'élément du milieu devient plus gros qu'il ne devrait l'être. Ajoutez une bordure aux éléments flexibles pour voir la différence.

Démo

Danield
la source
Merci! J'ai essayé une autre chose qui fonctionnait avant de lire ceci. Il s'agissait de fixer flex-grow: 1 sur l'élément qui devrait pousser l'autre. Cela a également fonctionné. Savez-vous lesquels sont les meilleurs et pourquoi?
Jens Törnell
2
Très bonne réponse. Ainsi, la marge ne prend pas d'espace supplémentaire, et le flex: 1 le fait. Cool!
Jens Törnell
4
@ JensTörnell, la automarge utilise l'espace vide dans le conteneur pour séparer les éléments flexibles. La propriété flex-grow/ flexprend cet espace vide, le donne à l'élément flexible, qui se développe de ce montant. Comme mentionné par Danield, cette dernière méthode agrandit l'élément flexible DEUX, ce que vous ne voudrez peut-être pas.
Michael Benjamin
12
Les héros ne portent pas tous des capes.
Tom
2
@ user1063287 pour aligner plusieurs éléments à droite, appliquez simplement margin-left: auto sur le premier élément qui doit être aligné à droite. Disons que vous voulez que les 4 derniers éléments soient alignés à droite, vous feriez ceci: div:nth-last-child(4) { margin-left: auto } codepen.io/danield770/pen/ERyoar
Danield
37

Pour une option Flexbox pure et concise, regroupez les éléments alignés à gauche et les éléments alignés à droite:

<div class="wrap">
  <div>
    <span>One</span>
    <span>Two</span>
  </div>
  <div>Three</div>
</div>

et utiliser space-between:

.wrap {
  display: flex;
  background: #ccc;
  justify-content: space-between;
}

De cette façon, vous pouvez regrouper plusieurs éléments vers la droite (ou un seul).

https://jsfiddle.net/c9mkewwv/3/

débit
la source
Cela fonctionne, mais si vous ne changez pas les éléments à l'intérieur de chaque groupe en display: inline;ou display: inline-block;, ils seront empilés au lieu de tous dans une rangée comme flexbox sinon ils les auraient.
Le DIMM Reaper
@TheDIMMReaper Je ne suis pas sûr de voir le problème. Pourriez-vous vous étendre?
spflow
Je veux juste dire comment vous avez changé les balises immédiatement Oneet Twode divs à spans - si elles étaient encore, display: block;elles couleraient sur des lignes séparées. Puisque l'OP avait à l'origine des divs, je voulais juste souligner que les mettre simplement dans un autre divne fonctionnerait pas sans changer l'affichage des balises originales.
Le DIMM Reaper du
1
Oui, puisque les éléments sont maintenant en bas d'un niveau, display: flexn'influence plus leur disposition. Si vous voulez utiliser des div, oui, inlineou inline-blockcela fonctionnerait. Mais aussi, évidemment, flexpuisque nous l'utilisons par défaut flex-direction: rowavec les div parent déjà. ex. jsfiddle.net/ynbb5964/2
spflow
Merci, j'ai essayé align-self: flex-end, mais pourquoi ça ne marche pas?
Anand
3

Pour aligner certains éléments (headerElement) au centre et le dernier élément à droite (headerEnd).

.headerElement {
    margin-right: 5%;
    margin-left: 5%;
}
.headerEnd{
    margin-left: auto;
}
Cuves Satvik
la source