Переполнение в колонке#
возникает, когда суммарная высота флекс-элементов превышает доступную высоту родительского контейнера. Это происходит, потому что по умолчанию браузер старается отобразить содержимое целиком, не сжимая его
Чтобы флекс-элементы в контейнере с flex-direction: column не выходили за границы родителя при сжатии, нужно работать с несколькими свойствами: flex-basis, flex-shrink и min-height
Основные приемы#
Настройка flex-shrink
По умолчанию flex-shrink имеет значение 1, что позволяет элементам сжиматься, если не хватает места. Если вы изменили это значение на 0, элементы не будут уменьшаться и вызовут переполнение. Убедитесь, что flex-shrink имеет значение 1 или больше.
Установка flex-basis
Для элементов с разной высотой: Используйте flex-basis: auto. Это позволит элементам иметь свой естественный размер, основанный на контенте. Сочетайте это с flex-grow (например, flex: 1) для равномерного распределения дополнительного пространства.
Для элементов с одинаковой высотой: Используйте flex-basis: 0 вместе с flex-grow: 1. Это означает, что элементы не имеют базового размера и равномерно распределяют все доступное пространство.
Использование min-height: 0
Это критически важное свойство, особенно в колонках. По умолчанию браузеры не дают флекс-элементам сжиматься ниже их минимального размера контента. Установка min-height: 0 разрешает элементу сжиматься до нуля, если это необходимо, и эффективно предотвращает переполнение.
.flex-container {
display: flex;
flex-direction: column;
height: 400px; /* Пример фиксированной высоты родителя */
border: 2px solid blue;
}
.flex-item {
flex-grow: 1; /* Разрешает элементам занимать свободное место */
flex-shrink: 1; /* Позволяет элементам сжиматься */
flex-basis: auto; /* Базовый размер определяется контентом */
min-height: 0; /* Разрешает элементу сжиматься ниже его контента */
padding: 10px;
border: 1px solid red;
}
В этом примере:
flex-grow: 1 заставляет элементы растягиваться, чтобы заполнить всё свободное пространство.
flex-shrink: 1 позволяет им сжиматься, если места недостаточно.
min-height: 0 отменяет ограничение по минимальной высоте контента, что позволяет флексбоксу корректно сжимать элементы, чтобы они поместились в родительский контейнер.
Когда использовать flex-basis: 0#
Если вы хотите, чтобы все элементы имели одинаковую высоту, независимо от их контента, и занимали всё доступное пространство, используйте flex-basis: 0 вместе с flex-grow: 1:
.flex-item-equal-height {
flex: 1 1 0; /* Сокращенная запись для flex-grow: 1; flex-shrink: 1; flex-basis: 0; */
}
Это заставляет браузер игнорировать размеры контента и равномерно распределять высоту между элементами.
Что делать, если контент не помещается#
Если после сжатия контент все равно не помещается, можно добавить прокрутку.
.flex-item {
overflow-y: auto; /* Добавляет вертикальную прокрутку, если контент не помещается */
}
Это позволит элементу сжиматься, а если контент всё ещё слишком большой, внутри элемента появится скролл, и сам элемент не будет выходить за пределы родителя.