Поместите последний гибкий элемент в конец контейнера

97

Этот вопрос касается браузера с полной поддержкой css3, включая flexbox.

У меня есть гибкий контейнер с некоторыми элементами. Все они оправданы для гибкого начала, но я хочу, чтобы последний .end элемент был оправдан для гибкого конца. Есть ли хороший способ сделать это, не изменяя HTML и не прибегая к абсолютному позиционированию?

.container {
  display: flex;
  flex-direction: column;
  outline: 1px solid green;
  min-height: 400px;
  width: 100px;
  justify-content: flex-start;
}
p {
  height: 50px;
  background-color: blue;
  margin: 5px;
}
<div class="container">
  <p></p>
  <p></p>
  <p></p>
  <p class="end"></p>
</div>

Джордж Мауэр
источник
2
Да. См. autoИллюстрации на полях здесь: stackoverflow.com/a/33856609/3597276
Майкл Бенджамин

Ответы:

204

Модуль гибкой компоновки коробки - 8.1. Выравнивание с автоматическими полями

Автоматические поля на гибких элементах имеют эффект, очень похожий на автоматические поля в потоке блоков:

  • При расчетах гибких оснований и гибких длин автоматические поля обрабатываются как 0.

  • Перед выравниванием через justify-contentи align-selfлюбое положительное свободное пространство распределяется по автоматическим полям в этом измерении.

Поэтому вы можете использовать margin-top: autoдля распределения пространства между другими элементами и последним элементом.

Это разместит последний элемент внизу.

p:last-of-type {
  margin-top: auto;
}

вертикальный пример


Точно так же вы можете использовать margin-left: autoили margin-right: autoдля того же выравнивания по горизонтали.

p:last-of-type {
  margin-left: auto;
}

горизонтальный пример

Джош Крозье
источник
1
ах отлично, не могу поверить, что я это пропустил! Особенно неловко, поскольку я полностью знаю об уловке с использованием-margin-auto-to-center-вертикально и использую его постоянно
Джордж Мауэр
1
@ j08691 У меня нет формального объяснения того, почему это работает, но это похоже на то, как вы можете использовать margin: 0 autoдля горизонтального центрирования. Элементы Flexbox соблюдают поля, и я считаю, что это margin: autoпозволит позиционировать элемент с максимально возможным расстоянием между соседними элементами . См .: w3.org/TR/css-flexbox-1/#auto-margins
Джош Крозье
2
@ jo8691, если я не ошибаюсь, margin: autoна гибком элементе указывает ему создать как можно больше места в этом направлении.
Джордж Мауэр
1
В спецификации сказано Prior to alignment via justify-content and align-self, any positive free space is distributed to auto margins in that dimension.
Джордж Мауэр
Я пытаюсь узнать больше о flexbox, поэтому было бы здорово увидеть ссылку, описывающую это поведение. В частности, это также предназначено, а не является причудой или побочным эффектом.
j08691
60

Этот принцип flexbox также работает по горизонтали

Во время расчетов гибких оснований и гибких длин автоматические поля обрабатываются как 0.
Перед выравниванием с помощью justify-content и align-self любое положительное свободное пространство распределяется по автоматическим полям в этом измерении.

Установка автоматического левого поля для последнего элемента сделает всю работу.

.last-item {
  margin-left: auto;
}

Пример кода:

.container {
  display: flex;
  width: 400px;
  outline: 1px solid black;
}

p {
  height: 50px;
  width: 50px;
  margin: 5px;
  background-color: blue;
}

.last-item {
  margin-left: auto;
}
<div class="container">
  <p></p>
  <p></p>
  <p></p>
  <p class="last-item"></p>
</div>

Codepen Snippet

Это может быть очень полезно для нижних колонтитулов рабочего стола.

Как Envato сделал здесь с логотипом компании.

Codepen Snippet

Дэвид Бен Дахан
источник
3
Не знаю, почему это действительно работает, но это помогло мне в проекте.
Louis345
4
Что, если мне нужно, чтобы все элементы были в центре, а последний - справа?
Illorian