この回答には2つの主要なセクションがあります。
- CSSグリッドでの配置の仕組みを理解する。
- CSSグリッドでセンタリングするための6つの方法。
ソリューションのみに関心がある場合は、最初のセクションをスキップしてください。
グリッドレイアウトの構造と範囲
グリッドコンテナーでのセンタリングの仕組みを完全に理解するには、グリッドレイアウトの構造とスコープを最初に理解することが重要です。
グリッドコンテナーのHTML 構造には3つのレベルがあります。
これらの各レベルは、グリッドプロパティの適用に関して、他のレベルから独立しています。
グリッドコンテナーのスコープは、親子関係に限定されます。
つまり、グリッドコンテナーは常に親であり、グリッドアイテムは常に子です。グリッドプロパティは、この関係内でのみ機能します。
子を超えたグリッドコンテナーの子孫はグリッドレイアウトの一部ではなく、グリッドプロパティを受け入れません。(少なくともsubgrid
、グリッド項目の子孫がプライマリコンテナーのラインを尊重できるようにする機能が実装されるまでは。)
上記の構造とスコープの概念の例を次に示します。
三目並べのようなグリッドを想像してみてください。
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
}
XとOを各セルの中央に配置します。
したがって、コンテナレベルでセンタリングを適用します。
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
}
ただし、グリッドレイアウトの構造と範囲のためjustify-items
、コンテナーでは、コンテンツではなくグリッドアイテムが(少なくとも直接ではなく)中央に配置されます。
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
}
section {
border: 2px solid black;
font-size: 3em;
}
<article>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
</article>
同じ問題align-items
:コンテンツが副産物として中央に配置される可能性がありますが、レイアウト設計が失われています。
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
align-items: center;
}
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
justify-items: center;
align-items: center;
}
section {
border: 2px solid black;
font-size: 3em;
}
<article>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
</article>
コンテンツを中央に配置するには、別のアプローチをとる必要があります。グリッドレイアウトの構造とスコープを再び参照すると、グリッドアイテムを親として、コンテンツを子として扱う必要があります。
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
}
section {
display: flex;
justify-content: center;
align-items: center;
border: 2px solid black;
font-size: 3em;
}
article {
display: inline-grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
grid-gap: 3px;
}
section {
display: flex;
justify-content: center;
align-items: center;
border: 2px solid black;
font-size: 3em;
}
<article>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
<section>O</section>
<section>X</section>
</article>
jsFiddleデモ
CSSグリッドでセンタリングするための6つの方法
グリッドアイテムとそのコンテンツを中央に配置する方法は複数あります。
基本的な2x2グリッドは次のとおりです。
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
フレックスボックス
グリッドアイテムのコンテンツを中央に配置するシンプルで簡単な方法として、フレックスボックスを使用します。
具体的には、グリッド項目をフレックスコンテナーにします。
このメソッドには、競合、仕様違反、またはその他の問題はありません。クリーンで有効です。
grid-item {
display: flex;
align-items: center;
justify-content: center;
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
display: flex; /* new */
align-items: center; /* new */
justify-content: center; /* new */
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
詳細な説明については、この投稿を参照してください。
グリッドレイアウト
フレックスアイテムもフレックスコンテナーになることができるのと同じように、グリッドアイテムもグリッドコンテナーにすることができます。このソリューションは、中央揃えがフレックスではなくグリッドプロパティで行われることを除いて、上記のフレックスボックスソリューションに似ています。
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
display: grid; /* new */
align-items: center; /* new */
justify-items: center; /* new */
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
auto
マージン
margin: auto
グリッド項目を垂直方向および水平方向に中央揃えするために使用します。
grid-item {
margin: auto;
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
margin: auto;
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
グリッドアイテムのコンテンツを中央に配置するには、アイテムをグリッド(またはフレックス)コンテナーにして、匿名アイテムを独自の要素でラップし(CSSで直接ターゲットにできないため)、新しい要素にマージンを適用します。
grid-item {
display: flex;
}
span, img {
margin: auto;
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
display: flex;
}
span, img {
margin: auto;
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item><span>this text should be centered</span></grid-item>
<grid-item><span>this text should be centered</span></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
ボックスの配置プロパティ
以下のプロパティを使用してグリッド項目を配置することを検討する場合は、auto
上記のマージンに関するセクションをお読みください。
align-items
justify-items
align-self
justify-self
https://www.w3.org/TR/css-align-3/#property-index
text-align: center
コンテンツをグリッド項目の水平方向の中央に配置するには、text-align
プロパティを使用できます。
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
text-align: center; /* new */
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
垂直方向のセンタリングの場合vertical-align: middle
は機能しないことに注意してください。
これは、vertical-align
プロパティがインラインコンテナーとテーブルセルコンテナーにのみ適用されるためです。
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
text-align: center; /* <--- works */
vertical-align: middle; /* <--- fails */
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item>this text should be centered</grid-item>
<grid-item>this text should be centered</grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
display: inline-grid
インラインレベルのコンテナーが確立されると言う人もいるかもしれませんが、それは事実です。では、なぜvertical-align
グリッドアイテムでは機能しないのでしょうか。
その理由は、グリッド形式のコンテキストでは、アイテムがブロックレベルの要素として扱われるためです。
6.1。グリッドアイテム表示
display
グリッド項目の値は、blockified:指定した場合display
、グリッドコンテナを生成する要素のインフロー子のインラインレベル値で、そのブロックレベルと同等に計算します。
プロパティが元々設計されたブロックフォーマット設定コンテキストでvertical-align
は、ブラウザーはインラインレベルのコンテナー内でブロックレベルの要素を見つけることを期待していません。これは無効なHTMLです。
CSSポジショニング
最後に、グリッドでも機能する一般的なCSSセンタリングソリューションがあります。絶対配置
これは、ドキュメントフローから削除する必要があるオブジェクトを中央に配置するのに適した方法です。たとえば、次のような場合:
単に設定position: absolute
を中心とすることが要素の上に、そしてposition: relative
含むブロックとなる祖先に(通常は親です)。このようなもの:
grid-item {
position: relative;
text-align: center;
}
span {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
grid-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 75px;
grid-gap: 10px;
}
grid-item {
position: relative;
text-align: center;
}
span, img {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
/* can ignore styles below; decorative only */
grid-container {
background-color: lightyellow;
border: 1px solid #bbb;
padding: 10px;
}
grid-item {
background-color: lightgreen;
border: 1px solid #ccc;
}
<grid-container>
<grid-item><span>this text should be centered</span></grid-item>
<grid-item><span>this text should be centered</span></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
<grid-item><img src="http://i.imgur.com/60PVLis.png" width="50" height="50" alt=""></grid-item>
</grid-container>
このメソッドがどのように機能するかについての完全な説明は次のとおりです。
以下は、グリッド仕様の絶対配置に関するセクションです。