Подтвердить что ты не робот

Flexbox - выравнивание влево и вправо на одной строке

Ситуация:

У меня есть простая панель навигации, которую я создаю в Flexbox. Я хочу поместить один элемент влево и держать остальных привязанными вправо.

Пример:

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

Проблема

Обычно ответы включают только плавающие элементы слева и справа, но предположительно в Flexbox плохо использовать Floats. Я думал об использовании justify-content и использовании flex-start и flex-end, но это не слишком хорошо работает.

Я попытался применить flex-start к первому элементу, а затем перейти к другим, но это не сработало.

Как и так:

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

Хвалите и благодарите любого, кто обладает навыками Flexbox, и может помочь показать мне правильный способ справиться с этой ситуацией.:)

4b9b3361

Ответ 1

Если вы хотите иметь только один элемент слева, а все остальные справа, самое простое решение - использовать justify-content:flex-end в родительском элементе для перемещения всех элементов вправо, а затем добавить margin-right:auto в элемент, который вы хотите иметь слева

.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> 

Ответ 2

Вы можете вставить псевдоэлемент в нужное место и заставить его расти, чтобы заполнить доступное пространство.

.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>

Ответ 3

Нет необходимости в маргинальных хаках или псевдоэлементах.

Просто создайте подразделение в контейнере Flex и сделайте контейнер flex оправданным пробелом между ними.

Внутри первого деления вы поместите элементы, которые будут слева, а во втором разделе вы поместите элементы, которые будут справа.

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>

Ответ 4

Здесь более CSS-сжатая форма решения 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>

получая:

введите описание изображения здесь

Fiddle: https://jsfiddle.net/hbszf61x/. Игнорировать красный - это связано с ошибка JSfiddle. Код действителен http://i.imgur.com/IVx6tET.png