Интервью-вопрос
Что такое flex-grow
flex-grow показывает, какую долю свободного места получает flex-элемент. Главное помнить, это не гарантия равной ширины. Итог зависит от базового размера, ограничений и соседних элементов. На практике проверяйте переполнение на реальном контенте.
- Добавлен
- Редакция
Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.
Мини-квиз
Проверка перед разбором
Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.
Вопрос 1 из 50 правильно
Разбор
Разобраться, а не зазубрить
Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.
Базовая идея
flex-grow отвечает за рост flex-элемента, когда в flex-контейнере осталось положительное свободное место. Значение задают числом, например 0, 1, 2, 0.5. Чем больше число относительно соседей, тем большую долю свободного места получит элемент.
В ответе важно сказать именно про свободное место. Если контейнер уже занят базовыми размерами элементов, расти может быть нечему. Если свободное место есть, браузер делит его между элементами с положительным flex-grow.
Значение по умолчанию равно 0. Элемент сохраняет базовый размер и не забирает пустое пространство, пока вы явно не разрешите рост.
Пример, который удобно объяснить
Представьте строку с кнопкой фиксированного размера и полем, которое должно занять все остальное место.
.toolbar {
display: flex;
gap: 12px;
}
.search {
flex-grow: 1;
min-width: 0;
}
.button {
flex: 0 0 auto;
}Здесь .search является flex-элементом и получает свободное место после кнопки и gap. min-width: 0 полезен, если внутри поля или соседнего блока есть длинный текст. Без него элемент может не сжаться, вытолкнуть кнопку за экран и создать горизонтальный скролл. Такой блок лучше сразу проверить на длинных значениях, мобильной ширине и клавиатурной навигации.
Почему flex-grow: 1 не всегда дает равные блоки
Частая ошибка в ответе, если всем поставить flex-grow: 1, все станут одинаковыми. Это верно только в частном случае, когда базовые размеры одинаковые или сброшены.
Неполный CSS.
.card {
flex-grow: 1;
}Если у карточек разный текст, картинки или заданный width, они могут начать с разных базовых размеров. Потом каждая получит одинаковую долю свободного места, но итоговые размеры все равно будут разными. В интерфейсе вы увидите неровную сетку, скачки переносов и разные кликабельные зоны.
Для равных колонок чаще используют такой вариант.
.card {
flex: 1 1 0;
min-width: 0;
}Здесь базовый размер фактически сброшен, поэтому свободное место делится от одинаковой стартовой точки. Но это не универсальная замена. Если контенту нужен минимальный размер, добавьте min-width, настройте обрезку или перенос текста. Для сетки карточек иногда проще выбрать CSS Grid.
Как выбирать формулировку и CSS-подход
Как ответить и что выбрать в верстке
Задайте этому блоку <code>flex-grow: 1</code>, а фиксированному блоку оставьте базовый размер.Чаще используйте <code>flex: 1</code> или <code>flex: 1 1 0</code>, а не только <code>flex-grow: 1</code>.Добавьте ограничение через <code>min-width</code> или <code>max-width</code> и проверьте, не появится ли переполнение.Используйте <code>gap</code>. <code>flex-grow</code> меняет размер элементов, а не промежутки между ними.На интервью можно ответить так.
flex-grow задает коэффициент роста flex-элемента. Он распределяет положительное свободное место внутри flex-контейнера. Если одному элементу дать 2, а другому 1, первый получит в два раза большую долю свободного места. Итоговый размер все равно зависит от flex-basis, width, gap и ограничений.
Такая формулировка звучит точнее, чем просто растягивает элемент. Она показывает, что вы понимаете алгоритм на уровне реальной верстки.
Взаимодействие с flex-basis, width и gap
У flex-элемента есть базовый размер. Его может задавать flex-basis, width, содержимое или сокращение flex. Свободное место считается после базовых размеров и после промежутков gap.
Например, контейнер шириной 600px, два элемента имеют базовые размеры 100px и 200px, а gap равен 20px. На сами элементы остается 580px. Базовые размеры занимают 300px, свободное место равно 280px. Если у обоих flex-grow: 1, каждый получит по 140px добавки. Итог будет 240px и 340px, а не две одинаковые колонки.
Если у первого flex-grow: 2, а у второго flex-grow: 1, свободные 280px делятся в пропорции 2 к 1. Первый получает большую добавку. Но расчет все равно начинается от базовых размеров.
Практический вывод для frontend
В интерфейсах flex-grow чаще всего нужен для сценария занять остаток. Например, поле поиска рядом с кнопкой, основной контент рядом с сайдбаром, центральная область между левым и правым блоком. Это хороший выбор, когда вы хотите сохранить размер одних элементов и отдать свободное место другому.
Но если задача про сетку равных карточек, не отвечайте только через flex-grow. Скажите, что проверите стартовые размеры и, возможно, возьмете flex: 1 1 0 или CSS Grid. Так вы снижаете риск получить макет, где карточки почти равные, но ломаются на реальном контенте, длинных названиях товаров или изображениях без ограничений.
Нестандартные случаи
При flex-wrap: wrap свободное место распределяется по каждой строке отдельно. Поэтому карточки на первой строке и карточки на второй строке могут получить разные итоговые размеры, даже если у них одинаковый flex-grow.
Еще один нюанс. Значения могут быть дробными, например 0.5. Это не проценты, а коэффициенты. Браузер сравнивает их с коэффициентами соседних flex-элементов и делит свободное место пропорционально.
Отрицательные значения использовать нельзя. Такая декларация невалидна. Поэтому не стоит говорить, что flex-grow: -1 запрещает рост. Для запрета роста используйте flex-grow: 0 или сокращение вроде flex: 0 0 auto.
Частые ошибки
Где обычно ошибаются
Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.
- 1
Ждать равных ширин от одного flex-grow
flex-grow: 1добавляет одинаковую долю свободного места, но не обнуляет стартовые размеры. Если у карточек разный контент или разныйflex-basis, итоговые размеры могут отличаться. Для равных колонок лучше сразу упомянутьflex: 1илиflex: 1 1 0. - 2
Задавать свойство не тому элементу
flex-growработает на flex-элементе, то есть на прямом ребенке flex-контейнера. Если поставить его на сам контейнер или на вложенный элемент, раскладка не изменится. В UI это выглядит как сломанный резиновый блок. Кнопка уезжает, поле не занимает остаток, появляется лишняя пустота. На интервью сразу уточните, что родитель должен бытьdisplay: flex. - 3
Не учитывать flex-basis и width
Свободное место считается после базовых размеров элементов. Поэтому элемент сwidth: 300pxи элемент сwidth: 100pxпри одинаковомflex-growне обязаны стать равными. В ответе лучше сказать, что растет не весь элемент с нуля, а добавка к базовому размеру. - 4
Путать flex-grow и gap
gapзадает промежутки между элементами и уменьшает место, доступное для самих элементов.flex-growраспределяет оставшееся место между элементами. Если перепутать их, можно получить резиновый контент вместо стабильных отступов. - 5
Игнорировать ограничения содержимого
Длинные слова, картинки и стандартноеmin-width: autoмогут помешать ожидаемому поведению. В реальной верстке часто приходится добавлятьmin-width: 0для растущего блока с текстом и ограничивать медиа черезmax-width: 100%. Иначе появится горизонтальный скролл, кнопка станет недоступной с клавиатуры без прокрутки или соседние элементы будут вытеснены.
Follow-up
Что могут спросить дальше
Короткие ответы на вопросы, которыми проверяют, понимаете ли вы flex-grow в реальной верстке.
Живые ответы
Видео с похожим вопросом
Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.
Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.
Что такое box-sizing 😎
box-sizing задает, входят ли padding и border в указанные width и height. Разбираем разницу между content-box и border-box, типичные баги в верстке и безопасную формулировку для интервью.
Что такое BEM 😎
BEM помогает называть CSS-классы так, чтобы компоненты были понятными, переиспользуемыми и меньше конфликтовали через каскад. Разбираем блоки, элементы, модификаторы и типичные ошибки в верстке.