Flexbox: як змусити divs заповнити 100% ширини контейнера без загортання?


82

Я в процесі оновлення старої inline-blockмоделі сітки, яку я маю, до нової моделі Flexbox, яку я створив. Все працювало нормально, крім однієї маленької зачепки, яка стала дещо зламаною:

У мене є купа повзунків, керованих CSS; отже, там є обгортка, що містить ширину 100%, а всередині інший div: її ширина також 100%, але для неї white-spaceвстановлено значення nowrap. Використовуючи inline-block, це означало, що внутрішні div (які також були встановлені на 100% ширини) не будуть обмежені обмеженнями батьків і переносяться на наступний рядок - вони просто продовжуватимуть витікати з коробки. Це саме те, що я хотів. Однак я не можу змусити це взагалі працювати з flexbox. Для довідки, ось зображення:

Проблема Flexbox

І для довідки, ось jsFiddle про те, що працює з вбудованим блоком: http://jsfiddle.net/5zzvqx4b/

... і не працює з Flexbox: http://jsfiddle.net/5zzvqx4b/1/

Я пробував всі види варіацій з flex, flex-basis, flex-wrap, flex-growі т.д. , але і для життя мене я не можу отримати цю роботу.

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


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

1
@sdcr: Через інші вимоги проекту, на які, приблизно ~ 20000 рядків коду, можливо піде трохи часу.
indextwo

1
ой, добре тільки , щоб сказати , що деякі з гнучких властивостей , встановлених там навіть не потрібно, наприклад flex-direction: row;, justify-content: flex-start;, align-items: flex-start;ті правила по замовчуванню, якщо ви не перезаписувати їх. є велике керівництво тут .
Наліпки

@sdcr: Дякую - у цьому прикладі це дійсно дуже багатослівно, але лише тому, що я скопіював-вставив його безпосередньо зі своєї таблиці стилів, в якій є багато умов та підкласів тощо, тому властивості встановлюються явно . Я ще недостатньо добре знаю флексбокс, щоб списати його з маківки!
indextwo

тоді розуміє, підтримка браузера для flex - це IE10 + з префіксом -ms *.
Наліпки

Відповіді:


83

Щоб запобігти усадці гнучких елементів, встановіть коефіцієнт гнучкої усадки на 0:

Коефіцієнт гнучкої усадки визначає, наскільки гнучкий елемент зменшиться відносно решти гнучких елементів у гнучкому контейнері при розподілі негативного вільного простору. Якщо опущено, для нього встановлюється значення 1.

.boxcontainer .box {
  flex-shrink: 0;
}


2
О, добрий пане, дякую . Я насправді проігнорував flex-shrinkвластивість, тому що прочитані мною описи не здавалися актуальними. Вважайте себе прийнятим через ... 6 хвилин!
indextwo

50

Ви можете використовувати скорочену властивість flex і встановити для нього значення

flex: 0 0 100%;

Ось flex-grow, flex-shrinkі flex-basisв одному рядку. Флексова усадка була описана вище, флекс ріст - це навпаки, а основа флексу - розмір контейнера.


Чудово! Супер зручно знати.
Hartley,

25

У моєму випадку просто використання flex-shrink: 0не спрацювало. Але додавання flex-grow: 1до цього спрацювало.

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