Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

CSSプロパティ辞典

flex-shrink

フレックスアイテムの縮小係数を指定します。コンテナにアイテムが収まりきらない場合に、各アイテムがどの割合で縮小されるかを制御します。

サンプルコード
/* 他のアイテムと同じ割合で縮小(初期値) */
.item { flex-shrink: 1;}

/* 縮小しない */
.item-fixed { flex-shrink: 0;}

/* 他のアイテムの2倍の割合で縮小 */
.item-shrink { flex-shrink: 2;}
指定可能な値一覧
概要
<number>0以上の数値を指定します。初期値は『1』(他と同じ割合で縮小)です。負の値は無効です。
仕様情報
項目内容
初期値1
適用対象フレックスアイテム
継承しない
アニメーション可能(number として補間)
対応ブラウザ
Chrome Chrome
29 以降
28
27
26
25
24
23
22
↑ prefix『-webkit-』が必要
21 以前 ×
Firefox Firefox
20 以降
19 以前 ×
Safari Safari
9 以降
8
↑ prefix『-webkit-』が必要
7 以前 ×
Edge Edge
12 以降
全バージョンで対応しています
IE IE
11
10
9 ×
8 ×
7 ×
6 ×
Opera Opera
12.1 以降
11 以前 ×
iOS Safari iOS Safari
9 以降
8
↑ prefix『-webkit-』が必要
7 以前 ×
Android Android Browser
4.4 以降
3 以前 ×
Chrome Android Chrome Android
最新版
デスクトップ版と同等の対応です
Firefox Android Firefox Android
最新版
デスクトップ版と同等の対応です

※ バージョン情報は MDN / Can I Use に基づいています。

概要

『flex-shrink』はフレックスアイテムに指定するプロパティで、アイテムの合計サイズがコンテナを超える場合に、各アイテムがどの割合で縮小されるかを制御します。初期値は『1』で、すべてのアイテムが同じ割合で縮小されます。

縮小の仕組み

全アイテム flex-shrink: 1 — 均等に縮小 A (1) B (1) C (1) コンテナ: 350px Aだけ flex-shrink: 0 — Aは縮小されない A (0) 固定 B (1) C (1)

『flex-shrink』の値は「比率」として働きます。すべてのアイテムが『flex-shrink: 1』(初期値)なら、不足分は均等に縮小されます。特定のアイテムを『flex-shrink: 0』にすると、そのアイテムは縮小されません。

/* コンテナの幅: 400px、アイテムの合計幅: 600px → 不足分: 200px */

/* 全アイテムがflex-shrink: 1の場合 → 均等に縮小 */
.item-a { width: 200px; flex-shrink: 1;}  /* 約133px */
.item-b { width: 200px; flex-shrink: 1;}  /* 約133px */
.item-c { width: 200px; flex-shrink: 1;}  /* 約133px */

/* item-aだけflex-shrink: 0の場合 → 縮小されない */
.item-a { width: 200px; flex-shrink: 0;}  /* 200px(固定) */
.item-b { width: 200px; flex-shrink: 1;}  /* 100px */
.item-c { width: 200px; flex-shrink: 1;}  /* 100px */
パターン: 固定幅サイドバー + 可変メインコンテンツ

広い画面 Sidebar 250px Main(広い) 狭い画面 — Sidebarは縮まない Sidebar 250px Main(縮小)

/* サイドバーは縮小させず、メインコンテンツだけ縮小させる */
.layout {
    display: flex;
}
.sidebar {
    width: 250px;
    flex-shrink: 0;  /* サイドバーは固定幅 */
}
.main {
    flex-grow: 1;
    flex-shrink: 1;  /* メインは縮小OK */
}
『flex-shrink: 0』の重要性

固定幅にしたい要素(ロゴ、アイコン、サイドバーなど)には『flex-shrink: 0』を指定するのがベストプラクティスです。『width』だけでは、コンテナが狭くなったときに意図せず縮小されてしまいます。

『min-width』との関係

min-width: auto(初期値)— テキスト幅以下に縮まない とても長いテキストがはみ出す... はみ出し! min-width: 0 — テキスト幅以下にも縮小可能 とても長い... B 収まる ✓

フレックスアイテムの『min-width』の初期値は『auto』で、アイテムの内容(テキストや画像)の最小サイズ以下には縮小されません。『flex-shrink: 1』を指定していてもテキストがはみ出す場合は、『min-width: 0』を指定することで内容以下のサイズまで縮小できるようになります。

/* テキストがはみ出す場合の対処 */
.item {
    flex-shrink: 1;
    min-width: 0;       /* 内容以下のサイズまで縮小可能に */
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
関連プロパティ
プロパティ概要
flex-growアイテムの伸長係数を指定します。『flex-shrink』は縮小の係数、『flex-grow』は伸長の係数です。
flex-basisアイテムの基本サイズを指定します。『flex-shrink』の計算は『flex-basis』で決まるサイズからの不足分が対象です。
flex『flex-grow』『flex-shrink』『flex-basis』の一括指定(ショートハンド)です。個別指定より『flex』の使用が推奨されています。
min-widthアイテムの最小幅を指定します。『flex-shrink』による縮小はこの値以下にはなりません。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。