CSS richtet ein Element rechts mit der Flexbox aus


212

https://jsfiddle.net/vhem8scs/

Ist es möglich, zwei Elemente links und ein Element rechts an der Flexbox auszurichten? Der Link zeigt es deutlicher. Das letzte Beispiel ist das, was ich erreichen möchte.

In der Flexbox habe ich einen Codeblock. Mit float habe ich vier Codeblöcke. Das ist ein Grund, warum ich Flexbox bevorzuge.

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;
}

Antworten:


523

Um ein Flex-Kind nach rechts auszurichten, stellen Sie es mit einmargin-left: auto;

Aus der Flex-Spezifikation :

Eine Verwendung von automatischen Rändern in der Hauptachse besteht darin, Flex-Elemente in verschiedene "Gruppen" zu unterteilen. Das folgende Beispiel zeigt, wie Sie damit ein allgemeines UI-Muster reproduzieren können - eine einzelne Aktionsleiste, von der einige links und andere rechts ausgerichtet sind.

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

Geige aktualisiert

Hinweis:

Sie können einen ähnlichen Effekt erzielen, indem Sie Flex-Grow einstellen: 1 für das mittlere Flex-Element (oder die Kurzschrift flex:1), wodurch das letzte Element ganz nach rechts verschoben wird. ( Demo )

Der offensichtliche Unterschied besteht jedoch darin, dass das mittlere Element größer wird, als es möglicherweise sein muss. Fügen Sie den Flex-Elementen einen Rahmen hinzu, um den Unterschied zu erkennen.

Demo


Vielen Dank! Ich habe eine andere Sache ausprobiert, die funktioniert hat, bevor ich sie gelesen habe. Es sollte Flex-Grow gesetzt werden: 1 auf das Element, das das andere drücken sollte. Es hat auch funktioniert. Wissen Sie, welche von ihnen besser sind und warum?
Jens Törnell

2
Gute Antwort. Der Rand nimmt also keinen zusätzlichen Platz ein, und der Flex: 1 tut dies. Cool!
Jens Törnell

4
@ JensTörnell, der autoRand verwendet den leeren Raum im Container, um die Flex-Elemente zu trennen. Die Eigenschaft flex-grow/ flexnimmt diesen leeren Raum und gibt ihn an das Flex-Element weiter, das um diesen Betrag erweitert wird. Wie von Danield erwähnt, vergrößert die letztere Methode das Flex-Element ZWEI, was Sie möglicherweise nicht möchten.
Michael Benjamin

12
Nicht alle Helden tragen Umhänge.
Tom

2
@ user1063287 Um mehrere Elemente nach rechts auszurichten, wenden Sie einfach margin-left: auto auf das erste Element an, das nach rechts ausgerichtet werden muss. Nehmen wir also an, Sie möchten, dass die letzten 4 Elemente rechts ausgerichtet werden. div:nth-last-child(4) { margin-left: auto } Codepen.io/danield770/pen/ERyoar
Danield

37

Gruppieren Sie für eine knappe, reine Flexbox-Option die linksbündigen und die rechtsbündigen Elemente:

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

und verwenden space-between:

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

Auf diese Weise können Sie mehrere Elemente rechts (oder nur eines) gruppieren.

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


Dies funktioniert, aber wenn Sie die Elemente in jeder Gruppe nicht so ändern, dass sie display: inline;oder sind display: inline-block;, werden sie gestapelt, anstatt alle in einer Reihe, wie dies bei Flexbox der Fall wäre.
Der DIMM Reaper

@ TheDIMMReaper Ich bin nicht sicher, ob ich das Problem sehe. Könnten Sie erweitern?
Spflow

Ich meine nur, wie Sie die Tags geändert haben, die sofort umbrochen wurden, Oneund Twovon divs nach spans - wenn sie noch display: block;wären, würden sie in separate Zeilen fließen. Da das OP ursprünglich divs hatte, wollte ich nur darauf hinweisen, dass das einfache Einfügen in ein anderes divnicht funktionieren würde, ohne die Anzeige der ursprünglichen Tags zu ändern.
Der DIMM Reaper

1
Ja, da die Elemente jetzt eine Ebene tiefer liegen, display: flexhat dies keinen Einfluss mehr auf ihr Layout. Wenn Sie divs verwenden möchten, ja, inlineoder inline-blockwürde funktionieren. Aber natürlich auch flex, da wir es bereits für die Standardeinstellung flex-direction: rowmit übergeordneten Divs verwenden. Ex. jsfiddle.net/ynbb5964/2
spflow

Danke, ich habe Align-Self: Flex-End ausprobiert, aber warum funktioniert es nicht?
Anand

3

Zum Ausrichten einiger Elemente (headerElement) in der Mitte und des letzten Elements rechts (headerEnd).

.headerElement {
    margin-right: 5%;
    margin-left: 5%;
}
.headerEnd{
    margin-left: auto;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.