Caution

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

CSSプロパティ辞典

flex-direction

フレックスコンテナ内のアイテムが並ぶ方向(主軸の方向)を指定します。Flexboxレイアウトの基本となるプロパティです。

サンプルコード
/* 横並び(初期値) */
.container { display: flex; flex-direction: row;}

/* 縦並び */
.container-vertical { display: flex; flex-direction: column;}

/* 横並び(逆順) */
.container-reverse { display: flex; flex-direction: row-reverse;}

/* 縦並び(逆順) */
.container-reverse-v { display: flex; flex-direction: column-reverse;}
指定可能な値一覧
概要
rowアイテムを水平方向(左から右)に並べます。初期値です。
row-reverseアイテムを水平方向(右から左)に並べます。rowの逆順です。
columnアイテムを垂直方向(上から下)に並べます。
column-reverseアイテムを垂直方向(下から上)に並べます。columnの逆順です。
仕様情報
項目内容
初期値row
適用対象フレックスコンテナ(『display: flex』または『display: inline-flex』が指定された要素)
継承しない
アニメーション不可(discrete)
対応ブラウザ
Chrome Chrome
29 以降
28
27
26
25
24
23
22
21
↑ prefix『-webkit-』が必要
20 以前 ×
Firefox Firefox
28 以降
27
26
25
24
23
22
↑ 部分的なサポート
21 以前 ×
Safari Safari
9 以降
8
7.1
7
6.1
↑ prefix『-webkit-』が必要
6 以前 ×
Edge Edge
12 以降
全バージョンで対応しています
IE IE
11
一部バグあり
10
prefix『-ms-』が必要
9 ×
8 ×
7 ×
6 ×
Opera Opera
15 以降
12.1
12 ×
11 以前 ×
iOS Safari iOS Safari
9 以降
8.4
8
7.1
7
↑ prefix『-webkit-』が必要
6.1 以前 ×
Android Android Browser
4.4
4.3
4.2
4.1
↑ prefix『-webkit-』が必要
4.0 ×
3.0 ×
2.3 ×
2.2 ×
2.1 ×
Chrome Android Chrome Android
最新版
デスクトップ版と同等の対応です
Firefox Android Firefox Android
最新版
デスクトップ版と同等の対応です

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

概要

『flex-direction』はFlexboxレイアウトにおける最も基本的なプロパティです。このプロパティは『display』プロパティに『flex』または『inline-flex』が指定された要素(フレックスコンテナ)に対して使用し、子要素(フレックスアイテム)が並ぶ方向を決定します。

主軸と交差軸

Flexboxを理解する上で最も重要な概念が「主軸(main axis)」と「交差軸(cross axis)」です。『flex-direction』の値によってこの2つの軸の方向が決まり、他のFlexboxプロパティの動作もこの軸に基づきます。

flex-direction: row の場合

Item 1 Item 2 Item 3 主軸 交差軸 justify-content → align-items ↓

flex-direction: column の場合

Item 1 Item 2 Item 3 主軸 交差軸 justify-content ↓ align-items →

『justify-content』と『align-items』の方向

『justify-content』プロパティは主軸方向の配置、『align-items』プロパティは交差軸方向の配置を制御します。つまり『flex-direction』の値を変えると、『justify-content』と『align-items』が効く方向も入れ替わります。

/* rowの場合: justify-contentは「横方向」、align-itemsは「縦方向」に効く */
.row-container {
    display: flex;
    flex-direction: row;
    justify-content: center;  /* 横方向の中央揃え */
    align-items: center;      /* 縦方向の中央揃え */
}

/* columnの場合: justify-contentは「縦方向」、align-itemsは「横方向」に効く */
.column-container {
    display: flex;
    flex-direction: column;
    justify-content: center;  /* 縦方向の中央揃え */
    align-items: center;      /* 横方向の中央揃え */
}
row(初期値)

アイテムを文書の記述方向と同じ向きに横に並べます。日本語や英語など左から右に書く言語(LTR)では左から右へ、アラビア語など右から左に書く言語(RTL)では右から左に並びます。最も頻繁に使用される値で、ナビゲーションメニューやカードの横並びなどに適しています。

row-reverse

『row』の逆方向にアイテムを並べます。LTRの場合は右から左へ配置されます。視覚的な並び順だけが変わり、DOMの順序は変わりません(アクセシビリティの注意点については後述します)。

column

アイテムをブロック軸の方向(通常は上から下)に縦に並べます。サイドバーのメニューやフォームの項目の縦並びなどに適しています。『column』を使う場合、フレックスコンテナに明示的な『height』を指定しないと『flex-wrap』による折り返しや『justify-content』によるアイテム間のスペース調整が効かない点に注意が必要です。

column-reverse

『column』の逆方向にアイテムを並べます。通常は下から上へ配置されます。チャットUIのメッセージ表示(最新が下に表示される)など、限られた場面で使われます。

パターン1: ナビゲーションバー
/* ロゴとナビゲーションリンクを横並びに */
.navbar {
    display: flex;
    flex-direction: row;
    justify-content: space-between;
    align-items: center;
    padding: 10px 20px;
}
パターン2: カードの縦レイアウト
/* カード内の要素を縦に並べてフッターを下に固定 */
.card {
    display: flex;
    flex-direction: column;
    height: 300px;
}
.card-body {
    flex: 1;  /* 残りの空間を埋める */
}
.card-footer {
    /* flex: 1を指定しないため、自然な高さで下に配置される */
}
パターン3: レスポンシブ対応(横並び ↔ 縦並びの切り替え)
/* PC: 横並び → スマートフォン: 縦並び */
.layout {
    display: flex;
    flex-direction: row;
    gap: 20px;
}
@media (max-width: 768px) {
    .layout {
        flex-direction: column;
    }
}

これはFlexboxの最も実用的なパターンの一つです。『flex-direction』の値をメディアクエリで切り替えるだけで、PCでは横並び・スマートフォンでは縦並びのレスポンシブレイアウトが実現できます。

『dir』属性との関係

『row』と『row-reverse』の並び方向は、HTMLの『dir』属性(文書の記述方向)によって変わります。日本語や英語のサイトでは通常意識する必要はありませんが、アラビア語やヘブライ語など右から左に書く言語(RTL)のサイトを扱う場合に関係してきます。

dir属性『row』の並び順『row-reverse』の並び順
ltr(初期値)左 → 右右 → 左
rtl右 → 左左 → 右
<!-- 通常の日本語・英語サイト(ltr) -->
<div style="display: flex; flex-direction: row;">
    <div>Item 1</div>  <!-- 左 -->
    <div>Item 2</div>
    <div>Item 3</div>  <!-- 右 -->
</div>

<!-- アラビア語サイトなど(rtl) -->
<div dir="rtl" style="display: flex; flex-direction: row;">
    <div>Item 1</div>  <!-- 右 -->
    <div>Item 2</div>
    <div>Item 3</div>  <!-- 左 -->
</div>

つまり『row』は「左から右」ではなく「文書の記述方向と同じ向き」、『row-reverse』は「その逆向き」という意味になります。なお『column』と『column-reverse』は『dir』属性の影響を受けません。

『writing-mode』との関係

『writing-mode: vertical-rl』(縦書き)を指定した要素内では、主軸と交差軸の方向が通常とは異なります。

writing-mode『row』の方向『column』の方向
horizontal-tb(初期値)横方向(左→右)縦方向(上→下)
vertical-rl縦方向(上→下)横方向(右→左)

日本語の縦書きレイアウトを扱う場合は、『row』と『column』の効く方向が入れ替わることを把握しておく必要があります。

アクセシビリティに関する注意

『row-reverse』と『column-reverse』を使用する際は、アクセシビリティへの影響を考慮する必要があります。

これらの値はCSSによる視覚的な表示順序を変えるだけで、HTMLのDOM順序は変わりません。スクリーンリーダーやキーボードのTabキーによるナビゲーションはDOM順序に従うため、見た目の並び順と操作順序にずれが生じます。

/* 例: 視覚的には「C → B → A」だが、Tabキーでは「A → B → C」の順にフォーカスが移動する */
.container {
    display: flex;
    flex-direction: row-reverse;
}

/* この中にリンクやボタンが含まれていると */
/* 「右のボタンを押したいのに、Tabでは左のボタンに先にフォーカスが当たる」という現象が起きる */

純粋に装飾的な並び替え(テキストのみで操作要素を含まない場合など)であれば大きな問題にはなりませんが、ナビゲーションメニューやフォームなど操作を伴う要素に『reverse』を使う場合は、できるだけHTML側の順序を変えることで対応しましょう。

『column』で『justify-content』が効かない

『flex-direction: column』で『justify-content』を使って縦方向にアイテムを配置しようとしたとき、フレックスコンテナに『height』が指定されていないと効果がありません。コンテナの高さが中身の合計と同じになるため、配置を調整する余白がないからです。

/* NG: heightがないのでjustify-contentが効かない */
.container-ng {
    display: flex;
    flex-direction: column;
    justify-content: center;  /* 効果なし */
}

/* OK: heightを指定すると効くようになる */
.container-ok {
    display: flex;
    flex-direction: column;
    justify-content: center;
    height: 100vh;
}
『reverse』と『justify-content』の組み合わせ

『row-reverse』を指定すると、主軸の方向自体が反転します。そのため『justify-content: flex-start』は「右端」に、『flex-end』は「左端」にアイテムを寄せます。直感と逆になりやすいので注意が必要です。

『flex-direction』と『order』プロパティの混同

アイテムの順序を個別に変えたい場合は『order』プロパティを使います。『flex-direction』の『reverse』は全体の並びを一括で反転させるため、特定のアイテムだけ移動させることはできません。

関連プロパティ
プロパティ概要
display『flex』または『inline-flex』を指定してフレックスコンテナを生成します。『flex-direction』はフレックスコンテナに対してのみ有効です。
flex-wrapアイテムの折り返しを制御します。『flex-direction』で決めた主軸方向に収まりきらないアイテムを次の行に折り返すかどうかを指定します。
flex-flow『flex-direction』と『flex-wrap』の一括指定(ショートハンド)です。例: 『flex-flow: row wrap;』
justify-content主軸方向のアイテム配置を制御します。『flex-direction』の値によって主軸の方向が変わるため、効く方向も変わります。
align-items交差軸方向のアイテム配置を制御します。『flex-direction』の値によって交差軸の方向が変わるため、効く方向も変わります。
order個々のフレックスアイテムの表示順序を指定します。全体の反転ではなく、特定のアイテムの順序を変えたい場合に使います。

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