Выравнивание элементов слева, по центру и справа во 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>
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>
Если вы готовы изменить свой 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, которое выравнивает правый и левый контейнеры при правильном центрировании среднего контейнера.