Розмістіть останній гнучкий предмет у кінці контейнера


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
Майкл Бенджамін,

Відповіді:


205

Модуль гнучкого розміщення коробки - 8.1. Вирівнювання за автоматичними полями

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

  • Під час розрахунків гнучких основ та гнучких довжин, автоматичні поля розглядаються як 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
ах ідеально, не можу повірити, що я це пропустив! Особливо ніяково, оскільки я цілком знаю про фокус using-margin-auto-to-center-vertical і використовую його весь час
Джордж Мауер

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.
Перед вирівнюванням за допомогою вирівнювання-вмісту та вирівнювання-самостійно, будь-який позитивний вільний простір розподіляється до автоматичних полів у цьому вимірі.

Встановлення автоматичного лівого поля для останнього елемента зробить свою роботу.

.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

Це може бути дуже корисно для настільних колонтитулів.

Як це робив Envato з логотипом компанії.

Фрагмент Codepen


3
Не впевнений, чому це насправді працює, але це допомогло мені у проекті.
Louis345

4
Що робити, якщо мені потрібно, щоб усі предмети були в центрі, а останні - з правого боку?
Іллоріан,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.