CSS вирівняє один елемент прямо за допомогою флекси


212

https://jsfiddle.net/vhem8scs/

Чи можливо два елементи вирівняти ліворуч і один елемент вирівняти праворуч за допомогою флекси? Посилання показує це більш чітко. Останній приклад - те, чого я хочу досягти.

У flexbox у мене є один блок коду. З float у мене є чотири блоки коду. Це одна з причин, чому я віддаю перевагу флексбоксу.

HTML

<div class="wrap">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</div>

<!-- DESIRED RESULT -->

<div class="result">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</div>

CSS

.wrap {
  display: flex;
  background: #ccc;
  width: 100%;
  justify-content: space-between;
}

.result {
  background: #ccc;
  margin-top: 20px;
}

.result:after {
  content: '';
  display: table;
  clear: both;
}

.result div {
  float: left;
}
.result div:last-child {
  float: right;
}

Відповіді:


524

Щоб вирівняти одну гнучку дитину праворуч, встановіть їїmargin-left: auto;

З гнучких характеристик :

Одне використання автоматичних полів на головній осі - це розділення гнучких елементів на окремі "групи". Наступний приклад показує, як використовувати це для відтворення загального шаблону інтерфейсу користувача - однієї смуги дій з деякими вирівнюваннями зліва та іншими вирівнюваннями праворуч.

.wrap div:last-child {
  margin-left: auto;
}

Оновлена ​​скрипка

Примітка:

Ви можете домогтися аналогічного ефекту, встановивши флекс-ріст: 1 на середньому елементі згинання (або стенограмі flex:1), який підштовхує останній елемент до кінця праворуч. ( Демо )

Очевидною відмінністю є те, що середній елемент стає більшим, ніж може знадобитися. Додайте рамку до гнучких елементів, щоб побачити різницю.

Демо


Дякую! Я спробував ще одну річ, яка спрацювала, перш ніж прочитати це. Потрібно було встановити flex-зростання: 1 на елемент, який повинен штовхати інший. Це також працювало. Чи знаєте ви, хто з них кращий і чому?
Jens Törnell

2
Чудова відповідь. Таким чином, запас не займає зайвого місця, а flex: 1 робить. Класно!
Jens Törnell

4
@ JensTörnell, autoполе використовує порожнє місце в контейнері для розділення гнучких елементів. flex-grow/ flexВластивість приймає це порожній простір, дає його гнучкий елемент, який розширюється від цієї суми. Як згадував Даніелд, останній метод збільшує гнучку деталь ДВА, що ви, можливо, не хочете.
Майкл Бенджамін

12
Не всі герої носять накидки.
Том

2
@ user1063287 для вирівнювання декількох елементів праворуч просто застосуйте поле зліва: автоматично на перший елемент, який потрібно вирівняти праворуч. Тож скажімо, що ви хочете, щоб останні 4 елементи вирівняли праворуч, зробіть це так: div:nth-last-child(4) { margin-left: auto } codepen.io/danield770/pen/ERyoar
Danield

37

Для короткої, чистої опції флешбоку згрупуйте елементи, що вирівнюються вліво, і елементи, що вирівнюються вправо:

<div class="wrap">
  <div>
    <span>One</span>
    <span>Two</span>
  </div>
  <div>Three</div>
</div>

і використовувати space-between:

.wrap {
  display: flex;
  background: #ccc;
  justify-content: space-between;
}

Таким чином ви можете згрупувати кілька елементів праворуч (або лише один).

https://jsfiddle.net/c9mkewwv/3/


Це працює, але якщо ви не поміняєте елементи всередині кожної групи, щоб вони були, display: inline;або display: inline-block;вони будуть складені замість усіх у рядку, як, наприклад, флексбокс.
Жниварка DIMM

@TheDIMMReaper Я не впевнений, що бачу проблему. Чи можете ви розширитись?
сплеск

Я просто маю на увазі, як ви змінили теги, негайно обгортаючи Oneі Twoз якихdiv s на spans - якщо вони ще були, display: block;вони перетікали б в окремі рядки. Оскільки в ОР спочатку були divs, я просто хотів зазначити, що просто помістити їх всередину іншого divне вийде, не змінивши відображення оригінальних тегів.
Жниварка DIMM

1
Так, оскільки елементи тепер знижуються на рівень, display: flexце вже не впливає на їх макет. Якщо ви хочете використовувати div, так, inlineабо inline-blockбуде працювати. Але також, очевидно, flexоскільки ми використовуємо його за замовчуванням flex-direction: rowз батьківським дівом вже. колишній jsfiddle.net/ynbb5964/2
сплеск

Дякую, я спробував align-self: flex-end, але чому це не працює?
Ананд

3

Вирівняти деякі елементи (headerElement) у центрі та останній елемент праворуч (headerEnd).

.headerElement {
    margin-right: 5%;
    margin-left: 5%;
}
.headerEnd{
    margin-left: auto;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.