🟩

CSSグリッドレイアウト(grid)に画像を配置してタイル状に表示する例

2023/08/08に公開

gridを使えば要素をタイル状に配置するのなんて簡単!と思っていたんですが、gridに画像を含めたときに指定した割合で表示されず悩んだので実装例をおいておきます。

※JSX + Chakra UIで書いていますがそのままHTML/CSSとして見てもらえれば

実装例

コード(JSX部分だけを抜粋)

<chakra.div
  display="grid"
  // 直感的にレイアウトが理解しやすいようgridTemplateAreasを使う
  gridTemplateAreas={`
    'a a c c c'
    'b b c c c'
    'b b d d d'
    'e f f f g'`}
  // 各行の割合(高さ)
  gridTemplateRows="1.6fr 1fr 2fr 1.4fr"
  // 各列の割合(幅)
  gridTemplateColumns="1fr 1fr 0.2fr 4fr 1fr"
  height="100vh"
  width="100vw"
  gap="12px"
  boxSizing="border-box"
  padding="12px"
>
  <chakra.img
    src="https://placedog.net/800/600?id=1"
    objectFit="cover"
    width="100%"
    height="100%"
    gridArea="a"
    overflow="hidden"
  />
  <chakra.img
    src="https://placedog.net/800/600?id=2"
    objectFit="cover"
    width="100%"
    height="100%"
    gridArea="b"
    overflow="hidden"
  />
  <chakra.img
    src="https://placedog.net/800/600?id=3"
    objectFit="cover"
    width="100%"
    height="100%"
    gridArea="c"
    overflow="hidden"
  />
  <chakra.img
    src="https://placedog.net/800/600?id=4"
    objectFit="cover"
    width="100%"
    height="100%"
    gridArea="d"
    overflow="hidden"
  />
  <chakra.img
    src="https://placedog.net/800/600?id=5"
    objectFit="cover"
    width="100%"
    height="100%"
    gridArea="e"
    overflow="hidden"
  />
  <chakra.img
    src="https://placedog.net/800/600?id=6"
    objectFit="cover"
    width="100%"
    height="100%"
    gridArea="f"
    overflow="hidden"
  />
  <chakra.img
    src="https://placedog.net/800/600?id=7"
    objectFit="cover"
    width="100%"
    height="100%"
    gridArea="g"
    overflow="hidden"
  />
</chakra.div>

悩んだこと

各imgにoverflow="hidden"を設定しているのですが、これを設定していないと指定したrowやcolumnの割合が崩れてしまうんですよね。
width/heightとobject-fit: coverだけで事足りそうなんですがうまくいかず、hiddenを設定してようやく指定したレイアウトで画像を表示することができました。

Discussion