Изменение размера Flexbox и прокручиваемое переполнение

У меня есть контент, размер которого я изменяю, и я хочу иметь фиксированный заголовок, который не увеличивается/не сжимается и не является частью прокручиваемого контента. Содержимое ниже становится прокручиваемым, если места недостаточно.

Внешняя оболочка содержимого (flexGrowWrapper) имеет flex-grow: 1, а внутренняя оболочка имеет height: 100%; overflow-y: auto. Мысль здесь заключается в том, что flexGrowWrapper заполнит все оставшееся пространство внутри resize div, затем внутренняя оболочка займет всю высоту flexGrowWrapper, и если есть переполнение, она должна прокручиваться.

Происходит то, что flexGrowWrapper действительно увеличивается, чтобы заполнить область resize, но кажется, что его содержимое диктует его минимальную высоту.

Как я могу сделать так, чтобы flexGrowWrapper никогда не выходил за пределы resize высоты области?

$("button").click(function() {
	$(".resize").toggleClass("small");
});
.resize {
  height: 200px;
  display: flex;
  flex-direction: column;
  overflow-y: hidden;
  width: 300px;
}

.resize.small {
  height: 100px;
}

.heading {
  flex: 0 0 auto;
}

.flexGrowWrapper {
  border: 2px solid red;
  flex-grow: 1;
}

.wrapper {
  height: 100%;
  overflow-y: auto;
}

.content {
  display: flex;
  flex-direction: row;
  clear: both;
}
<button>
Resize
</button>
<div class = "resize">
  <div class = "heading">
  <label>Some heading that wont scroll</label>
  </div>
  <div class = "flexGrowWrapper">
    <div class = "wrapper">
      <div class = "content">
        content
      </div>
      <div class = "content">
        content
      </div>
      <div class = "content">
        content
      </div>
      <div class = "content">
        content
      </div>
      <div class = "content">
        content
      </div>
      <div class = "content">
        content
      </div>
      <div class = "content">
        content
      </div>
    </div>
  </div>
</div>
<div>
 Something else here
</div>

<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

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

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
0
1 730
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добавьте min-height: 0 к .flexGrowWrapper — см. демонстрацию ниже:

$("button").click(function() {
  $(".resize").toggleClass("small");
});
.resize {
  height: 200px;
  display: flex;
  flex-direction: column;
  overflow-y: hidden;
  width: 300px;
}

.resize.small {
  height: 100px;
}

.heading {
  flex: 0 0 auto;
}

.flexGrowWrapper {
  border: 2px solid red;
  flex-grow: 1;
  min-height: 0; /* ADDED */
}

.wrapper {
  height: 100%;
  overflow-y: auto;
}

.content {
  display: flex;
  flex-direction: row;
  clear: both;
}
<button>
Resize
</button>
<div class = "resize">
  <div class = "heading">
    <label>Some heading that wont scroll</label>
  </div>
  <div class = "flexGrowWrapper">
    <div class = "wrapper">
      <div class = "content">
        content
      </div>
      <div class = "content">
        content
      </div>
      <div class = "content">
        content
      </div>
      <div class = "content">
        content
      </div>
      <div class = "content">
        content
      </div>
      <div class = "content">
        content
      </div>
      <div class = "content">
        content
      </div>
    </div>
  </div>
</div>
<div>
  Something else here
</div>

<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Почему это работает

Обратите внимание, что это связано с тем, что для флексбокс столбца значение min-height по умолчанию равно auto (вдоль ось сгиба). Вы можете увидеть несколько примеров такого поведения ниже:

Другие вопросы по теме