フレックスボックスしたい(display: block flex)

.cards {
    display: block flex;  /* 1値構文では display: flex; */
    gap: 1rem;
}
<div class="cards">
    <div>1枚目</div>
    <div>2枚目</div>
    <div>3枚目</div>
</div>

フレックスボックス(flexbox)は、1次元(横方向または縦方向)に並べるレイアウト方式です。 親要素を「フレックスコンテナー」、 子要素を「フレックスアイテム」と呼びます。

display: block flexを指定した親要素(フレックスコンテナー)に対して、その直下の子要素(フレックスアイテム)が自動的に1次元に並びます。 デフォルトは横方向(左から右)です。 フレックスアイテムの間隔はgapで指定します。

ヒント

フレックスアイテムとなるのは、フレックスコンテナーの直下の子要素だけです。 孫要素はフレックスアイテムになりません。

フレックスコンテナーの直下の子要素は、ブロック要素(<div>や<p>など)だけでなく、インライン要素(<span>や<a>など)も自動的にフレックスアイテムになります。

注釈

/* 2値構文 */
display: block flex;

/* 1値構文(従来の書き方) */
display: flex;

CSS Display Module Level 3の仕様変更により、2値構文で書くことが推奨されているので、このドキュメントでは2値構文(display: block flex)で書いています。

これまでの1値構文(display: flex)でも同じように解釈されるので、適宜読み替えながら使ってください。

参考

フレックスボックスが登場する前は、floatやinline-blockを使って横並びを作っていました。

.card {
    float: left;
    display: inline-block;
    margin-right: 1rem;
}

縦並びにしたい(flex-direction)

.stack {
    display: block flex;
    flex-direction: column;
    gap: 0.5rem;
}

flex-directionで、アイテムを並べる向きを変更できます。 デフォルトはrowで横方向に並びます。 columnで縦方向に並べることができます。

<!-- index.html -->
<style>
    body {
        display: block flex;
        flex-direction: column;
        gap: 1rem;
    }
</style>

<body>
    <header>ヘッダー</header>
    <main>メインコンテンツ</main>
    <footer>フッター</footer>
</body>

bodyを縦方向のフレックスコンテナーにしておくと、ヘッダー・メインコンテンツ・フッターを縦に並べることができます。

中央揃えしたい(justify-content / align-items)

.container {
    display: block flex;
    justify-content: center;  /* 主軸(横方向)の位置 */
    align-items: center;      /* 交差軸(縦方向)の位置 */
    height: 200px;
}

justify-contentで主軸(横方向)の配置、 align-itemsで交差軸(縦方向)の配置を変更できます。

フレックスコンテナーのデフォルトは、主軸が横方向です。 justify-content: centerで左右中央揃え、 align-items: centerで上下中央揃えにすると、 要素をコンテナーのど真ん中に配置できます。

均等配置したい(justify-content)

.nav {
    display: block flex;
    justify-content: space-between;
}

justify-contentで、アイテム間の余白設定を変更できます。

space-betweenでコンテナー幅を基準に均等揃え、 space-aroundで各アイテムの左右に余白をつけて配置、 space-evenlyでアイテム間と両端の余白をすべて均等揃えにして配置できます。

「左にロゴ、右にナビゲーション」を作るときはspace-betweenをよく使います。

折り返したい(flex-wrap)

.cards {
    display: block flex;
    flex-wrap: wrap;
    gap: 1rem;
}

.card {
    width: 200px;
}
<div class="cards">
    <div class="card">1枚目</div>
    <div class="card">2枚目</div>
    <div class="card">3枚目</div>
</div>

flex-wrap: wrapで、フレックスアイテムの内容を折り返して表示できます。

デフォルトはnowrapとなっていて、折り返しがありません。 表示幅が足りない場合は、1行に収まるように縮められます。 カード一覧のように「画面が広ければ横に並べ、狭ければ折り返したい」ときに使います。

幅を自動調整したい(flex)

.item {
    flex: 1;
}

flexプロパティで、フレックスアイテムの幅を指定できます。 flex: 1を指定したアイテムを複数並べると、等幅になります。

.item-a {
    flex: 2;
}
.item-b {
    flex: 1;
}

flexの値を変えると、アイテムごとの幅の比率を変えられます。 上記は2:1の比率で幅を分ける例です。

.sidebar {
    flex: 0 0 240px;
}

.main {
    flex: 1;
}

flexの3値構文は、「伸びやすさ・縮みやすさ・基準の幅」をまとめて指定できます。 上記のサンプルでは、 サイドバー(.sidebar)を固定幅(240px)にして、 本文(.main)を残りの幅というレイアウトにしています。

並び順を変えたい(order)

.item-a { order: 2; }
.item-b { order: 1; }

orderプロパティで、HTMLの記述順を変えずに、表示上の並び順だけを入れ替えられます。 数値が小さいアイテムほど先に表示されます。初期値は0です。

画面が狭いときだけ特定の要素を先頭に出す、といった調整に使います。 ただし読み上げ順やキーボード操作の順序はHTMLのままなので、多用しないほうがよいです。

リファレンス