CSSグリッドの折り返し


126

メディアクエリを使用せずにCSSグリッドを折り返すことは可能ですか?

私の場合、グリッドに配置したい非決定的な数のアイテムがあり、そのグリッドを折り返したいです。Flexboxを使用すると、適切に適切に間隔を空けることができません。たくさんのメディアクエリも避けたいです。

ここにいくつかのサンプルコードがあります

.grid {
  display: grid;
  grid-gap: 10px;
  grid-auto-flow: column;
  grid-template-columns: 186px 186px 186px 186px;
}

.grid > * {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

そしてここにGIF画像があります:

私が見ているもののGIF画像

余談ですが、私と同じようにすべてのアイテムの幅を指定することを避ける方法を誰かが教えてくれればgrid-template-columnsそれは素晴らしいでしょう。子供には自分の幅を指定することをお勧めします。


2
grid-template-columns: auto auto auto auto;この場合動作しますか?=)
Jakub Chlebowicz 2017年

回答:


219

auto-fillまたはのいずれかauto-fitrepeat()表記の繰り返し数として使用します。

repeat( [ <positive-integer> | auto-fill | auto-fit ] , <track-list> )

auto-fill

場合はauto-fill繰り返し数として与えられたグリッド・コンテナは、関連する軸で明確なサイズまたは最大サイズを持っている場合は、その後、繰り返し回数は、グリッドがグリッドコンテナをオーバーフローさせていない可能な最大の正の整数です。

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, 186px);
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

グリッドは、コンテナーをオーバーフローすることなく、可能な限り多くのトラックを繰り返します。

repeat()表記の繰り返し数として自動入力を使用する

この場合、上記の例(画像を参照)の場合、オーバーフローせずにグリッドコンテナーに収まるのは5トラックのみです。グリッドには4つのアイテムしかないため、残りのスペース内に5番目のアイテムが空のトラックとして作成されます。

残りのスペースの残りのトラック#6は、明示的なグリッドを終了します。これは、別のトラックを配置するための十分なスペースがなかったことを意味します。


auto-fit

auto-fitキーワードは、同じように動作しauto-fillた後ことを除いて、グリッド項目の配置アルゴリズムの残りのスペース内の任意の空のトラックが崩壊になります0

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fit, 186px);
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

グリッドは、コンテナをオーバーフローすることなく、可能な限り多くのトラックを繰り返しますが、空のトラックはに縮小され0ます。

折りたたまれたトラックは、の固定トラックサイズ変更機能を持つものとして扱われ0pxます。

repeat()表記の繰り返し数として自動調整を使用する

auto-fill画像の例とは異なり、空の5番目のトラックは折りたたまれ、4番目のアイテムの直後に明示的なグリッドが終了します。


auto-fillauto-fit

minmax()関数を使用すると、2つの違いが顕著になります。

を使用minmax(186px, 1fr)して、アイテムをから186px186px加え、グリッドコンテナー内の残りのスペースの一部をプラスします。

を使用する場合auto-fill、空のトラックを配置するスペースがなくなると、アイテムは大きくなります。

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(186px, 1fr));
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

を使用するauto-fitと、すべての空のトラックがに折りたたまれているため、アイテムは残りのスペースを埋めるまで大きくなり0pxます。

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fit, minmax(186px, 1fr));
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>


遊び場:

CodePen

オートフィルトラックの検査

自動入力


自動調整トラックの検査

自動調整


3
次の行にあるものを中央に配置する方法はありますか?
kentcdodds 2017年

フレックスボックスの場合と同様に、display: grid要素の使用justify-content: center
Spittal

親愛なる@Ricky minmaxの最初のプロパティがそうなるようにする方法。repeat(auto-fill, minmax(186px, 1fr));ピクセルではありませんが、div内にテキストがある限り
mesqueeb 2018

1
@mesqueeb不可能です。一定のサイズが必要です。詳細については、この回答をご覧ください。
リッキー、

1
次の行に移動する必要があるときに、1つだけではなく2つの項目がダウンするようにする方法はありますか?それで、4から2へ1が好きで、4から3へ2から1が好きではないですか?
sammiepls

16

あなたはどちらか、auto-fitまたは関数のauto-fill内部が必要ですrepeat()

grid-template-columns: repeat(auto-fit, 186px);

minmax()を使用して柔軟な列サイズを可能にすると、2つの違いが明らかになります。

grid-template-columns: repeat(auto-fill, minmax(186px, 1fr));

これにより、列のサイズを変更できます。範囲は186ピクセルから、コンテナの全幅に広がる等幅の列までです。auto-fill幅に収まるだけの列を作成します。たとえば、グリッド項目が4つしかなくても5つの列が収まる場合、5番目の空の列があります。

ここに画像の説明を入力してください

auto-fit代わりにを使用すると、空の列が防止され、必要に応じてさらに拡張されます。

ここに画像の説明を入力してください


7

あなたが探している可能性がありますauto-fill

grid-template-columns: repeat(auto-fill, 186px);

デモ:http : //codepen.io/alanbuchanan/pen/wJRMox

利用可能なスペースをより効率的に使い切るには、を使用して、2番目の引数としてminmax渡しautoます。

grid-template-columns: repeat(auto-fill, minmax(186px, auto));

デモ:http : //codepen.io/alanbuchanan/pen/jBXWLR

空の列が必要ない場合は、のauto-fit代わりに使用できますauto-fill


2
次の行にあるものを中央に配置する方法はありますか?
kentcdodds 2017年

3

私も同じような状況でした。あなたがしたことに加えて、空の列を左または右に配置できないようにしながら、列をコンテナの中央に配置したいと思いました。

.grid { 
    display: grid;
    grid-gap: 10px;
    justify-content: center;
    grid-template-columns: repeat(auto-fit, minmax(200px, auto));
}

「彼らのために空の列を許可していないながら、」:あなたが意味するか、「空の列を許可されていないがどちらか彼らのために」すぎどちらか)?または「それらに空の列を許可しない」toなし)?それとも何か(それは計算しないようです)?
Peter Mortensen

1

これが私の試みです。ふわふわ失礼しました

私の方法は、親であるdivとの固定 寸法。残りはそれに応じてそのdiv内のコンテンツに適合しているだけです。

これにより、アスペクト比に関係なく画像が再スケーリングされます。難しいトリミングもありません

body {
    background: #131418;
    text-align: center;
    margin: 0 auto;
}

.my-image-parent {
    display: inline-block;
    width: 300px;
    height: 300px;
    line-height: 300px; /* Should match your div height */
    text-align: center;
    font-size: 0;
}

/* Start demonstration background fluff */
    .bg1 {background: url(https://unsplash.it/801/799);}
    .bg2 {background: url(https://unsplash.it/799/800);}
    .bg3 {background: url(https://unsplash.it/800/799);}
    .bg4 {background: url(https://unsplash.it/801/801);}
    .bg5 {background: url(https://unsplash.it/802/800);}
    .bg6 {background: url(https://unsplash.it/800/802);}
    .bg7 {background: url(https://unsplash.it/802/802);}
    .bg8 {background: url(https://unsplash.it/803/800);}
    .bg9 {background: url(https://unsplash.it/800/803);}
    .bg10 {background: url(https://unsplash.it/803/803);}
    .bg11 {background: url(https://unsplash.it/803/799);}
    .bg12 {background: url(https://unsplash.it/799/803);}
    .bg13 {background: url(https://unsplash.it/806/799);}
    .bg14 {background: url(https://unsplash.it/805/799);}
    .bg15 {background: url(https://unsplash.it/798/804);}
    .bg16 {background: url(https://unsplash.it/804/799);}
    .bg17 {background: url(https://unsplash.it/804/804);}
    .bg18 {background: url(https://unsplash.it/799/804);}
    .bg19 {background: url(https://unsplash.it/798/803);}
    .bg20 {background: url(https://unsplash.it/803/797);}
/* end demonstration background fluff */

.my-image {
    width: auto;
    height: 100%;
    vertical-align: middle;
    background-size: contain;
    background-position: center;
    background-repeat: no-repeat;
}
<div class="my-image-parent">
    <div class="my-image bg1"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg2"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg3"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg4"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg5"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg6"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg7"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg8"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg9"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg10"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg11"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg12"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg13"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg14"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg15"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg16"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg17"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg18"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg19"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg20"></div>
</div>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.