Проблема связана с элементами Flex, имеющими минимальную высоту / ширину (зависит от направления), равную содержимому.
Первый пример
Синий элемент вписывается в его родительский элемент, потому что по умолчанию он установлен на сжать, чтобы соответствовать flex-shrink:1;
Почему это важно? потому что это не единственный дочерний элемент.
overflow:auto
заставляет элемент игнорировать его содержимое, найдите ограничение по высоте и добавьте полосу прокрутки
Второй пример
Синий элемент вписывается внутрь зеленого элемента, как и ожидалось, но зеленый элемент не помещается внутри красного элемента, Почему?
зеленый элемент является гибким элементом поэтому все сказанное выше относится и к нему, но почему оно не сжимается?
Потому что ничто не говорит ему игнорировать его содержание.
p {
background: pink;
height: 9000px;
margin:0;
}
[green] {
min-height: 0; /* ignore content */
}
<html style="height:100%;font-size:35px;">
<body style="height:100%; margin:0;">
<div style="width:80%; height:100%; background:red; display:flex; flex-direction:column;">
1
<div green style="width:80%; height:100%; background:green; display:flex; flex-direction:column;">
2
<div style="width:50%; height:100%; background:blue; overflow:auto;">
<p>long content</p>
</div>
</div>
</div>
</body>
</html>
Если зеленый элемент игнорирует его содержимое, он сжимается, чтобы поместиться внутри красного элемента, а синий элемент последует.