Позволить встроенным блочным элементам растягиваться и сжиматься и складываться, когда видовые экраны сжимаются

Учитывая следующий код, я хотел бы найти способ, чтобы серия элементов встроенного блока растягивала всю ширину родительского элемента при укладке поверх друг друга по мере обертывания строки.

<div id="parent">
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
</div>

Пример

Если все дети имеют такую ​​же минимальную ширину, я хочу, чтобы это создало эффект сетки. Например, на больших экранах дети могут складывать 5 до тех пор, пока они не перевернутся на вторую строку. Я бы хотел, чтобы все были 20% (1/5) доступной ширины. По мере того, как экран сжимается, пятый и десятый предметы обертываются, оставляя два ряда из 4 предметов и третий ряд из 2 предметов. Теперь я хотел бы, чтобы все дети растянулись на 25% (1/4) доступной ширины, за исключением последней строки из двух детей. Они должны составлять 50% каждый.

Попытки

Я пробовал плавать с детьми, делая их встроенными блоками, и я экспериментировал с flex-box, но ни один из них не дает мне результат, который я желаю. Прямые блоки стали самыми близкими, позволяя им складываться так же, как с уменьшением ширины родителя, но я не могу добиться растяжения.

Ограничения

Я бы предпочел не использовать медиа-запросы, так как тогда мне нужно было бы писать точные точки останова для этого примера, а затем изменить их все, если что-то изменится в макете сайта. Я бы хотел найти более органичный способ решить эту проблему.

Javascript отсутствует. Я хочу найти способ сделать это с помощью только CSS.

Ответы

Ответ 1

Большое спасибо Chris Coyier и CSS Tricks. Flexbox действительно является ответом. Вместо копирования и вставки его решения, здесь ссылка на его Pen: http://codepen.io/chriscoyier/pen/yCeax. Если вас интересует его вся эта мысль, вот сообщение в блоге: http://css-tricks.com/filling-space-last-row-flexbox/

Здесь фактическое решение, на всякий случай, если CodePen уйдет.

HTML

<button id="add">Add Child</button>

<div id="parent">
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
</div>

CSS

* {
  box-sizing: border-box;  
}

#parent {
  display: flex;
  flex-wrap: wrap;
}

.child {
  height: 50px;
  background: red;
  flex: 1;
  min-width: 25%;
  border: 5px solid white;
}

@media (max-width: 700px) {
  .child {
    min-width: 33.33%; 
  }
}

@media (max-width: 400px) {
  .child {
    min-width: 50%; 
  }
}

JQuery

$("#add").on("click", function() {
  $("#parent").append("<div class='child' />");
});