← Назад к вопросам

Как работает свойство flex-shrink?

1.6 Junior🔥 173 комментариев
#HTML и CSS

Комментарии (3)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает свойство flex-shrink

flex-shrink определяет, как flex-элемент будет сжиматься, если контейнер переполнен. Это одно из ключевых свойств Flexbox для управления размером элементов при недостатке места.

Основные концепции

1. Значение flex-shrink

/* По умолчанию - 1 (все элементы сжимаются одинаково) */
.item { flex-shrink: 1; }

/* 0 - элемент не сжимается */
.item { flex-shrink: 0; }

/* 2 - сжимается в 2 раза больше, чем элементы с 1 */
.item { flex-shrink: 2; }

2. Как работает сжатие В отличие от flex-grow, flex-shrink сжимает пропорционально размерам элементов:

<div class="container">
  <div class="item" style="width: 200px; flex-shrink: 1;">Item 1</div>
  <div class="item" style="width: 200px; flex-shrink: 2;">Item 2</div>
  <div class="item" style="width: 200px; flex-shrink: 1;">Item 3</div>
</div>

<style>
.container {
  width: 400px; /* Контейнер уже чем сумма width элементов (600px) */
  display: flex;
  overflow: hidden;
}
</style>

/*
Общая ширина элементов: 200 + 200 + 200 = 600px
Доступная ширина: 400px
Нужно сократить: 600 - 400 = 200px

Шкала сжатия: 1 + 2 + 1 = 4
Каждая единица сжатия: 200px / 4 = 50px

Item 1: 200 - (1 * 50) = 150px
Item 2: 200 - (2 * 50) = 100px
Item 3: 200 - (1 * 50) = 150px
Итого: 150 + 100 + 150 = 400px ✓
*/

3. Сравнение flex-shrink и flex-grow

/* flex-grow: распределяет ПРИ наличии свободного места */
.container {
  width: 1000px; /* Больше, чем нужно */
  display: flex;
}
.item {
  width: 100px;
  flex-grow: 1; /* Каждый элемент займёт одинаковую часть свободного места */
}

/* flex-shrink: сжимает ПРИ недостатке места */
.container {
  width: 200px; /* Меньше, чем нужно для 3 элементов по 100px */
  display: flex;
}
.item {
  width: 100px;
  flex-shrink: 1; /* Каждый элемент сожмётся пропорционально */
}

4. min-width влияет на сжатие

.container {
  width: 300px;
  display: flex;
}

.item {
  width: 200px;
  flex-shrink: 1;
}

/* Без min-width - элементы сожмутся меньше 200px */
/* С min-width - они не будут меньше 100px */
.item {
  min-width: 100px;
  flex-shrink: 1;
}

Практические примеры

1. Нежелательное сжатие - кнопка не должна сжиматься

.form-group {
  display: flex;
  width: 100%;
}

.input {
  flex: 1; /* Может расширяться и сжиматься */
  min-width: 0; /* Позволяет сжаться меньше контента */
}

.button {
  flex-shrink: 0; /* НЕ сжимается */
  margin-left: 10px;
}

2. Навигация с элементами разных размеров

.navbar {
  display: flex;
  width: 100%;
  gap: 20px;
}

.logo {
  flex-shrink: 0; /* Логотип всегда видим */
  width: 100px;
}

.search {
  flex: 1; /* Берёт все свободное место */
  min-width: 150px;
}

.menu-icon {
  flex-shrink: 0; /* Меню всегда видим */
  width: 50px;
}

3. Карточки товаров - равномерное сжатие

.products {
  display: flex;
  width: 100%;
  gap: 10px;
}

.product-card {
  flex: 1 1 300px; /* flex-grow: 1, flex-shrink: 1, flex-basis: 300px */
  /* При недостатке места сжимаются все одинаково */
}

Формула расчёта

// Для каждого элемента:
final_width = width - (excess_space * flex_shrink * width) / total_shrink_weight

// Пример:
// Контейнер: 500px
// Элементы: 200px + 200px + 200px = 600px
// Нужно убрать: 100px
// flex-shrink: 1, 1, 1 -> всего 3
// Каждый теряет: 100 * (1/3) = 33.33px

Ошибки и их решения

/* Ошибка: текст переполняет контейнер */
.container {
  display: flex;
  width: 300px;
}
.item {
  width: 500px;
  /* По умолчанию flex-shrink: 1, но это может не помочь, если содержимое не переносится */
}

/* Решение: добавь min-width: 0 или overflow */
.item {
  width: 500px;
  flex-shrink: 1;
  min-width: 0; /* Позволяет сжаться меньше контента */
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

Шпаргалка

  • flex-shrink: 0 - элемент НЕ сжимается (используй для кнопок, иконок)
  • flex-shrink: 1 (по умолчанию) - элемент сжимается пропорционально с остальными
  • flex-shrink: 2+ - сжимается в несколько раз больше других
  • min-width: 0 - позволяет контенту сжаться меньше его естественного размера

flex-shrink важен для адаптивного дизайна и работы на узких экранах.

Как работает свойство flex-shrink? | PrepBro