メディアクエリを使用せずに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です。
ちなみに、私がgrid-template-columns
を使っているときのようにすべての項目の幅を指定するのを避けることができる方法を誰かに教えてもらえればそれは素晴らしいことです。私は子供たちに彼ら自身の幅を指定することを好みます。
auto-fill
または auto-fit
のいずれかを repeat()
の繰り返し回数として使用します。
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>
グリッドは、コンテナをオーバーフローさせずにできるだけ多くのトラックを繰り返します。
この場合、上記の例(画像を参照)を考えると、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
の固定トラックサイジング機能を持つものとして扱われます。
auto-fill
イメージの例とは異なり、空の5番目のトラックは折りたたまれ、4番目の項目の直後で明示的なグリッドが終了します。
auto-fill
とauto-fit
この2つの違いは、 minmax()
関数を使用したときに顕著になります。
minmax(186px, 1fr)
を使用して、186px
から186px
までの項目にグリッドコンテナー内の残りのスペースの一部を追加します。
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>
遊び場:
オートフィルトラックの検査
自動調整トラックの検査
repeat()
関数内にauto-fit
またはauto-fill
が必要です。
grid-template-columns: repeat(auto-fit, 186px);
この2つの違いは、柔軟な列サイズを可能にするためにminmax()
も使用すると明らかになります。
grid-template-columns: repeat(auto-fill, minmax(186px, 1fr));
これにより、186ピクセルからコンテナの幅いっぱいに広がる等幅のカラムまで、カラムのサイズを柔軟に変更できます。 auto-fill
は幅に収まるだけの数の列を作成します。たとえば、グリッド項目が4つしかなくても5つの列が収まる場合は、5番目の空の列が表示されます。
代わりにauto-fit
を使用すると、空の列を防ぐことができ、必要に応じて列をさらに伸ばすことができます。
auto-fill
をお探しですか?
grid-template-columns: repeat(auto-fill, 186px);
デモ: http://codepen.io/alanbuchanan/pen/wJRMox
利用可能なスペースをより効率的に使い果たすには、minmax
を使用し、2番目の引数としてauto
を渡します。
grid-template-columns: repeat(auto-fill, minmax(186px, auto));
デモ: http://codepen.io/alanbuchanan/pen/jBXWLR
空の列が不要な場合は、auto-fit
の代わりにauto-fill
を使用できます。
私は同様の状況を経験しました。あなたがしたことに加えて、私は自分の列をコンテナの中央に配置し、空の列を左右に配置しないようにしたいと思いました。
.grid {
display: grid;
grid-gap: 10px;
justify-content: center;
grid-template-columns: repeat(auto-fit, minmax(200px, auto));
}
これが私の試みです。 綿毛をすみません、私は特別なクリエイティブを感じていました。
私の方法は、fixeddimensionsを持つ親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>