Зробіть розділення залишків * горизонтальним * пробілом у флексі


203

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

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

Я думаю, я міг би залишити це так, як є, але це почувається неправильно - начебто має бути спосіб сказати:

правильний завжди однаковий; ти зліва - ти отримуєш усе, що залишилося

.ar-course-nav {
  cursor: pointer;
  padding: 8px 12px 8px 12px;
  border-radius: 8px;
}
.ar-course-nav:hover {
  background-color: rgba(0, 0, 0, 0.1);
}
<br/>
<br/>
<div class="ar-course-nav" style="display:flex; justify-content:space-between;">
  <div style="width:96%;">
    <div style="overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">
      <strong title="Course Name Which is Really Quite Long And Does Go On a Bit But Then When You Think it's Stopped it Keeps on Going for even longer!">
                Course Name Which is Really Quite Long And Does Go On a Bit But Then When You Think it's Stopped it Keeps on Going for even longer!
            </strong>
    </div>
    <div style="width:100%; display:flex; justify-content:space-between;">
      <div style="color:#555555; margin-right:8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;" title="A really really really really really really really really really really really long department name">
        A really really really really really really really really really really really long department name
      </div>
      <div style="color:#555555; text-align:right; white-space:nowrap;">
        Created: 21 September 2016
      </div>
    </div>
  </div>
  <div style="margin-left:8px;">
    <strong>&gt;</strong>
  </div>
</div>

Відповіді:


324

Використовуйте flex-growвластивість, щоб гнучкі елементи споживали вільний простір на головній осі .

Ця властивість максимально розширить елемент, пристосовуючи довжину до динамічних середовищ, таких як повторне розмір екрана або додавання / видалення інших елементів.

Типовий приклад є flex-grow: 1або, використовуючи скорочене властивість, flex: 1.

Отже, замість того, щоб бути width: 96%вашим дівом, використовуйте flex: 1.


Ти написав:

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

Розчавлення поділки фіксованої ширини пов'язане з іншим властивістю flex: flex-shrink

За замовчуванням встановлюються гнучкі елементи, flex-shrink: 1що дозволяє їм стискатися, щоб уникнути переповнення контейнера.

Щоб відключити цю функцію, використовуйте flex-shrink: 0.

Для отримання більш докладної інформації див В flex-shrinkфактор розділ у відповідь тут:


Дізнайтеся більше про вирівнювання згину уздовж головної осі тут:

Докладніше про вирівнювання згину вздовж поперечної осі тут:


1
У мене була така ж ситуація, і використання flex-grow: 1не мало таких самих ефектів, як flex: 1. Ви, можливо, знаєте, чому це інше? (Я
вирішив

4
З flex-grow: 1, flex-basisвластивість залишається на auto, його значення за замовчуванням. З flex: 1, flex-basisвластивість змінюється на 0. Дивіться моя відповідь тут для поглибленого огляду: stackoverflow.com/q/43520932/3597276 @WhGandalf
Michael Benjamin

flex-shrink був ключовим для мене :)
pixelearth

25

В основному я намагався отримати свій код, щоб середній розділ був у "рядку", щоб автоматично налаштувати вміст з обох сторін (у моєму випадку - роздільник пунктирних рядків). Як і запропоновано @Michael_B, ключ використовується display:flexв контейнері рядків і принаймні переконайтеся, що середній контейнер у рядку має flex-growзначення принаймні на 1 вище, ніж у зовнішніх контейнерів (якщо до зовнішніх контейнерів не flex-growзастосовуються властивості, середній контейнер потрібно лише 1 за flex-grow).

Ось малюнок того, що я намагався зробити, та зразок коду для того, як я це вирішив.

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

введіть тут опис зображення

.row {
  background: lightgray;
  height: 30px;
  width: 100%;
  display: flex;
  align-items:flex-end;
  margin-top:5px;
}
.left {
  background:lightblue;
}
.separator{
  flex-grow:1;
  border-bottom:dotted 2px black;
}
.right {
  background:coral;
}
<div class="row">
  <div class="left">Left</div>
  <div class="separator"></div>
  <div class="right">Right With Text</div>
</div>
<div class="row">
  <div class="left">Left With More Text</div>
  <div class="separator"></div>
  <div class="right">Right</div>
</div>
<div class="row">
  <div class="left">Left With Text</div>
  <div class="separator"></div>
  <div class="right">Right With More Text</div>
</div>

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