2つのアイテムでグリッドを設定しました。このグリッドには任意の数のアイテムを含めることができますが、この例では2つで十分です。
この例では、左に揃えられた2つの灰色のボックスがあります。ワイド画面(1000px以上)でインスペクターを使用すると、残りのスペースを埋める3番目(またはそれ以上)の「シャドウ」アイテムを見つけることができます。
ボックスをグリッドの中央に配置するにはどうすればよいですか? 「影」のようなアイテムは存在しません。
.grid
要素自動メディアクエリを記述する必要がないため、グリッドを引き続き使用します。ラッパーで、何でも行きます。
また、固定幅はオプションではありません。
.wrap {
display: flex;
flex-direction: column;
/*justify-content: center;
align-items: center;*/
}
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
grid-gap: 1rem;
}
.item {
background: #eee;
}
<div class="wrap">
<div class="grid">
<div class="item">
Item 1
</div>
<div class="item">
Item 2
</div>
</div>
</div>
フレックスアイテムはグリッドアイテムのような個々のトラック(列/行)に限定されないため、問題に対する最も効率的な解決策はおそらくフレックスボックスです。
_.grid {
display: flex;
flex-wrap: wrap;
margin-bottom: 1em;
}
.item {
flex: 1 0 100px;
background: #eee;
text-align: center;
border: 1px dashed gray;
box-sizing: border-box;
}
_
_<div class="grid">
<div class="item">Item 1</div>
</div>
<div class="grid">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
</div>
<div class="grid">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item">Item 3</div>
</div>
<div class="grid">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item">Item 3</div>
<div class="item">Item 4</div>
</div>
_
しかし、グリッドレイアウトを使い続けたい場合は、考慮すべき問題と考えられる解決策を以下に示します。
1fr
_コードで行うように_1fr
_と言うと、「すべての空き領域を消費する」を意味します。ただし、空き領域がない場合は、配置できません。
キーワードアライメントプロパティ(つまり、_justify-*
_および_align-*
_)は、空き領域を分散することによって機能します。左揃え、右揃え、_space-between
_、_space-around
_、または中央に、空き領域がない場合、それらを配置することはできません。
これはグリッドの動作だけではありません。これは標準のHTML/CSSです。デフォルトでは、div
はブロックレベルの要素です。これは、親の100%の幅を占めることを意味します。したがって、div
を中央に配置することはできません(デフォルトの設定を上書きしない限り)。
グリッドの列と行は、コンテナー全体に広がります。したがって、_auto-fill
_が作成されると、たとえば、3つの列がある場合、後続のすべての行には3つの列があります。
最初の行に3つのグリッドアイテムがあり、2番目の行に2つのグリッドアイテムがある場合でも、2番目の行には3番目の列があり、スペースを占めています。したがって、2番目の行の2つのアイテムを行の中央に配置することはできません。
auto-fill
_repeat()
関数が_auto-fill
_または_auto-fit
_に設定されている場合、コンテナーはコンテナーをオーバーフローせずにできるだけ多くのグリッドトラックを作成します。
_auto-fill
_を使用すると、作成されたすべてのトラックを満たすグリッドアイテムがない場合、これらのトラックが保持されます。基本的に、グリッドレイアウトはアイテムの有無にかかわらず固定されたままです。
あなたはあなたの質問でこれを指摘しました。 2つのグリッドアイテムがありますが、他の「シャドウ」アイテムも存在します。これらの「シャドウ」アイテムはグリッドアイテムではないことに注意してください。それらは空のグリッドセルです。
グリッドセルが空であるため、グリッドアイテムを中央に配置するための空き領域が残っていません。
auto-fit
__auto-fit
_キーワードは、これ以外は_auto-fill
_と同じです(空のトラックは折りたたまれます。
あなたのケースでは、minmax()
関数の最大サイズとして_1fr
_を設定しているため、余分なスペースが両方のグリッド項目に分散されます。
ここでも、中央揃えはできませんが、今回はfr
ユニットがすべての空き領域を消費しているためです(上記の_1fr
_セクションで説明)。
justify-content: center
_上記のように、グリッド項目を中央に配置することはできません。これは、整列のためにライン上に使用可能な空きスペースがないためです。
これを回避する1つの方法として、列のサイズを柔軟に変更できますが、_max-content
_ではなく_1fr
_を使用する代わりに_auto-fit
_を使用することができます。
_.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(100px, max-content));
justify-content: center;
grid-gap: 1rem;
}
.item {
background: #eee;
}
_
_<div class="grid">
<div class="item">Item 1</div>
</div>
<hr>
<div class="grid">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
</div>
<hr>
<div class="grid">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item">Item 3</div>
</div>
<hr>
<div class="grid">
<div class="item">Item 1</div>
<div class="item">Item 2</div>
<div class="item">Item 3</div>
<div class="item">Item 4</div>
</div>
_
問題は、auto-fill
を使用すると空の列が大量に作成されるため、justify-items:center
が期待どおりに動作しないことです。
代わりにauto-fit
を使用する必要があります。
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
grid-gap: 1rem;
justify-items:center;
}