Выравнивание элементов слева, по центру и справа во flexbox

Я пытаюсь создать этот верхний колонтитул, используя flexbox.

заголовок

В основном я хотел бы центрировать <div class="header-title"> (Учреждение 1) на линии с 3 другими элементами, которые вы видите. (Учредитель, Ledere и Log UD), как вы видите на картинке.

.nav {
    background: #e1e1e1;
}
ol, ul {
    list-style: none;
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: flex-start;
}
.header-title {
  justify-content: center;
    align-self: center;
    display: flex;
}
.nav ul li.logout {
      margin-left: auto;
}
.nav ul li a {
    text-decoration: none;
    padding: 0px 20px;
    font-weight: 600;
}
<div class="nav mobilenav">
  <div class="header-title">
    Institution institution 1
  </div>
  <ul>
    <li><a href="/institutions/">Institutioner</a></li>
    <li>
      <a href="/leaders/">Ledere</a>
    </li>
    <li class="logout">
      <a class="button-dark" href="/user/logout">Log ud</a>
    </li>
  </ul>
</div>

Демо - JSFiddle

5 ответов

Решение

Используйте вложенные гибкие контейнеры и flex-grow: 1,

Это позволяет создавать три секции равной ширины на панели навигации.

Затем каждый раздел становится (вложенным) флекс-контейнером, который позволяет выровнять ссылки по вертикали и горизонтали, используя свойства флексинга.

Теперь левый и правый элементы прикреплены к краям контейнера, а средний элемент идеально отцентрирован (хотя левый и правый элементы имеют разную ширину).

.nav {
  display: flex;
  height: 50px;      /* optional; just for demo */
  background: white;
}

.links {
  flex: 1;          /* shorthand for: flex-grow: 1, flex-shrink: 1, flex-basis: 0 */
  display: flex;
  justify-content: flex-start;
  align-items: center;
  border: 1px dashed red;
}

.header-title {
  flex: 1;
  display: flex;
  justify-content: center;
  align-items: center;
  border: 1px dashed red;
}

.logout {
  flex: 1;
  display: flex;
  justify-content: flex-end;
  align-items: center;
  border: 1px dashed red;
}

.links a {
  margin: 0 5px;
  text-decoration: none;
}
<div class="nav mobilenav">

  <div class="links">
    <a href="/institutions/">Institutioner</a>
    <a href="/leaders/">Ledere</a>
  </div>

  <div class="header-title">Institution institution 1</div>

  <div class="logout"><a class="button-dark" href="/user/logout">Log ud</a></div>

</div>

jsFiddle

Использование justify-content: space-between; как это:

.container {
  display: flex;
  justify-content: space-between;
}
<div class="container">
  <div>A</div>
  <div>B</div>
  <div>C</div>
</div>

Css grid сделает это лучше, чем flexbox.

Если вы готовы изменить свой HTML, вы должны поместить все элементы в вашем заголовке на одном уровне в DOM.

Вот рабочий пример

.nav {
  background: #e1e1e1;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 60px;
}

.nav > div {
  min-width: 0;
  white-space: nowrap;
}

.header-title {
  flex-basis: 80%;
  text-align: center;
}

.nav div a {
  text-decoration: none;
  padding: 0px 20px;
  font-weight: 600;
}
<div class="nav mobilenav">

  <div><a href="/institutions/">Institutioner</a></div>

  <div><a href="/leaders/">Ledere</a></div>

  <div class="header-title">
    Institution institution 1
  </div>

  <div class="logout">
    <a class="button-dark" href="/user/logout">Log ud</a>
  </div>

</div>

Вот решение Flex, которое выравнивает правый и левый контейнеры при правильном центрировании среднего контейнера.

Другие вопросы по тегам