Bento UI の制作にも最適!グリッドを有効活用する方法[display: grid]【改訂記事】

display: grid のキャプチャ

Bento UI レイアウトが制作できるジェネレーター

お知らせ:Bento UI のレイアウトが作成できるジェネレーターを制作しました!!

ジェネレーターのURLはこちらです。
display.grid.tedate

前談: display: grid についてのお話

以前の記事、
カード型レイアウトと相性抜群!gapプロパティを使った簡単レイアウト[css]
では、カード型レイアウトともとても相性が良い、
cssの「gapプロパティ」を使ったレイアウト方法についてご紹介しました。

今回の記事では、その「gapプロパティ」と組み合わせて使う上でも便利な
レイアウト手法である、「cssの display: grid プロパティ」によるレイアウトについて書いていきます。

そして後半では、新しいデザイントレンドとして注目されつつある Bento UI についてもふれていきます。

display: grid を指定するだけで、その要素は「グリッドコンテナー」と言う概念になる

それでは、「cssの display: grid プロパティ」によるレイアウトについて見ていきたいと思います。
前回の記事と同様に、次の様なカード型レイアウトをする場合の話です。
gapプロパティを使用したカード型レイアウトの例
↑このようなカード型レイアウトを作成する場合、
従来通り、もちろん display: flex; を使用しても実現が可能ですが、
display: grid; を使用すると、もっと簡単になります。
具体的には、次の様に書きます。

[cssのgridプロパティによるレイアウトの例(css)]

.my-container {
  display: grid;
  gap: 2rem 2%;
  grid-template-columns: 1fr 1fr 1fr;
  margin: 0 auto;
  width: 1200px;
}
...(中略)...

↑各カードが並ぶ想定の、親ボックスに指定するcssとして読んでください。
2行目でまず、display: grid; を指定。
これにより、この親ボックスが「グリッドコンテナー」と言う概念になります。
同時に、その子要素(この例で言うと個々のカード)は「グリッドアイテム」と言う概念になります。

続く3行目では、
前回の記事でも登場した gap です。これで、各カード間の余白を指定しています。

そして4行目。
grid-template-columns: 1fr 1fr 1fr;
という指定がありますが、これが「グリッドアイテム」をどう並べるのか、と言うことを定義している部分になります。
今回は、冒頭のキャプチャの様に「3列」で並べたいため、この指定をしています。

もしも各カードを「1列」で並べたい場合の指定は
grid-template-columns: 1fr;
となり、
もしも各カードを「2列」で並べたい場合の指定は
grid-template-columns: 1fr 1fr;
と指定します。

もしも各カードを「4列」で並べたい場合の指定は
grid-template-columns: 1fr 1fr 1fr 1fr;
を指定すれば良いです。(次のキャプチャの様になります。)
1frを4つ並べれば4列になる

また、最初のカードを2枚分、その隣に1枚ずつ並べる場合は
grid-template-columns: 2fr 1fr 1fr;
と指定します。すると、次の様なレイアウトが実現できます。
2fr-1fr-1fr を指定した場合の例

…いかがでしょうか。
display: flex;
を使った場合のレイアウトに比べて、かなり柔軟に
指定ができると言うことが、お分かりいただけたかと思います。

次のセクションで、htmlを含めたコードの全体像を書いておきます。

コード全体像

「cssの display: grid; プロパティ」を使ったカード型レイアウトの、htmlとcss全体は以下のようになります。

[「cssの display: grid プロパティ」を使ったカード型レイアウト(html側)]

  <div class="my-container">
    <div class="my-item">
      <figure class="my-figure">
        <img class="my-image" src="https://picsum.photos/560/320?grayscale&random=1" alt="サムネイル" />
      </figure>
      <div class="my-description">
        <p class="my-text">display: grid; プロパティを使ったカード型レイアウト</p>
      </div>
    </div>

    <div class="my-item">
      <figure class="my-figure">
        <img class="my-image" src="https://picsum.photos/560/320?grayscale&random=2" alt="サムネイル" />
      </figure>
      <div class="my-description">
        <p class="my-text">display: grid; プロパティを使ったカード型レイアウト</p>
      </div>
    </div>

    <div class="my-item">
      <figure class="my-figure">
        <img class="my-image" src="https://picsum.photos/560/320?grayscale&random=3" alt="サムネイル" />
      </figure>
      <div class="my-description">
        <p class="my-text">display: grid; プロパティを使ったカード型レイアウト</p>
      </div>
    </div>

    <div class="my-item">
      <figure class="my-figure">
        <img class="my-image" src="https://picsum.photos/560/320?grayscale&random=4" alt="サムネイル" />
      </figure>
      <div class="my-description">
        <p class="my-text">display: grid; プロパティを使ったカード型レイアウト</p>
      </div>
    </div>
    
    <div class="my-item">
      <figure class="my-figure">
        <img class="my-image" src="https://picsum.photos/560/320?grayscale&random=5" alt="サムネイル" />
      </figure>
      <div class="my-description">
        <p class="my-text">display: grid; プロパティを使ったカード型レイアウト</p>
      </div>
    </div>

    <div class="my-item">
      <figure class="my-figure">
        <img class="my-image" src="https://picsum.photos/560/320?grayscale&random=6" alt="サムネイル" />
      </figure>
      <div class="my-description">
        <p class="my-text">display: grid; プロパティを使ったカード型レイアウト</p>
      </div>
    </div>
  </div>

[「cssの display: grid プロパティ」を使ったカード型レイアウト(css側)]

  .my-container {
    display: grid;
    gap: 2rem 2%;
    grid-template-columns: 2fr 1fr 1fr; /* レイアウトに応じてここを可変 */
    margin: 0 auto;
    width: 1200px;
  }
  .my-item {
    background: #fff;
    border-radius: 8px;
    box-shadow: 0 1px 3px rgba(0, 0, 0, .5);
    overflow: hidden;
  }
  .my-figure {
    height: 180px;
    margin: 0;
    overflow: hidden;
    padding: 0;
    width: 100%;
  }
  .my-image {
    display: block;
    width: 100%;
  }
  .my-description {
    font-size: .875rem;
    height: 80px;
    padding: 1rem;
  }
  .my-text {
    margin: 0;
  }

【加筆】「Bento UI」について

display: grid; を使用すると、柔軟にレイアウトが組めると言うことが、ここまでで理解いただけたことと思います。

この display: grid; ですが、昨今(2023年9月現在)
世界的に認知が増えつつあり、トレンドになり得るのではないか?と言われているUIスタイル、

「Bento UI(ベントー ユーアイ)」

これを作るのにもとても適しています。

どういうことかは次のセクションで書いていきます。

【加筆】「Bento UI」ってなに!?

https://bentogrids.com/

上記リンクは、海外のデザイナーの方が発信している「Bento UI」を集めたギャラリーサイトになります。

こちらに掲載されている様な、グリッドに沿ってカードを敷き詰めたレイアウトのスタイル、
まるで日本の伝統的な「お弁当」を模した様な、

Bento UI

がこのところ(2023年現在)、Web界隈で注目を集めています。

実際、私のまわりのWebデザインに携わる界隈の方や、
Twitter(現:X)上でのWebデザイン関連の話題においても
たびたび見聞きする様になってきたUIスタイルです。

AppleがiPhone 14の発表の際に用いたデザインが発祥」だとか、
いやいや
Windowsのメトロスタイルが、そもそもの発祥」だとか色々言われていますが、

とにかく、Google検索で普通に Bento UI と検索するだけでも、
国内外のかなりの数のまともなWebデザイン系サイトで「次に来るトレンド」として紹介されている事がわかるかと思います。

【加筆】display: grid は「Bento UI」の制作にも最適!!

さて、上のセクションでは
Bento UI がどういったものか」についてご紹介したわけですが、
具体的にはこれを、どう実装すれば良いのか?
という話です。

この Bento UI を作る上でも
力を発揮してくれるのが、そう、冒頭からご紹介している
display: grid; というわけなのです。

具体的な方法としては、
まず親要素(各カードのcontainerとなる要素)に対して display: grid を設定。
(display: grid を指定するだけで、その要素は「グリッドコンテナー」と言う概念になります)

そして、
grid-template-columns: 1fr 1fr 1fr 1fr;
のように記述して、その親要素の中で何分割のグリッド線を引くかを定義。
(上記の場合、4本の分割線ができ、エリアとしては5分割のエリアができます。)

grid-template-columns は水平方向の分割定義なので、

同様に

grid-template-rows を使用して、垂直方向の分割も定義しておきます。

grid-template-rows: 1fr 1fr 1fr 1fr;
↑この様にすると、縦横同じ分割線を持った「グリッドコンテナー」になるというわけです。

display: grid のキャプチャ
↑こういったグリッドコンテナーができます。

【加筆】子要素側では、どの分割線から始まりどの分割線までを領域とするかを指定します

ここまでの記述で、
display: grid を指定した「グリッドコンテナー」である親要素の指定ができています。

ここに入る子要素に対して、
「どの分割線から始まり」
「どの分割線までを領域とするか」

という指定を加えます。

そうする事で、Bento UI の様なレイアウトを実現する事ができます。

具体的には、次の4つのプロパティを、「子要素」に指定していきます。

grid-column-start: 1;
grid-column-end: 2;
grid-row-start: 1;
grid-row-end: 3;

↑この指定の意味は、上から
水平方向(column)の開始位置: 1番目のグリッド線
水平方向(column)の終了位置: 2番目のグリッド線
垂直方向(row)の開始位置: 1番目のグリッド線
垂直方向(row)の終了位置: 3番目のグリッド線

という意味です。

これを意識して、先ほどのキャプチャを見ていただくと、よりわかりやすいかと思います。

display: grid のキャプチャ
↑先ほどの子要素の指定は、このキャプチャの左上、
「01」という番号のついたカードの位置を指定している事になります。

他のカードも同様に、
grid-column-start: 2;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
↑この様に指定してあげることで(この指定だとキャプチャ内の「02」のカードの位置になります)
「グリッドコンテナー化した親要素」内で、
Bento UI の様なレイアウトが実現できるというわけです。

display: grid のキャプチャ

【この記事の本題】ジェネレーターを作りました!!

ここまで、display: grid を使用した
Bento UI
の様なレイアウトの作り方をご紹介してきました。

ただ、正直読んだだけでは
「?」
「なんかむずかしそう…」

となると思います。(書いている私自身も、最初は仕組みを理解するのに時間がかかりました…)

そこで作りました!!

簡単操作で
Bento UI の様なレイアウトを作成する事ができるジェネレーター
になります!!!

Bento UI のレイアウトが作成できるジェネレーター

ジェネレーターのURLはこちらになります。
display.grid.tedate
動画の様な操作で、簡単にBento UI の様なレイアウトを作成する事ができます。

【加筆】ジェネレーターの使い方

こちら(又は上記)のリンクから display.grid.tedate にアクセスします。
・すると7枚のカードが並んでいるページに遷移します。
・配置を編集したいカードをクリックすると、そのカードがアクティブになります。
・アクティブ状態になったカードに対して、左上のスライダーで
grid-column-start
grid-column-end
grid-row-start
grid-row-end
↑これら4つの値を設定します。

・全てのカードの編集が完了したら、右上にある2つのコピーボタンを押して
html, cssをコピーできますので、それぞれ任意の新規ファイルに貼り付けて使用できます。

ぜひ使ってみてください!

※なお現在は7枚のカードのみですが今後のアップデートでさまざまな機能を拡張していく予定です。

display: grid についてのMDNでの解説ページ

ご存知、Mozillaが運営する、Web技術に関するとても充実したオンラインリファレンスである MDN Docs 内においての、
display: grid; に関する解説ページは次のリンク先になります。

グリッドレイアウトの基本概念 | MDN

この記事のまとめ

今回は、カード型レイアウトともとても相性が良い
cssの「display: grid;」を使ったレイアウト手法、

およびその発展系としての
display: grid;」を使った
Bento UI
についての記事を書きました。

上のセクションでご紹介した通り、
オンライン上で試せるジェネレーターもご用意しましたので、
ぜひご使用ください!!

この記事が皆さんのより良いWeb制作体験につながれば嬉しく思います。

※この記事は、内容の品質向上を目的に、随時更新を行う場合があります。

この記事をシェアする: