Kodokon kodokon.com

エキスパートのグリッド: subgrid、auto-fit、minmax

メディアクエリなしで自己適応するグリッドを構築し、subgrid で入れ子のコンポーネントを親のトラックに揃えましょう。

10 分 · 3 問

このレッスンを Kodokon で開く

repeat(auto-fill, ...)repeat(auto-fit, ...) は、コンテナの幅が許すだけのトラックを作ります。違いが現れるのは、アイテムが可能なトラック数より少ないときだけです。auto-fill は空のトラックを保持します(2枚のカードは最小サイズのままとどまり、右側には空きスペースが残ります)。一方 auto-fit空のトラックをゼロに畳み込みます。占有されているトラックは、1fr の最大値を与えられているので、解放されたスペースをすべて吸収し、2枚のカードは幅いっぱいに広がります。

CSS
.gallery-fill {
  display: grid;
  grid-template-columns: repeat(
    auto-fill, minmax(150px, 1fr)
  );
}
.gallery-fit {
  display: grid;
  grid-template-columns: repeat(
    auto-fit, minmax(150px, 1fr)
  );
}
900px の中に2アイテムの場合: fill は6トラックを保持し(2つは満杯、4つは空)、fit は空のものを畳み込んで2アイテムを引き伸ばします。

ベテラン開発者でさえはまる minmax() の2つの罠があります。1つ目。minmax(240px, 1fr) は、コンテナが240pxより狭いときにあふれます。最小値は動かせない下限だからです。定石となる修正は、比較関数を入れ子にすることです。minmax(min(100%, 240px), 1fr) のように。2つ目。1fr 単独は minmax(auto, 1fr) と等価です。この auto の最小値は、分割不可能なコンテンツ(長いURL、<pre>)がトラックをその取り分を超えて広げることを許してしまいます。minmax(0, 1fr) が分配を固定します。

CSS
.grid {
  display: grid;
  gap: 1rem;
  grid-template-columns: repeat(
    auto-fit,
    minmax(min(100%, 240px), 1fr)
  );
}
メディアクエリなしの、定番のレスポンシブグリッド。240px未満の幅でも決してあふれません。

subgrid は、入れ子のコンポーネントをまたいだ揃えという古い問題を解決します。grid-template-rows: subgrid を使うと、内側のグリッドは自前のトラックを作り出しません。またがっている領域にわたって親のトラックを採用します。さらに、親の行名(そして自前のものも追加できます)や、ローカルで上書き可能な gap も継承します。典型的なケースは、タイトル、説明、フッターが、コンテンツの長さがどうであれ、カードからカードへ水平に揃うようなカードです。subgrid 以前にはきれいに実現できませんでした。各カードが高さを孤立して計算していたからです。

CSS
.cards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.5rem;
}
.card {
  grid-row: span 3;
  display: grid;
  grid-template-rows: subgrid;
  row-gap: 0.5rem;
}
各カードは親の3行にまたがり、それらを採用します。タイトル、テキスト、フッターがカードをまたいで揃います。

理解度チェック

このレッスンの要点をしっかり覚えているか確認しましょう。

  1. コンテナは6トラックを収められるのに、アイテムが2つしかありません。auto-fill と auto-fit の違いは何ですか?
    • 違いはない。同じ値の2つのエイリアスである
    • auto-fill は空のトラックを4つ保持し、auto-fit はそれらを畳み込んで2アイテムを引き伸ばす
    • auto-fit は常に auto-fill より多くのトラックを作る
  2. grid-template-rows: subgrid で宣言された要素が正確に採用するものは何ですか?
    • 親の行数だけ
    • またがった領域にわたる親のトラックサイズと行名、そして継承されるが上書き可能な gap
    • 名前付き領域を含む、親のすべてのグリッドプロパティ
  3. なぜ minmax(240px, 1fr) ではなく minmax(min(100%, 240px), 1fr) と書くのですか?
    • すべての画面で240pxを保証するため
    • コンテナが240pxより狭いときのあふれを避けるため
    • Grid Level 2 以降、repeat() の中では min() が必須になったから