1.0.0 • Published 6 months ago

@chrishow/masonry-component v1.0.0

Weekly downloads
-
License
MIT
Repository
github
Last release
6 months ago

masonry-component

masonry-component is a lightweight, zero-dependencies Web Component which allows you to display a bunch of images of different sizes in a 'masonry' style grid.

Benefits

  • 👼 Super simple: just one javascript file
  • 🤏 Really small: 6.5k unzipped, 1.5k stripped and zipped
  • 🏃 Super fast: No recalculation on resize (unless you change the number of columns, when it will happen automatically)
  • 🔧 Configurable with CSS: Uses CSS vars to configure, so is easy to use in responsive pages

How to use

Include the javascript:

<script src="path/to/masonry-component.js"></script>

Add the HTML:

<masonry-component>
  <img src="https://picsum.photos/600/300" width="600" height="300" />
  <img src="https://picsum.photos/600/500" width="600" height="500" />
  <img src="https://picsum.photos/600/200" width="600" height="200" />
  <img src="https://picsum.photos/600/300" width="600" height="300" />
  ...
</masonry-component>

.. and that's it.

Configuration

There are two options, the number of columns, and the gap between the items. These are both controlled using CSS custom properties, so can be specified in your CSS, HTML (or both).

masonry-component {
  --masonry-gap: 10px;
  --masonry-column-count: 3;
}

masonry-gap can be specified in pretty much any unit (px, rem, em, vw). Technically, it can be any unit that works as a margin-bottom, so percentage units are not supported.

This makes it super easy to change the number of columns at smaller widths, eg:

masonry-component {
  --masonry-gap: 10px;
  --masonry-column-count: 3;

  @media (max-width: 800px) {
    --masonry-column-count: 3;
  }
}

Recalculation will happen automatically when the window width changes to match the media query.

Advanced usage

If you don't know the dimensions of your images so can't add width and height attributes to the image tags, you will want to trigger a re-layout as the images load. You can do this at any time by calling the layout method on the component:

document.querySelector("masonry-component").layout();

To automatically trigger as each of the images load, you can do this:

document.querySelectorAll("masonry-layout img").forEach((img) => {
  img.onLoad = () => img.closest("masonry-layout").layout();
});

Licence

Licenc|se is MIT, you can do what pretty much you want with it.

Credits

masonry-component was written by Chris How, based on andreasbm/masonry-layout