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.