Горизонтальный центр сгибает элемент между двумя предметами изгиба различной ширины
Скажем, у меня есть 3 divs, отображаемых по горизонтали с помощью flexbox
:
| |-div1-| |-center-div-| |-wider-div-| |
И я хочу, чтобы центр div был выровнен к середине родителя. Как я могу это сделать? justify-content
будет центрировать все 3 из div на основе суммы всех их ширины, и применение align-self: center
к среднему div ничего не делает, потому что свойство align управляет позиционированием на другой оси.
Есть ли отзывчивое решение CSS, или мне нужно прибегнуть к jQuery?
ul {
display: flex;
justify-content: center;
width: 100%;
background-color: purple;
}
li {
background-color: red;
border: 5px solid blue;
list-style: none;
}
<ul>
<li><a href = "#">short</a></li>
<li><a href = "#">want center</a></li>
<li><a href = "#">loooooooooooooooooong</a></li>
</ul>
Ответы
Ответ 1
Вы можете установить первый и последний li
для роста flex: 1
и установить a
как встроенный блок и выравнивание текста 1/2/3 li
как правое/центральное/левое.
jsfiddle
ul {
display: flex;
justify-content: center;
width: 100%;
background-color: purple;
list-style: none;
padding: 0;
}
li:nth-child(1) {
text-align: right;
flex: 1;
}
li:nth-child(2) {
text-align: center;
}
li:nth-child(3) {
text-align: left;
flex: 1;
}
li a {
display: inline-block;
background-color: red;
border: 5px solid blue;
}
<ul>
<li><a href="#">short</a></li>
<li><a href="#">want center</a></li>
<li><a href="#">loooooooooooooooooong</a></li>
</ul>
Ответ 2
Вы можете использовать абсолютное позиционирование для вывода нецентральных элементов вне потока, чтобы они не влияли на центрирование.
ul {
display: flex;
justify-content: center;
background-color: purple;
padding: 0;
list-style: none;
}
li {
position: relative;
}
li > a {
display: block;
background-color: red;
border: 5px solid blue;
}
li:first-child > a {
position: absolute;
right: 0;
}
li:last-child > a {
position: absolute;
left: 0;
}
<ul>
<li><a href="#">short</a></li>
<li><a href="#">want center</a></li>
<li><a href="#">loooooooooooooooooong</a></li>
</ul>
Ответ 3
Здесь используется метод flex, который идеально центрирует средний элемент с помощью:
- no jQuery
- Абсолютное позиционирование
- никаких изменений в HTML
ul {
display: flex;
padding: 0;
}
li {
display: flex;
justify-content: center;
flex: 1;
background-color: red;
border: 2px solid blue;
}
li:first-child > a {
margin-right: auto;
}
li:last-child > a {
margin-left: auto;
}
<ul>
<li>
<a href="#">short</a>
</li>
<li>
<a href="#">want center</a>
</li>
<li>
<a href="#">loooooooooooooooooong</a>
</li>
</ul>
Ответ 4
Я использую контейнер flex с тремя ящиками внутри, два из которых - слева и справа - имеют одинаковую ширину и сами являются гибкими контейнерами, обертывая содержимое произвольной ширины:
[(a box) ] [centered content] [ (a longer box)]
left wrapper right wrapper
Вот код:
<div class="test">
<div class="wrapper left">
<div class="box one"></div>
</div>
<div class="box two"></div>
<div class="wrapper right">
<div class="box three"></div>
</div>
</div>
CSS
.test {
height: 50px;
display: flex;
justify-content: center;
}
.wrapper {
width: 33%;
display: flex;
}
.wrapper.left {
justify-content: flex-end;
}
.box {
border: 1px solid red;
}
.one {
width: 100px;
}
.two {
width: 50px;
}
.three {
width: 150px;
}