Gernar
Frontend DeveloperCSS

Интервью-вопрос

Что такое flex-grow

flex-grow показывает, какую долю свободного места получает flex-элемент. Главное помнить, это не гарантия равной ширины. Итог зависит от базового размера, ограничений и соседних элементов. На практике проверяйте переполнение на реальном контенте.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 50 правильно

Как лучше объяснить flex-grow на интервью?

Вы сейчас даете короткий ответ без лишней теории.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

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-подход

Как ответить и что выбрать в верстке

1Нужно, чтобы один блок занял остаток рядом с фиксированной кнопкой или сайдбаром?
Задайте этому блоку <code>flex-grow: 1</code>, а фиксированному блоку оставьте базовый размер.
2Нужны равные колонки независимо от текста внутри?
Чаще используйте <code>flex: 1</code> или <code>flex: 1 1 0</code>, а не только <code>flex-grow: 1</code>.
3Нужно сохранить минимальный размер элемента?
Добавьте ограничение через <code>min-width</code> или <code>max-width</code> и проверьте, не появится ли переполнение.
4Нужно управлять расстоянием между элементами?
Используйте <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. 1

    Ждать равных ширин от одного flex-grow

    flex-grow: 1 добавляет одинаковую долю свободного места, но не обнуляет стартовые размеры. Если у карточек разный контент или разный flex-basis, итоговые размеры могут отличаться. Для равных колонок лучше сразу упомянуть flex: 1 или flex: 1 1 0.
  2. 2

    Задавать свойство не тому элементу

    flex-grow работает на flex-элементе, то есть на прямом ребенке flex-контейнера. Если поставить его на сам контейнер или на вложенный элемент, раскладка не изменится. В UI это выглядит как сломанный резиновый блок. Кнопка уезжает, поле не занимает остаток, появляется лишняя пустота. На интервью сразу уточните, что родитель должен быть display: flex.
  3. 3

    Не учитывать flex-basis и width

    Свободное место считается после базовых размеров элементов. Поэтому элемент с width: 300px и элемент с width: 100px при одинаковом flex-grow не обязаны стать равными. В ответе лучше сказать, что растет не весь элемент с нуля, а добавка к базовому размеру.
  4. 4

    Путать flex-grow и gap

    gap задает промежутки между элементами и уменьшает место, доступное для самих элементов. flex-grow распределяет оставшееся место между элементами. Если перепутать их, можно получить резиновый контент вместо стабильных отступов.
  5. 5

    Игнорировать ограничения содержимого

    Длинные слова, картинки и стандартное min-width: auto могут помешать ожидаемому поведению. В реальной верстке часто приходится добавлять min-width: 0 для растущего блока с текстом и ограничивать медиа через max-width: 100%. Иначе появится горизонтальный скролл, кнопка станет недоступной с клавиатуры без прокрутки или соседние элементы будут вытеснены.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которыми проверяют, понимаете ли вы flex-grow в реальной верстке.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание