Flexbox – Blocksatz links und rechts auf derselben Zeile

Lesezeit: 6 Minuten

Lage:

Ich habe eine einfache Navigationsleiste, die ich in Flexbox baue. Ich möchte einen Gegenstand nach links schweben lassen und die anderen rechts festhalten.

Beispiel:

<nav>
  <ul class="primary-nav">
    <li><a href="#" id="item1">ListItem1</a></li>
    <li><a href="#" id="item2">ListItem2</a></li>
    <li><a href="#" id="item3">ListItem3</a></li>
    <li><a href="#" id="item4">ListItem4</a></li>
  </ul>
</nav> 

Problem

Normalerweise beinhalten Antworten nur schwebende Elemente links und rechts, aber angeblich ist es in Flexbox schlecht, Floats zu verwenden. Ich habe darüber nachgedacht, justify-content und flex-start und flex-end zu verwenden, aber das funktioniert nicht so gut.

Ich habe versucht, Flex-Start auf das erste Element und dann Flex-End auf die anderen anzuwenden, aber das hat nicht so gut funktioniert.

Wie so:

.primary-nav #item1 {
  justify-content: flex-start;
}

.primary-nav #item2 {
  justify-content: flex-end;
}

.primary-nav #item3 {
   justify-content: flex-end; 
}

.primary-nav #item4 {
    justify-content: flex-end;    
}

Lob und Dank an alle, die Flexbox-Kenntnisse haben und mir helfen können, den richtigen Weg zu zeigen, wie man mit dieser Situation umgeht. 🙂

Wenn Sie nur ein Element links und alle anderen rechts haben möchten, ist die einfachste Lösung die Verwendung justify-content:flex-end auf dem übergeordneten Element, um alle Elemente nach rechts zu verschieben und dann hinzuzufügen margin-right:auto zu dem Element, das Sie auf der linken Seite haben möchten

.primary-nav {
    display:-webkit-flex;
    display:flex;
    list-style-type:none;
    padding:0;
    justify-content:flex-end;
}

.left {
    margin-right:auto;
}
<nav>
  <ul class="primary-nav">
    <li class="left"><a href="#">ListItem1</a></li>
    <li class="right"><a href="#">ListItem2</a></li>
    <li class="right"><a href="#">ListItem3</a></li>
    <li class="right"><a href="#">ListItem4</a></li>
  </ul>
</nav> 

  • Super das sieht gut aus! Wenn wir es auf 2 Elemente erweitern, die nach links schweben, ist die Lösung viel kniffliger?

    – Nick Pineda

    31. Mai 2015 um 4:55 Uhr

  • Dies funktioniert nicht im IE v10. Versuchen Sie, die Linie zu entfernen justify-content:flex-end;es funktioniert dann in allen Browsern.

    – Paskins Loe

    9. Mai 2016 um 8:30 Uhr

  • Dies funktioniert nur in der bequemen Situation, in der Sie nur ein einziges Element am anderen Ende haben

    – vsync

    12. Oktober 2016 um 15:46 Uhr

  • @vsync Wenn Sie mit “Fernende” auf der linken Seite meinen, haben Sie absolut Recht. Das ist auch das allererste, was ich in meiner Antwort erwähne. Wenn Sie etwas anderes meinen, das ich verpasst habe: Bitte erklären Sie es, damit ich meine Antwort aktualisieren kann.

    – mmbrutto

    17. Oktober 2016 um 8:43 Uhr

Margin-Hacks oder Pseudo-Elemente sind nicht erforderlich.

Erstellen Sie einfach eine Unterteilung in Ihrem Flex-Container und lassen Sie den Flex-Container durch Leerzeichen rechtfertigen.

Innerhalb der ersten Abteilung platzierst du die Gegenstände, die links sein werden, und innerhalb der zweiten Abteilung platzierst du die Gegenstände, die rechts sein werden.

nav.menu{
    display: flex;
    justify-content: space-between;
}
nav.menu ul{
    margin: 0;
    padding: 0;
    list-style: none;
}
nav.menu ul li{
    display: inline-block;
}
<nav class="menu">
    <ul class="menu-left">
        <li><a href="#">HOME</a></li>
        <li><a href="#">SERVICES</a></li>
    </ul>
    <ul class="menu-right">
        <li><a href="#">MEMBERS</a></li>
        <li><a href="#">CONTACT</a></li>
        <li><a href="#">PROFILE</a></li>
    </ul>
</nav>

  • Hinzufügen width: 100%; zu nav.menu{.. wenn es bei dir nicht funktioniert (ich verwende <nav><div class="left"><a item1>..</div><div class="right"><a .item3>..</div></nav> Anstatt von <ul><li>...)

    – Toni

    4. März 2021 um 20:45 Uhr


Sie können ein Pseudo-Element an der richtigen Stelle einfügen und es so wachsen lassen, dass es den verfügbaren Platz ausfüllt.

.primary-nav::after {
  content: '';
  flex-grow: 1;
  order: 0;
}
.right {
  order: 1;
}

.primary-nav {
  display: flex;
  list-style-type: none;
  padding: 0;
}
.primary-nav::after {
  content: '';
  flex-grow: 1;
  order: 0;
}
.right {
  order: 1;
}
.left, .right {
  border: 1px solid;
  padding: 0 5px;
}
<ul class="primary-nav">
  <li class="left">Left 1</li>
  <li class="right">Right 1</li>
  <li class="right">Right 2</li>
  <li class="right">Right 3</li>
</ul>
<ul class="primary-nav">
  <li class="left">Left 1</li>
  <li class="left">Left 2</li>
  <li class="right">Right 1</li>
  <li class="right">Right 2</li>
</ul>
<ul class="primary-nav">
  <li class="left">Left 1</li>
  <li class="left">Left 2</li>
  <li class="left">Left 3</li>
  <li class="right">Right 1</li>
</ul>
<ul class="primary-nav">
  <li class="left">Left 1</li>
  <li class="right">Right 1</li>
  <li class="left">Left 2</li>
  <li class="right">Right 2</li>
  <li class="left">Left 3</li>
  <li class="right">Right 3</li>
</ul>

  • Dies sollte die akzeptierte Antwort sein. Funktioniert perfekt! Danke Oriol.

    – Julien Le Coupanec

    1. Juni 2017 um 14:23 Uhr

Hier ist eine CSS-prägnantere Form der Lösung von mmgross:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html><head><title></title>
<style type="text/css">
.container {
    display:flex;
    list-style-type:none;
    padding:0;
}

.container > li:first-child {
    margin-right:auto;
}

td { border:1px black solid } /* for debug */
</style>
</head>
<body>
<table>
<tr><td colspan=2>
  <ul class="container">
    <li>leftitem</li>
    <li>rightitem</li>
  </ul>
<tr><td>otherotherotherother<td>otherotherotherother
</table>

nachgeben:

Geben Sie hier die Bildbeschreibung ein

Geige: https://jsfiddle.net/hbszf61x/ . Ignorieren das Rote – das ist wegen ein JSfiddle-Bug. Der Code ist gültig http://i.imgur.com/IVx6tET.png

1176380cookie-checkFlexbox – Blocksatz links und rechts auf derselben Zeile

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy