React로 Masonry (타일을 깔아 놓은 디자인) 구현

react-masonry-css 을 사용하여 이러한 디자인을 구현합니다. (이 디자인은 CSS뿐이라고 상당히 어렵습니다.)

$ yarb add react-masonry-css # or npm install -D react-masonry-css

JSX
import React from "react"
import Masonry from "react-masonry-css"

export default () => {
  const events = [
    {
      "title": "React勉強会",
      "text": "Reactの勉強をします"
    },
    {
      "title": "JavaScript勉強会",
      "text": "JavaScriptの勉強をします"
    },
    {
      "title": "Ruby勉強会",
      "text": "Rubyの勉強をします"
    },
    {
      "title": "Rails勉強会",
      "text": "Railsの勉強をします"
    },
    {
      "title": "TypeScript勉強会",
      "text": "TypeScriptの勉強をします"
    }
  ]
  // 1行に表示するカラム数
  const breakpointColumnsObj = {
    default: 4,
    1350: 3,
    1048: 2,
    576: 1,
  }
  return (
    <div>
      <h1>勉強会一覧</h1>
      <Masonry
        breakpointCols={breakpointColumnsObj}
        className="my-masonry-grid"
        columnClassName="my-masonry-grid_column"
      >
        {events.map(e => (
          <div className='event-card'>
            <h3>{e.title}</h3>
            <p>{e.text}</p>
          </div>
      ))}
      </Masonry>
    </div>
  )
}

CSS
.my-masonry-grid {
  display: flex;
  margin-left: -30px; /* 項目間の余白のサイズ */
  width: auto;
}
.my-masonry-grid_column {
  padding-left: 30px; /* 項目間の余白のサイズ */
  background-clip: padding-box;
}

.my-masonry-grid_column > .event-card {
  background: grey;
  margin-bottom: 30px;
}

주의점



이 예에서는 한 행에 4개의 열을 기본 열 수로 설정합니다.
576px 이하일 때는 1열 밖에 표시하지 않도록 설정하고 있습니다만, 페이지 표시 후의 순간만 4열 표시되어 버립니다.
이것을 막기 위해서, 절대로 제대로 표시하고 싶은 스마트폰 전용의 DOM을 새롭게 작성해, PC로 표시할 때에는 display: none 로 숨기게 되었습니다.

좋은 웹페이지 즐겨찾기