Интервью-вопрос
Что такое flex-shrink?
flex-shrink показывает, как flex-элемент отдает место, когда контейнеру тесно. В ответе свяжите его с flex-basis, минимальными размерами и риском переполнения.
- Добавлен
- Редакция
Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.
Мини-квиз
Проверка перед разбором
Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.
Вопрос 1 из 50 правильно
Разбор
Разобраться, а не зазубрить
Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.
Базовая идея
flex-shrink отвечает за flex-элемент, когда места не хватает. Если контейнер уже, чем сумма базовых размеров его детей, браузеру нужно забрать лишние пиксели. flex-shrink помогает решить, у каких элементов и сколько места забрать.
Короткий ответ на интервью может звучать так:
flex-shrink задает коэффициент сжатия flex-элемента по главной оси. По умолчанию он равен 1, поэтому элементы могут уменьшаться при нехватке места. Если поставить 0, элемент не будет сжиматься, но это может вызвать переполнение контейнера.
Не останавливайтесь на определении. Добавьте практический риск. Свойство не гарантирует, что элемент реально ужмется до любого размера. На итог влияют flex-basis, min-width, min-height и содержимое.
Как браузер распределяет нехватку места
flex-shrink включается, когда свободное место отрицательное. Проще говоря, flex-элементы вместе хотят занять больше места, чем есть в контейнере.
Упрощенная логика такая:
- Браузер берет базовые размеры flex-элементов.
- Сравнивает их сумму с размером контейнера по главной оси.
- Если места не хватает, распределяет недостающие пиксели между элементами.
- Для каждого элемента учитывает не только
flex-shrink, но и его базовый размер. - Потом применяет ограничения минимального и максимального размера.
Поэтому фраза "у первого flex-shrink: 2, значит он всегда сожмется ровно в два раза сильнее второго" слишком грубая. Если базовые размеры разные, итоговая потеря пикселей считается не только по коэффициенту.
Как выбрать значение на практике
Обычно не нужно расставлять разные значения flex-shrink везде. В большинстве интерфейсов хватает дефолтного 1 для контента, который можно ужать, и 0 для элементов, которые должны сохранить размер.
Как выбрать значение flex-shrink
Оставьте flex-shrink: 1 или задайте его через shorthand flex.Используйте flex-shrink: 0. Потом проверьте, что соседние элементы смогут ужаться.Дайте сжимаемому элементу min-width: 0 и настройте overflow, white-space, text-overflow. Если текст важен для действия, покажите полную версию в доступном месте.Увеличьте flex-shrink у менее важного блока. Затем проверьте результат на реальных размерах контента.Практический пример с карточкой
Частый кейс выглядит так. Слева аватар, рядом длинное имя, справа кнопка. Аватар и кнопка не должны сжиматься. Текст должен занять остаток и обрезаться.
.user-row {
display: flex;
align-items: center;
gap: 12px;
max-width: 320px;
}
.avatar {
width: 40px;
height: 40px;
flex-shrink: 0;
}
.name {
flex: 1 1 auto;
min-width: 0;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.action {
flex-shrink: 0;
}Здесь .avatar и .action защищены от сжатия. .name может сжиматься, но ключевая деталь в min-width: 0. Без нее длинный текст может выталкивать кнопку за пределы контейнера. Если имя важно для выбора действия, не оставляйте только обрезанную строку. Дайте пользователю способ увидеть полный текст, например в раскрытии карточки или в доступной подписи рядом с действием.
Главная ловушка: min-width и содержимое
На интервью часто проверяют не только знание свойства, но и реальный опыт с flex-версткой. Типичная ситуация такая. Вы видите flex-shrink: 1, но элемент не становится меньше.
Причина может быть в минимальном размере. У flex-элементов начальное min-width часто ведет себя так, что контент не дает элементу ужаться. Длинное слово, URL, заголовок или вложенный блок могут создать overflow. Для UI это заметно сразу. Кнопка уезжает за край, появляется горизонтальная прокрутка или часть формы становится недоступной на телефоне.
Безопасная формулировка:
Если текстовый flex-элемент должен сжиматься и обрезаться, я проверю не только flex-shrink, но и min-width. Часто нужно поставить min-width: 0 на сам сжимаемый элемент.
Связь с flex-grow и flex-basis
Эти три свойства отвечают за разные части одной модели:
flex-basisзадает базовый размер до распределения свободного места.flex-growраспределяет лишнее место, когда контейнер шире нужного.flex-shrinkраспределяет нехватку места, когда контейнер теснее нужного.
На практике часто используют shorthand flex. Важно помнить, что он меняет несколько значений сразу. Например, когда вы пишете flex: 1, вы не просто включаете рост. Вы также получаете определенное поведение для shrink и basis. Если верстка внезапно изменилась, проверьте итоговые computed styles.
Практический вывод
В ответе на собеседовании держите простой порядок. Что делает свойство, когда оно включается, чем ограничивается и где может сломать UI.
Хорошая короткая версия:
flex-shrink управляет тем, как flex-элемент уменьшается по главной оси, когда контейнеру не хватает места. Значение 1 стоит по умолчанию, 0 запрещает сжатие. При этом итог зависит от flex-basis и минимального размера контента, поэтому для длинного текста в flex часто нужен min-width: 0, иначе можно получить overflow.
Такой ответ показывает, что вы не просто помните определение, а понимаете типичный баг в интерфейсе. После изменения проверяйте не только красивую ширину, но и переполнение, кликабельные области, фокус с клавиатуры и состояние на реальном длинном контенте.
Частые ошибки
Где обычно ошибаются
Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.
- 1
Считать flex-shrink независимым от flex-basis
flex-shrinkучаствует в расчете вместе с базовым размером элемента. Если вы скажете, что значение 2 всегда сжимает элемент ровно в два раза сильнее соседа, вас легко уточнят про разныеflex-basis. Безопаснее ответить так: коэффициент сжатия взвешивается базовым размером. - 2
Забывать про min-width: auto
Flex-элемент может не сжиматься ниже минимального размера контента. Из-за этого длинный заголовок ломает карточку или создает горизонтальную прокрутку. Для сжимаемой текстовой области часто нуженmin-width: 0, а не толькоflex-shrink: 1. - 3
Ставить flex-shrink: 0 всем элементам
Так интерфейс выглядит стабильным только на широком экране. На узком контейнер переполнится, элементы уедут за край или появится лишняя прокрутка. Фиксируйте только критичные части. Основному контенту лучше оставить возможность сжиматься. - 4
Путать shrink, grow и shorthand flex
flex-growраспределяет лишнее место,flex-shrinkраспределяет нехватку, аflex-basisзадает стартовую базу. Shorthandflexменяет несколько значений сразу. Поэтому запись вродеflex: 1может дать не тот базовый размер, который вы ожидали. - 5
Давать сжиматься кнопкам и полям без проверки
Если кнопка, инпут или ссылка ужимаются вместе с текстом, вы можете получить обрезанную подпись, слишком маленькую область клика или непонятный focus state. Для критичных контролов задайтеflex-shrink: 0, разумныйmin-widthили разрешите перенос строки. Потом проверьте клавиатуру, фокус и узкую ширину контейнера. - 6
Писать отрицательные значения
flex-shrink: -1не является валидным значением. Браузер не применит такую декларацию, и поведение будет зависеть от каскада. На интервью лучше прямо сказать, что допустимы только неотрицательные числа.
Follow-up
Что могут спросить дальше
Короткие ответы на вопросы, где важно показать понимание flex-shrink, базовых размеров и переполнения.
Живые ответы
Видео с похожим вопросом
Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.
Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.
Что такое BEM 😎
BEM помогает называть CSS-классы так, чтобы компоненты были понятными, переиспользуемыми и меньше конфликтовали через каскад. Разбираем блоки, элементы, модификаторы и типичные ошибки в верстке.
Актуален ли SCSS 😎
SCSS остается актуальным, но его стоит выбирать осознанно: он помогает с модульностью и переиспользованием стилей, но не заменяет современные возможности CSS и не решает изоляцию сам по себе. На странице разбираем, как ответить на интервью и где проходит граница между SCSS, CSS Modules и CSS-in-JS.