Трехколонный HTML-флекс: как установить средний, чтобы получить все оставшееся пространство?

Скажем, у меня есть простой трехколоночный макет, созданный с помощью display: flex; (demo). В левом и правом столбцах у меня есть изображения с указанной шириной (100px каждый). В центральной колонке у меня есть основная область содержимого. Эта область имеет изображение с высоким разрешением:

<div id="main-container">

    <div id="left-content">
        <div><img src="http://agevoluzione.com/wp-content/uploads/2014/07/Work-in-progress-1024x603.png"></div>
        <div><img src="http://agevoluzione.com/wp-content/uploads/2014/07/Work-in-progress-1024x603.png"></div>
        <div><img src="http://agevoluzione.com/wp-content/uploads/2014/07/Work-in-progress-1024x603.png"></div>
        <div><img src="http://agevoluzione.com/wp-content/uploads/2014/07/Work-in-progress-1024x603.png"></div>
    </div>

    <div id="center-content">
        <div><img src="https://farm6.staticflickr.com/5560/14080568109_9f33dc7964_o.jpg"></div>
    </div>

    <div id="right-content">
        <div><img src="http://agevoluzione.com/wp-content/uploads/2014/07/Work-in-progress-1024x603.png"></div>
        <div><img src="http://agevoluzione.com/wp-content/uploads/2014/07/Work-in-progress-1024x603.png"></div>
        <div><img src="http://agevoluzione.com/wp-content/uploads/2014/07/Work-in-progress-1024x603.png"></div>
        <div><img src="http://agevoluzione.com/wp-content/uploads/2014/07/Work-in-progress-1024x603.png"></div>
    </div>
    </div>

</div>

Мне нужно настроить CSS так, чтобы ширина центрального столбца была, самое большее, 100% доступного пространства между боковыми столбцами (другими словами, он всегда должен быть таким: windowSize-column1-column2). Если окно сжимается, мне нужен центральный столбец (и его изображение) для его сжатия.

#main-container
    {
    display: flex;
    justify-content: space-between;
    align-items: center;
    }

#left-content,
#right-content
    {
    width: 102px;

    border-style: solid;
    border-width: 2px;
    border-color: magenta;
    }

#left-content img,
#right-content img
    {
    width: 100px;
    }

#center-content
    {
    }

#center-content img
    {
    max-width: 100%;
    height: auto;
    }

Что мне не хватает?

Ответ 1

Правильный способ сделать это с помощью flex. Установите для flex 1 1 auto для среднего столбца и 0 0 auto для боковых столбцов. Это позволяет боковым столбцам всегда иметь указанную ширину (или ширину содержимого, если не указано), а средний столбец занимает оставшееся пространство (соответственно увеличивается/уменьшается). Вот CSS (демо):

#main-container {
    display: flex;
    justify-content: space-between;
    align-items: center;
}
#center-content {
    flex:1 1 auto; /* Lets middle column shrink/grow to available width */
}
#left-content,
#right-content {
    flex:0 0 auto; /* Forces side columns to stay same width */
    width:100px; /* Sets the width of side columns */
}
img {
    max-width:100%; /* Shrinks images to fit container */
}

Ответ 3

Если содержимое раздела автоматического размера в flexbox больше доступной области, которую оно должно было вместить, браузеры (по крайней мере, Chrome и Firefox) НЕ будут учитывать flex:1 1 auto; и столбец/строка будет занимать достаточно места для содержимого, а не целевого контейнера. В результате общая ширина/высота всех столбцов/строк во flexbox будет более 100%.

Если flex:1 1 auto; связан с некоторым явным размером, например width: 10%; , тогда столбец будет правильно подобран по размеру доступного пространства, а 10% будут просто проигнорированы. Размер в px работает одинаково хорошо.

Что-то смешное происходит с overflow: hidden; используется вместо width: 10%; , Результат в Firefox идентичен, но Chrome вырезает содержимое на противоположной оси. Даже если вы установите overflow-y: hidden; Chrome отбраковывает содержимое с правой стороны (ось x).

Вот пример:

#center-content {
  width: 100%;
  height: 10%;
  flex: 1 1 auto;
}

Ответ 4

Существует более простой способ добиться того, что вы просите, и для этого требуется только одна строка CSS (flex-grow: 1).

.main-container {
  display: flex;
  min-height: 100vh;
}

.main-container > div {
  background-color: gray;
}

#center-content {
  flex-grow: 1;
  background-color: red;
}
<div class="main-container">    
  <div id="left-content">
    left
  </div>

  <div id="center-content">
  </div>

  <div id="right-content">
    right
  </div>
</div>  

Ответ 5

#center-content
    {
        width:100%;
    }