I CSS allineano un elemento a destra con flexbox


212

https://jsfiddle.net/vhem8scs/

È possibile allineare due elementi a sinistra e uno allineato a destra con flexbox? Il link lo mostra più chiaramente. L'ultimo esempio è quello che voglio ottenere.

Nel flexbox ho un blocco di codice. Con float ho quattro blocchi di codice. Questo è uno dei motivi per cui preferisco 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;
}

Risposte:


525

Per allineare un bambino flessibile a destra, impostalo conmargin-left: auto;

Dalle specifiche flex :

Un uso dei margini automatici nell'asse principale consiste nel separare gli elementi flessibili in "gruppi" distinti. L'esempio seguente mostra come utilizzarlo per riprodurre un modello di interfaccia utente comune: una singola barra di azioni con alcune allineate a sinistra e altre allineate a destra.

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

Violino aggiornato

Nota:

È possibile ottenere un effetto simile impostando flex-grow: 1 sull'elemento flex centrale (o stenografia flex:1) che spingerebbe l'ultimo elemento completamente a destra. ( Demo )

L'ovvia differenza è che l'elemento centrale diventa più grande di quanto potrebbe essere necessario. Aggiungi un bordo agli elementi flessibili per vedere la differenza.

dimostrazione


Grazie! Ho provato un'altra cosa che ha funzionato prima di leggere questo. Doveva impostare flex-grow: 1 sull'elemento che dovrebbe spingere l'altro. Funzionava pure. Sai quali di loro sono migliori e perché?
Jens Törnell,

2
Bella risposta. Quindi il margine non occupa spazio extra e il flex: 1 lo fa. Freddo!
Jens Törnell,

4
@ JensTörnell, il automargine utilizza lo spazio vuoto nel contenitore per separare gli oggetti flessibili. La proprietà flex-grow/ flexprende quello spazio vuoto, lo dà all'elemento flessibile, che si espande di tale importo. Come accennato da Danield, quest'ultimo metodo rende l'oggetto flessibile DUE più grande, cosa che potresti non voler.
Michael Benjamin,

12
Non tutti gli eroi indossano mantelli.
Tom,

2
@ user1063287 per allineare più elementi a destra basta applicare margin-left: auto sul primo elemento che deve essere allineato a destra. Quindi diciamo che vuoi che gli ultimi 4 elementi siano allineati a destra, dovresti farlo: div:nth-last-child(4) { margin-left: auto } codepen.io/danield770/pen/ERyoar
Danield

37

Per un'opzione flessibile e pura, raggruppa gli oggetti allineati a sinistra e quelli allineati a destra:

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

e usa space-between:

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

In questo modo puoi raggruppare più elementi a destra (o solo uno).

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


Funziona, ma se non si cambiano gli elementi all'interno di ciascun gruppo in modo che siano display: inline;o display: inline-block;, allora vengono impilati invece di tutti in una riga come flexbox altrimenti li avrebbero.
Il DIMM Reaper il

@TheDIMMReaper Non sono sicuro di vedere il problema. Potresti espandere?
spflow

Intendo solo come hai cambiato i tag immediatamente a capo Onee Twoda divs a spans - se fossero ancora display: block;, fluirebbero su linee separate. Dato che l'OP originariamente aveva degli divs, volevo solo sottolineare che semplicemente inserirli in un altro divnon avrebbe funzionato senza cambiare la visualizzazione dei tag originali.
Il DIMM Reaper il

1
Sì, poiché gli elementi sono ora scesi di livello, display: flexnon influenza più il loro layout. Se vuoi usare div, sì, inlineo inline-blockfunzionerebbe. Ma anche, ovviamente, flexdal momento che lo stiamo usando per impostazione predefinita flex-direction: rowcon i div del genitore già. ex. jsfiddle.net/ynbb5964/2
spflow

Grazie, ho provato a align-self: flex-end, ma perché non funziona?
Anand,

3

Per allineare alcuni elementi (headerElement) al centro e l'ultimo elemento a destra (headerEnd).

.headerElement {
    margin-right: 5%;
    margin-left: 5%;
}
.headerEnd{
    margin-left: auto;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.