Просто внесите две незначительные корректировки, и все готово.
1.Проблема с заголовком
Поскольку я явно установил высоту моего .test-header
класса на 150px
, почему эта высота не отображается?
Ваш заголовок(.test-header
) не учитывает 150px, поскольку для flex-shrink
по умолчанию установлено значение 1
(включено).Это означает, что гибкий элемент может сжиматься ниже своего первоначального размера, чтобы предотвратить переполнение контейнера.
Поскольку его брат (.test-body
) потребляет всю оставшуюся высоту в контейнере, а затем больше,заголовок сжимается настолько сильно, насколько это возможно.
Вам необходимо отключить flex-shrink
.
Вместо этого:
.test-header {
height: 150px;
}
Попробуйте это:
.test-header {
height: 150px;
flex-shrink: 0;
}
Или, что еще лучше, и в соответствии со спецификацией, это:
.test-header {
flex: 0 0 150px; /* fg, fs, fb */
}
7.2.Компоненты гибкости
Авторам рекомендуется контролировать гибкость с помощью сокращения flex
, а не напрямую с его свойствами, так как сокращение корректно сбрасывает любые неуказанные компоненты для удовлетворения общего использования.
2.Проблема с прокруткой
Почему добавление flex-direction: column
в мой класс .container
вызывает нежелательный эффект?
Элемент flex по умолчанию не может быть меньше егосодержимое вдоль главной оси, которая является вертикальной в flex-direction: column
( полное объяснение ).
Это означает, что для вашего элемента содержимого (.test-body
) установлено значение min-height: auto
, что предотвращаетусловие переполнения, так как элемент просто расширяется, чтобы вместить больше содержимого, и нет никакой причины для вертикальной полосы прокрутки.
Этот параметр необходимо переопределить.Добавьте этот код:
.test-body {
min-height: 0; /* new */
display: flex;
flex-direction: column;
}
var testTable = document.getElementById("test-table");
for (let i = 0; i < 150; i++)
testTable.innerHTML += '<tr><td>DATA ' + (i + 1) + '</td><td>' + i + '</td></tr>';
.container {
display: flex;
flex-direction: column;
overflow-y: auto;
height: 100vh;
}
.test-header {
flex: 0 0 150px; /* adjustment */
background-color: #fff3;
}
.test-body {
min-height: 0; /* new */
display: flex;
flex-direction: column;
background-color: #33f5;
}
.test-body table {
width: 100%;
table-layout: fixed;
}
.test-body-header {
background-color: #fff5;
}
.test-body-body {
flex: 1;
overflow-y: auto;
}
body {
margin: 0;
background-color: #fc3;
background-image: linear-gradient(45deg, #fc3, #f33);
}
<div class="container">
<div class="test-header">A</div>
<div class="test-body">
<div class="test-body-header">
<table>
<tr>
<th>Data ID</th>
<th>Value</th>
</tr>
</table>
</div>
<div class="test-body-body">
<table id="test-table"></table>
</div>
</div>
</div>