React Masonry

Different heights

import { Masonry } from 'react-masonry'
import { pick, randomColor } from './random'

export default function DifferentHeights() {
const numberOfBoxes = 16

return (
<Masonry>
{Array.from({ length: numberOfBoxes }).map((_, index) => (
<div
key={index}
style={{
width: '25%',
height: pick([100, 130, 180, 200, 260, 80]),
backgroundColor: randomColor(),
}}
>
{index}
</div>
))}
</Masonry>
)
}

Different widths

import type { CSSProperties } from 'react'
import { Masonry } from 'react-masonry'
import { pick, randomColor } from './random'

export default function DifferentHeights() {
const height = 160

const boxes: CSSProperties[] = [
{ width: '20%', background: randomColor(), height },
{ width: '30%', background: randomColor(), height },
{ width: '50%', background: randomColor(), height },
// second row
{ width: '30%', background: randomColor(), height },
{ width: '40%', background: randomColor(), height },
{ width: '30%', background: randomColor(), height },
// third row
{ width: '30%', background: randomColor(), height },
{ width: '30%', background: randomColor(), height },
{ width: '40%', background: randomColor(), height },
// forth
{ width: '25%', background: randomColor(), height },
{ width: '25%', background: randomColor(), height },
{ width: '25%', background: randomColor(), height },
{ width: '25%', background: randomColor(), height },
]

return (
<Masonry>
{boxes.map((box, index) => (
<div style={box}>{index}</div>
))}
</Masonry>
)
}

Different widths and heights

import type { CSSProperties } from 'react'
import { Masonry } from 'react-masonry'
import { pick, randomColor } from './random'

export default function DifferentHeights() {
  const boxes: CSSProperties[] = [
    {
      width: `20%`,
      height: 100,
      background: randomColor(),
    },
    {
      width: `30%`,
      height: 160,
      background: randomColor(),
    },
    {
      width: `50%`,
      height: 120,
      background: randomColor(),
    },
    {
      width: `20%`,
      height: 60,
      background: randomColor(),
    },
    {
      width: `35%`,
      height: 130,
      background: randomColor(),
    },
    {
      width: `15%`,
      height: 100,
      background: randomColor(),
    },
    {
      width: `25%`,
      height: 100,
      background: randomColor(),
    },
    {
      width: `25%`,
      height: 120,
      background: randomColor(),
    },
  ]

  return (
    <Masonry>
      {boxes.map((box, index) => (
        <div style={box}>{index}</div>
      ))}
    </Masonry>
  )
}