Горизонтальный центр сгибает элемент между двумя предметами изгиба различной ширины

Скажем, у меня есть 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;
}