Понимание гибкости, высоты и переполнения

У меня есть поведение, которое меня озадачивает. Код ниже — результат отладки более крупного приложения. Я знаю, что могу упростить это и заставить это работать. Однако мне хотелось бы понять и научиться.

Есть два прямоугольника (высота: 100 пикселей и высота: 400 пикселей), расположенные друг над другом в гибком поле столбца. Когда размер окна станет меньше 500 пикселей, браузер добавит полосу прокрутки. Хорошо. Но если он становится меньше 400 пикселей, в синем поле отображается полоса прокрутки.

Я ожидал либо полосу прокрутки тела, либо полосу прокрутки синего ящика, но не то и другое. Может ли кто-нибудь объяснить

HTML

*,
::before,
::after {
    box-sizing: inherit;
}

html,
body {
    margin: 0;
    width: 100%;
    height: 100%;
    box-sizing: border-box;
    /* overflow: visible; */
}

.full-size {
    width: 100%;
    height: 100%;
}

.container {
    display: flex;
    flex-direction: column;
}

.content {
    flex: 1;
}
<!DOCTYPE html>
<html lang = "en">

<head>
    <meta charset = "utf-8" />
    <title>Hi</title>
    <base href = "/" />
    <link rel = "stylesheet"
        href = "style.css" />
    <meta name = "viewport"
        content = "width=device-width, initial-scale=1" />
</head>

<body>
    <div class = "full-size container">
        <div style = "width:300px; height: 100px; background-color: green; flex-shrink: 0;">Upper content</div>
        <div class = "full-size content">
            <div class = "full-size"
                style = "overflow: auto; background-color: blue;">
                <div style = "width:300px; height: 400px; background-color: yellow;">Lower content</div>
            </div>
        </div>
    </div>
</body>

</html>
Улучшение производительности загрузки с помощью 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
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это связано с использованием каскада height: 100% до элемента content. Внутри вашего контейнера у вас есть элемент с высотой, равной 100px, и еще один с высотой, равной 100%. Логически это приведет к переполнению, но сработает эффект сжатия, и второй элемент станет меньше 100%.

Но на маленьком экране желтый прямоугольник вызовет другой эффект и предотвратит сжатие из-за конфигурации min-height по умолчанию (Почему гибкие элементы не уменьшаются за пределы размера содержимого?) и заблокирует ваш элемент в height: 100%, что вызовет тело - полоса прокрутки, а желтое поле внутри больше height: 100%, что вызывает синюю полосу прокрутки.

Чтобы этого избежать, добавьте min-height: 0 к контенту

html,
body {
  margin: 0;
  height: 100%;
  
}
.full-size {
  height: 100%;
}

.container {
  display: flex;
  flex-direction: column;
}

.content {
  flex: 1;
  min-height: 0;
}
<div class = "full-size container">
  <div style = "width:300px; height: 100px; background-color: green; flex-shrink: 0;">Upper content</div>
  <div class = "full-size content">
    <div class = "full-size" style = "overflow: auto; background-color: blue;">
      <div style = "width:300px; height: 400px; background-color: yellow;">Lower content</div>
    </div>
  </div>
</div>

Теперь синяя рамка всегда будет сжиматься, и вы никогда не получите полосу прокрутки тела.

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