コンテンツがグリッドアイテムを拡張しないようにする


153

TL; DR:table-layout: fixed CSSグリッドのようなものはありますか?


私は、月を表す4x3の大きなグリッドと、日を表す7x6のグリッドがネストされた年表示のカレンダーを作成しようとしました。

カレンダーはページを埋める必要があるため、年グリッドコンテナーの幅と高さはそれぞれ100%になります。

.year-grid {
  width: 100%;
  height: 100%;

  display: grid;
  grid-template: repeat(3, 1fr) / repeat(4, 1fr);
}

.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
}

これが実際の例です:https : //codepen.io/loilo/full/ryXLpO/

簡単にするために、そのペンでは毎月31日あり、月曜日から始まります。

また、問題を示すために、途方もなく小さいフォントサイズを選択しました。

グリッドアイテム(=日のセル)は、ページ上に数百個あるため、かなり凝縮されています。そして、日番号のラベルが大きくなりすぎると(左上のボタンを使用してペンのフォントサイズを自由に試してみてください)、グリッドのサイズが大きくなり、ページの本文サイズを超えます。

この動作を防ぐ方法はありますか?

私は最初に年グリッドの幅と高さを100%と宣言したので、それがおそらく最初のポイントですが、そのニーズに合うグリッド関連のCSSプロパティを見つけることができませんでした。

免責事項: CSSグリッドレイアウトを使用せずに、そのカレンダーのスタイルを設定する簡単な方法があることを知っています。ただし、この質問は、具体的な例を解くというよりは、トピックに関する一般的な知識に関するものです。


代わりに何をしたいですか?各セルのフォントはどのようなサイズでもかまいませんが、グリッドセルのサイズが大きくなることはありませんか?
Michael Coker

1
丁度。基本的に、グリッドアイテムのサイズを分数ではなくパーセンテージの値に合わせて設定した場合に発生するより便利な方法です。
Loilo

私は基本的にtable-layoutのgrid-layoutyバージョンを探しています:修正(参照:codepen.io/loilo/pen/dvxpvq?editors=1100
Loilo

7
これは、CSSグリッド仕様全体で最大の問題です。それらは、グリッド領域が親グリッドコンテナーの寸法をエスケープできない設定である必要があります。そのままでは、深くネストされたグリッド構造にとっては悪夢です。
ロニーベスト

回答:


263

デフォルトでは、グリッド項目はそのコンテンツのサイズよりも小さくすることはできません。

グリッドアイテムの初期サイズはmin-width: autoおよびmin-height: autoです。

グリッド項目をmin-width: 0に設定するmin-height: 0overflow、以外の値でこの動作を上書きできますvisible

スペックから:

6.6。グリッドアイテムの自動最小サイズ

グリッドアイテム、ことを本明細書の定義のためのより合理的なデフォルトの最小サイズを提供するためautoの値min-width/ min-heightまた、そのグリッド項目に指定された軸に自動最小サイズを適用しoverflowていますvisible。(効果は、フレックスアイテムに課される自動最小サイズに類似しています。)

以下は、フレックスアイテムに関する詳細な説明ですが、グリッドアイテムにも適用されます。

この投稿では、ネストされたコンテナの潜在的な問題と、主要なブラウザ間での既知のレンダリングの違いについても説明しています


レイアウトを修正するには、コードを次のように調整します。

.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
  background: #fff;
  grid-gap: 2px;
  min-height: 0;  /* NEW */
  min-width: 0;   /* NEW; needed for Firefox */
}

.day-item {
  padding: 10px;
  background: #DFE7E7;
  overflow: hidden;  /* NEW */
  min-width: 0;      /* NEW; needed for Firefox */
}

改訂されたコードペン


1frminmax(0, 1fr)

上記のソリューションはグリッドアイテムレベルで動作します。コンテナーレベルのソリューションについては、次の投稿を参照してください。


3
ワオ。それは魅力的で興味深いと同時に、私はあちこち試してみてそれを思いついたはずがありません。その情報の仕様を一目見ただけですか?グーグルの目的がわからないので、それを試してみましたが、結局間違ったセクションを読んでしまいました(問題の間違った原因を結論付けた後)。
Loilo

1
以前、フレックスアイテムでこの問題に遭遇しました。フレックスアイテムとグリッドアイテムの間には多くの類似点があるため、動作は同じであり、仕様のそのセクションではゼロになる可能性があると考えました。
マイケルベンジャミン

1
それは高さを固定しますが、水平方向に成長し続け、min-width: 0;助けにはなりません。私は何かを逃していますか?
ユーザーの

2
ネストされたグリッドの場合、これをすべてのレベルに適用する必要があります。しかし、私は本当に.. upvoteためにここに来て、あなたに感謝
コツ


57

前の答えはかなり良いですが、グリッドに相当する固定レイアウトあることも言及したいと思います。トラックサイズとしてではminmax(0, 1fr)なく、単に記述する必要があり1frます。


6
以前の受け入れられた答えよりもこのアプローチをお勧めします。
ティエリープロスト

これは機能しますが、少しはわかりません...なぜこれが機能するのか説明してもらえますか?minmax(0、1fr)は何をしていますか?常に0である必要はありませんか?私は混乱しています:(
BAERUS

2
minmax(0, 1fr)ので、作品1frのための速記本当にminmax(auto,1fr)元の質問に対する正しい値ではありません。
ミッコランタライネン


1

既存の回答はほとんどの場合を解決します。ただし、グリッドセルのコンテンツをにする必要がある場合がありますoverflow: visible。私は次のように、ラッパー内に絶対的に配置することで解決しました(理想的ではありませんが、私が知っている最良のものです)。


.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
  background: #fff;
  grid-gap: 2px;  
}

.day-item-wrapper {
  position: relative;
}

.day-item {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 10px;

  background: rgba(0,0,0,0.1);
}

https://codepen.io/bjnsn/pen/vYYVPZv


0

簡単な方法は、グリッドアイテムの最大幅を次のように設定することです。

//for the container
.gridContainer{
    display: grid;
    grids-templates-column: repeat (12, 1fr);
 }

 //for the grid item
 .gridItem{
       max-width: 100%;
       grid-column: span 4  //4 can be any number from1-12 as we specified in the grid template
  }

私は正直に言うと少し混乱しています。コードは元の質問にまったく似ていません。グリッドアイテムにmax-width:100%を適用しても(承認されたソリューションのmin-width:0ではなく)問題は解決しません...
Loilo

max-widthは、子の幅に対して相対的に再調整されないようにします
Pedro JR

私はあなたのコードを再現しようとしましたが、実際には機能しますが、max-width:100%が原因ではなく、grid-column:span 4が原因です。開始列を定義せずに。開始列を定義し(たとえば、grid-column:1 / span 4;を使用して)、レイアウトが再び壊れます。(その動作は少し奇妙ですが、仕様のどこかにこれが定義されているコーナーがあると確信しています。)
Loilo

いいですね。しかし、あなたはまだ私に対する賛成投票を考慮していません
ペドロJR

率直に言って:1.これは3年以上にわたって解決された問題です。2.回答が適切にテストされていません(CSSに複数のタイプミスが含まれているため、ブラウザーがグリッドを認識する前に修正する必要があります)。そして、3。あなたの答えは実際に私の質問の例に対応していませんでした(そうでなければ、あなたの解決策がそれで機能しないことに気づいたでしょう)。—いいえ、申し訳ありませんが、賛成票は検討していません。
ロイロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.