External Publication
Visit Post

Enhancing with CSS Grid Lanes

Jeremy Keith June 16, 2026
Source

CSS Grid Lanes has started to ship in browsers. It’s in Safari and behind a flag in Chrome and Edge.

It enables masonry layouts, where items get packed together in the most efficient way possible.

Unsurprisingly, I’m a fan of a layout tool where the browser does all the hard work. It very much aligns with the idea of declarative design; you specify the boundary conditions, and then browser does the maths and heavy lifting.

There’s a handy website called The Field Guide to Grid Lanes where you can play around with possibilities.

At the most recent CSS Day, Patrick Brosset gave a great talk showing what you could do with Grid Lanes. I immediately started playing around with it, and I spotted what I think could be a useful pattern…

Over on The Session, I added a little enhancement to the events and sessions listings recently. I make a call to the Google Places API to see if I can find a match for the venue, and if I do, pull in some photos.

Sidenote: right now there’s a major issue with this. None of the photos come with text descriptions. This is something I need to fix, and I’ve got some ideas on how to do that.

Anyway, these photos are just nice-to-haves so I’ve tucked them away into a details element with a simple summary like “Ten photos” or “Twenty photos”. If you open up that details element you get the photos in a horizontal swipable row. A carousel, if you will.

This works fine, but on larger screens I think it would be okay to show all the photos at once. That’s where Grid Lanes comes in.

Take a look at an event or a session in Safari to see what I mean.

Here’s the CSS that creates a carousel:

.gallery { display: flex; align-items: center; inline-size: fit-content; max-inline-size: 100%; overflow-inline: auto; scroll-snap-type: inline mandatory; overscroll-behavior-inline: contain; scroll-behavior: smooth; scrollbar-gutter: stable; } .gallery > * { flex-shrink: 0; scroll-snap-align: center; }

And here’s the media query that turns it into a masonry layout:

@supports (display: grid-lanes) { @media all and (min-width: 56em) { .gallery { all: initial; display: grid-lanes; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 0.5em; } .gallery > * { inline-size: 100%; } } }

I’m using all: initial to unset the previous styles, which is a bit of a sledgehammer but it works.

I think this could be a useful responsive design pattern. Masonry layouts are great for large screens but kind of rubbish for small screens where you end up with just a single column. Carousels aren’t much cop on large screens but maybe have their place on small screens where real estate is at a premium.

Oh, and needless to say, this is a progressive enhancement. If a browser doesn’t yet understand display: grid-lanes it continues to get the carousel layout.

Discussion in the ATmosphere

Loading comments...