Flexbox: как получить divs для заполнения 100% ширины контейнера без упаковки?

Сейчас я обновляю старую модель сетки на основе inline-block, которую я создаю для нового Flexbox, созданного мной. Все отлично работало, кроме одной маленькой хватки, которая стала немного разбойником:

У меня есть куча управляемых CSS слайдеров; поэтому существует содержащая оболочка со 100% шириной, а внутри - еще один div: ее ширина также равна 100%, но ее white-space устанавливается на nowrap. Используя inline-block, это означало, что внутренние div (которые также были установлены на 100% ширины) не были бы связаны ограничениями их родителей и завертываются на следующую строку - они просто будут выходить из коробки. Это именно то, чего я хотел. Тем не менее, я не могу заставить это работать вообще с flexbox. Для справки, здесь изображение:

Flexbox problem

И для справки, здесь jsFiddle того, что работает с встроенным блоком: http://jsfiddle.net/5zzvqx4b/

... и не работает с Flexbox: http://jsfiddle.net/5zzvqx4b/1/

Я пробовал все варианты с flex, flex-basis, flex-wrap, flex-grow и т.д., но для жизни меня я не могу заставить это работать.

Обратите внимание, что я могу заставить его делать то, что я хочу, взломанным, негибким образом, установив ширину .boxcontainer в 200%. Это работает для этого единственного примера, но в некоторых случаях я не буду заранее знать, сколько ящиков будет там, и я бы предпочел не прибегать к встроенному стилю для каждого элемента, если это возможно.

Ответы

Ответ 1

Чтобы предотвратить сжатие элементов flex, установите коэффициент сжатия flex на 0:

Фактор flex определяет, насколько flex item будет сжимается относительно остальной части flex items в flex контейнер, когда распределяется отрицательное свободное пространство. Когда опущено, это установлен на 1.

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

* {
  box-sizing: border-box;
}
.wrapper {
  width: 200px;
  background-color: #EEEEEE;
  border: 2px solid #DDDDDD;
  padding: 1rem;
}
.boxcontainer {
  position: relative;
  left: 0;
  border: 2px solid #BDC3C7;
  transition: all 0.4s ease;
  display: flex;
}
.boxcontainer .box {
  width: 100%;
  padding: 1rem;
  flex-shrink: 0;
}
.boxcontainer .box:first-child {
  background-color: #F47983;
}
.boxcontainer .box:nth-child(2) {
  background-color: #FABCC1;
}
#slidetrigger:checked ~ .wrapper .boxcontainer {
  left: -100%;
}
#overflowtrigger:checked ~ .wrapper {
  overflow: hidden;
}
<input type="checkbox" id="overflowtrigger" />
<label for="overflowtrigger">Hide overflow</label><br />
<input type="checkbox" id="slidetrigger" />
<label for="slidetrigger">Slide!</label>
<div class="wrapper">
  <div class="boxcontainer">
    <div class="box">
      First bunch of content.
    </div>
    <div class="box">
      Second load  of content.
    </div>
  </div>
</div>

Ответ 2

Вы можете использовать свойство сокращенного flex и установить его на

flex: 0 0 100%;

Это flex-grow, flex-shrink и flex-basis в одной строке. Фрикционная усадка была описана выше, гибкое растение - противоположное, а гибкая основа - размер контейнера.