Рассмотрим следующую гибкую компоновку:
body {
margin: 0;
}
.container {
background: red;
color: white;
height: 100vh;
display: flex;
}
.left {
flex-grow: 1;
height: 100%;
padding: 1em;
}
.main-content {
background: blue;
height: 130%;
}
.right {
height: 100%;
}
.side-content-upper {
padding: 1em;
height: 50%;
}
.side-content-lower {
padding: 1em;
height: 60%;
background: black;
}
<div class="container">
<div class="left">
<div class="main-content">some some some some some some some some some some some some some some some some some some some some some</div>
</div>
<div class="right">
<div class="side-content-upper">more</div>
<div class="side-content-lower">more</div>
</div>
</div>
Поскольку высоты .main-content
и .side-content-upper
плюс высота .side-content-lower
превышают 100%, мы получаем переполнение по вертикали. Теперь давайте сделаем так, чтобы первый столбец соответствовал высоте экрана и прокручивали отдельно, добавив box-sizing: border-box; overflow-y: scroll;
(чтобы сделать это более компактным, я выровняю неизменным CSS в одну строку):
body { margin: 0; }
.container { background: red; color: white; height: 100vh; display: flex; }
.left {
flex-grow: 1;
height: 100%;
padding: 1em;
box-sizing: border-box;
overflow-y: scroll;
}
.main-content { background: blue; height: 130%; }
.right {
height: 100%;
}
.side-content-upper { padding: 1em; height: 50%; }
.side-content-lower { padding: 1em; height: 60%; background: black; }
<div class="container">
<div class="left">
<div class="main-content">some some some some some some some some some some some some some some some some some some some some some</div>
</div>
<div class="right">
<div class="side-content-upper">more</div>
<div class="side-content-lower">more</div>
</div>
</div>
Работает нормально, не так ли? Давайте теперь применим тот же стиль к контейнеру .right
:
body { margin: 0; }
.container { background: red; color: white; height: 100vh; display: flex; }
.left {
flex-grow: 1;
height: 100%;
padding: 1em;
box-sizing: border-box;
overflow-y: scroll;
}
.main-content { background: blue; height: 130%; }
.right {
height: 100%;
box-sizing: border-box;
overflow-y: scroll;
}
.side-content-upper { padding: 1em; height: 50%; }
.side-content-lower { padding: 1em; height: 60%; background: black; }
<div class="container">
<div class="left">
<div class="main-content">some some some some some some some some some some some some some some some some some some some some some</div>
</div>
<div class="right">
<div class="side-content-upper">more</div>
<div class="side-content-lower">more</div>
</div>
</div>
Если разрешение экрана не слишком высокое, вы увидите то, чего я не ожидаю: правый столбец не только соответствует высоте и получает вертикальную прокрутку, но также сжимается и получает горизонтальную прокрутку. Это почему? Это не просто ширина вертикальной полосы прокрутки: переключите overflow-y
из .right
с scroll
на hidden
, и вы снова получите .right
деформированные. Я озадачен, как рассуждать об этом. На всякий случай вот что я вижу с hidden
:
