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

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

У меня есть гибкий контейнер с некоторыми элементами. Они все оправданы для начала .end но я хочу, чтобы последний элемент .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>

Ответ 1

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

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

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

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

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

.end {
  margin-top: auto;
}

Вы также можете избежать использования класса и использовать псевдокласс класса :last-of-type/last-child.

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

.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;
}
.end {
  margin-top: auto;
}
<div class="container">
  <p></p>
  <p></p>
  <p></p>
  <p class="end"></p>
</div>

Ответ 2

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

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

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

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

C8Mm4.png

Пример кода:

.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>