1. ホーム
  2. ハイパーリンク

[解決済み】CSSグリッドのセンタリングについて

2022-04-15 19:43:08

質問

CSS Gridで簡単なページを作ろうとしています。

私が失敗しているのは、HTMLからそれぞれのグリッドセルにテキストをセンタリングすることです。

コンテンツを別の div の内側と外側の両方にあります。 left_bgright_bg セレクタで選択し、CSS プロパティをいくつか弄ってみましたが、効果はありませんでした。

どうすればいいのでしょうか?

html,
body {
  margin: 0;
  padding: 0;
}

.container {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 100vh;
  grid-gap: 0px 0px;
}

.left_bg {
  display: subgrid;
  background-color: #3498db;
  grid-column: 1 / 1;
  grid-row: 1 / 1;
  z-index: 0;
}

.right_bg {
  display: subgrid;
  background-color: #ecf0f1;
  grid-column: 2 / 2;
  grid_row: 1 / 1;
  z-index: 0;
}

.left_text {
  grid-column: 1 / 1;
  grid-row: 1 / 1;
  position: relative;
  z-index: 1;
  justify-self: center;
  font-family: Raleway;
  font-size: large;
}

.right_text {
  grid-column: 2 / 2;
  grid_row: 1 / 1;
  position: relative;
  z-index: 1;
  justify-self: center;
  font-family: Raleway;
  font-size: large;
}
<div class="container">
  <!--everything on the page-->

  <div class="left_bg">
    <!--left background color of the page-->
  </div>
</div>

<div class="right_bg">
  <!--right background color of the page-->
</div>

<div class="left_text">
  <!--left side text content-->
  <p>Review my stuff</p>

  <div class="right_text">
    <!--right side text content-->
    <p>Hire me!</p>
  </div>
</div>

解決方法は?

この回答は大きく2つのセクションに分かれています。

  1. CSS Gridにおけるアライメントの仕組みを理解する。
  2. CSS Gridで中央揃えにするための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 グリッドアイテムの値は ブロック化 : もし 指定された display を生成している要素のインフロー子要素の グリッドコンテナがインラインレベルの値である場合、その値に計算されます。 ブロックレベルに相当する。

での ブロックフォーマットコンテキスト を使用すると、何か vertical-align プロパティはもともとそのために設計されたものですが、ブラウザはインラインレベルのコンテナにブロックレベルの要素があることを想定していません。これは無効なHTMLです。


CSSによる位置決め

最後に、Gridでも機能する一般的な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>

この方法の仕組みは、ここで完全に説明します。

Grid仕様の絶対位置決めに関するセクションはこちらです。