CSS alinhar um item à direita com flexbox

212

https://jsfiddle.net/vhem8scs/

É possível alinhar dois itens à esquerda e um item à direita com o flexbox? O link mostra mais claramente. O último exemplo é o que eu quero alcançar.

No flexbox, tenho um bloco de código. Com float, tenho quatro blocos de código. Essa é uma das razões pelas quais eu prefiro o 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
fonte

Respostas:

525

Para alinhar um filho flex à direita, configure-o commargin-left: auto;

A partir da especificação flex :

Um uso de margens automáticas no eixo principal é separar itens flexíveis em "grupos" distintos. O exemplo a seguir mostra como usar isso para reproduzir um padrão de interface do usuário comum - uma única barra de ações com algumas alinhadas à esquerda e outras alinhadas à direita.

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

Violino atualizado

Nota:

Você pode obter um efeito semelhante definindo flex-grow: 1 no item flex do meio (ou taquigrafia flex:1), que empurraria o último item para a direita. ( Demo )

A diferença óbvia, porém, é que o item do meio se torna maior do que o necessário. Adicione uma borda aos itens flexíveis para ver a diferença.

Demo

Danield
fonte
Obrigado! Eu tentei outra coisa que funcionou antes de ler isso. Era para definir flex-grow: 1 no elemento que deveria empurrar o outro. Também funcionou. Você sabe quais deles são melhores e por quê?
Jens Törnell
2
Ótima resposta. Portanto, a margem não ocupa espaço extra e o flex: 1 ocupa. Legal!
Jens Törnell
4
@ JensTörnell, a automargem usa o espaço vazio no contêiner para separar os itens flex. A propriedade flex-grow/ flexpega esse espaço vazio, fornece-o ao item flexível, que se expande por esse valor. Conforme mencionado por Danield, o último método aumenta o item flexível DOIS maior, o que você pode não querer.
Michael Benjamin
12
Nem todos os heróis usam capas.
Tom
2
@ user1063287 para alinhar vários elementos à direita, basta aplicar a margem esquerda: auto no primeiro elemento que precisa ser alinhado à direita. Então, digamos que você quer que os últimos 4 elementos alinhados à direita, você faria isso: div:nth-last-child(4) { margin-left: auto } codepen.io/danield770/pen/ERyoar
DanielD
37

Para uma opção flexbox pura e concisa, agrupe os itens alinhados à esquerda e alinhados à direita:

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

e use space-between:

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

Dessa forma, você pode agrupar vários itens à direita (ou apenas um).

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

spflow
fonte
Isso funciona, mas se você não alterar os elementos dentro de cada grupo para serem display: inline; or display: inline-block;, então eles empilhados em vez de todos em uma fileira, como o flexbox, caso contrário os teriam.
O DIMM ceifeira
@TheDIMMReaper Não tenho certeza se vejo o problema. Você poderia expandir?
Spsp #
Eu só quero dizer como você mudou as tags imediatamente One e Twode divs para spans - se ainda display: block;estivessem, fluiriam para linhas separadas. Como o OP originalmente tinha divs, eu só queria salientar que simplesmente colocá-los dentro de outro divnão funcionaria sem alterar a exibição das tags originais.
The DIMM Reaper
1
Sim, como os elementos agora estão em um nível inferior, display: flexnão estão mais influenciando seu layout. Se você quiser usar div, sim, inlineou inline-blockfuncionaria. Mas também, obviamente, flexjá que o estamos usando como padrão flex-direction: rowcom as divs já. ex. jsfiddle.net/ynbb5964/2
spflow
Obrigado, tentei se alinhar: flex-end, mas por que não funciona?
Anand
3

Para alinhar alguns elementos (headerElement) no centro e o último elemento à direita (headerEnd).

.headerElement {
    margin-right: 5%;
    margin-left: 5%;
}
.headerEnd{
    margin-left: auto;
}
Satvik Vats
fonte