CSS グリッド – テーブル レイアウトが復活しました。存在感をアピールし、正方形に。

Surma
Surma

要約

Flexbox に慣れていれば、Grid も見覚えがあるはずです。 Rachel Andrew さんは、 CSS グリッド専用のウェブサイトで、 開始しました。Google Chrome でグリッドをご利用いただけるようになりました。

Flexbox か?グリッド?

CSS Flexbox はここ数年で広く普及し ブラウザ サポートは非常に良い (ただし、IE9 以下をサポートしなければならない場合は除きます)。 Flexbox では、等間隔のスペース配置など、多くの複雑なレイアウト作業が簡単になりました。 要素間、トップ ツー ボトム レイアウト、CSS ウィザードなど、 縦方向の中央に配置されます。

複数の Flexbox コンテナ間で要素を配置する方法はありません。

残念ながら、画面には一般的に 2 つ目の次元について考慮する必要があります。 要素のサイズ調整を自分で行うのではなく、 垂直方向と水平方向のリズムを表現できます。これは、 そこで役立つのが CSS グリッドです

CSS グリッドは開発中で、ほとんどのブラウザで 5 年と、相互運用性の問題を回避するための追加の時間を バグの多いリリースでしたそのため、グリッドを使用してレイアウトを Firefox と Safari でも同じ結果が表示される可能性があります。Google Microsoft Edge の Grid 実装は最新ではありません IE11 ですでに存在していたものと同じです)。更新は 「検討中」。

コンセプトと構文は類似しているが、Flexbox と Grid は 競合するレイアウト手法です。グリッドは 2 次元に配置され、Flexbox では 説明しますこの 2 つを併用することで相乗効果が生まれます。

グリッドの定義

Grid の個々のプロパティに慣れるため、 Rachel Andrew による Grid By Example または CSS Tricks' クイック リファレンス。もし Flexbox に慣れているとしたら、多くのプロパティとその意味を 見慣れたものです

標準的な 12 列のグリッド レイアウトを見てみましょう。従来の 12 列 12 という数字は 2、3、4、6 で割り切れるため、 多くの設計に有用ですこのレイアウトを実装してみましょう。

複数の Flexbox コンテナ間で要素を配置する方法はありません。

では、マークアップ コードを見てみましょう。

<!DOCTYPE html>
<body>
    <header></header>
    <nav></nav>
    <main></main>
    <footer></footer>
</body>

スタイルシートでは、まず body を拡張して、 これをグリッド コンテナに変換するには:

html, body {
    width: 100vw;
    min-height: 100vh;
    margin: 0;
    padding: 0;
}
body {
    display: grid;
}

ここでは、CSS グリッドを使用しています。送信しました

次のステップでは、グリッドの行と列を実装します。私たちは 12 列すべてをモックアップに実装しますが、すべての列を使用するわけではないため、 CSS が不必要に乱雑になりますわかりやすくするため、ここでは レイアウトは次のように実装します���

簡素化されたレイアウトの例

ヘッダーとフッターの幅が可変であり、コンテンツも可変である 表しま���������ー���ョンはどちらのディメンションでも可変ですが、 最小幅 200 ピクセルを設定します(理由:Google Cloud の機能を もち��ん CSS グリッドを使うこともできます)。

CSS グリッドでは、列と行のセットはトラックと呼ばれます。まず、 最初のトラックセット、次の行を定義します。

body {
    display: grid;
    grid-template-rows: 150px auto 100px;
}

grid-template-rows は、個々の行を定義する一連のサイズを受け取ります。 この例では、最初の行の高さを 150px、最後の行の高さを 100px に設定しています。 中央の行は auto に設定されています。これは、必要な値に合わせて調整されることを意味します。 グリッド アイテムグリッド コンテナの子)に対応する高さを 表示されます。ボディはビューポート全体に引き伸ばされるため、トラックは コンテンツ(上の画像の黄色)を含むすべてのレイヤが、 スクロール可能なスペースが増えます。 できます。

列には、より動的なアプローチを取ります。ナビゲーションと コンテンツを拡大(縮小)するが、ナビゲーションを 200 ピクセル以下には縮小しない コンテンツをナビゲーションより大きくしますFlexbox では Flex-grow と flex-shrink ですが、Grid では若干異なります。

body {
    display: grid;
    grid-template-rows: 150px auto 100px;
    grid-template-columns: minmax(200px, 3fr) 9fr;
}

2 つの列を定義します。最初の列は、minmax() を使用して定義します。 関数で指定し、トラックの最小値と最大値の 2 つの値を取ります。 (min-widthmax-width をひとつにしたようなものです)。最小の幅は、 200 ピクセルです。最大幅は 3fr です。fr はグリッド固有です。 グリッド要素に使用可能なスペースを配分できます。 fr はおそらく「fraction unit」の略ですが、「free unit 近日」という意味の場合もあります。 ここでの値は、両方の列が画面いっぱいに拡大することを意味しますが、 コンテンツ列の幅は常にナビゲーション列の 3 倍になります( nav 列の幅を 200 ピクセル以上にするなど)。

グリッド アイテムの配置はまだ正しくありませんが、グリッド アイテムのサイズは 行と列��正しく動作し、期待していた動作が得られているかどうか。

アイテムの配置

グリッドの最も強力な機能の一つは、ファイルなしでアイテムを配置できることです。 関連しています(ただし、スクリーン リーダーは DOM 内を移動するため、 適切にアクセスできるようにするには 要素を並べ替えることができます)。手動で配置しない場合は、要素が DOM 順でグリッド上に、左から右、上から下に配置されます。各要素 1 つのセルを占有します。グリッドを塗りつぶす順序は、 grid-auto-flow

では、要素をどのように配置すればよいのでしょうか。グリッド アイテムを配置する最も簡単な方法は、 対象となる列と行を定義しますGrid では、これを行うための 2 つの構文が用意されています。 最初の構文では、開始点と終了点を定義します。2 つ目のルールでは、 2 つの部分で構成されています。

header {
    grid-column: 1 / 3;
}
nav {
    grid-row: 2 / span 2;
}
手動での配置

ヘッダーを 1 列目に開始し、3 列目ので終わるようにします。 ナビゲーションは 2 行目から始まり、合計 2 行にまたがります。

技術的にはレイアウトの実装は終わりましたが、いくつかご紹介したいと思います。 グリッドに用意されている便利な機能により、配置が簡単になります。「 1 つ目の機能として、トラックの境界に名前を付けて、その名前を プレースメント:

body {
    display: grid;
    grid-template-rows: 150px [nav-start] auto 100px [nav-end];
    grid-template-columns: [header-start] minmax(200px, 3fr) 9fr [header-end];
}
header {
    grid-column: header-start / header-end;
}
nav {
    grid-row: nav-start / nav-end;
}

上記のコードでは、前のコードと同じレイアウトが生成されます。

さらに強力な機能として、グリッド内で地域全体に名前を付けることができます。

body {
    display: grid;
    grid-template-rows: 150px auto 100px;
    grid-template-columns: minmax(200px, 3fr) 9fr;
    grid-template-areas: "header header"
                        "nav    content"
                        "nav    footer";
}
header {
    grid-area: header;
}
nav {
    grid-area: nav;
}

grid-template-areas はスペースで区切られた名前の文字列を受け取り、 各セルに名前を付けることができます。隣接する 2 つのセルの名前が同じ場合、 同��領域に結合されますこのように レイアウト コードに追加して、メディアクエリを直感的に行えるようにします。繰り返しますが、 以前と同じレイアウトが生成されます。

他にもあります。

はい、1 つのブログ投稿では説明しきれないほど多くの情報があります。 Rachel Andrew: GDE は、 CSS ワーキング グループのエキスパートで、初期段階から協力している ウェブデザインをシンプルにします彼女は、 予約します。彼女 ウェブサイト Grid By Example は、 主なリソースをご紹介します。多くの人が、グリッドは 革命的 ウェブデザインに関する新しい手順が Chrome でデフォルトで有効になりました。 すぐに使い始められます。