<div class="lab-container">
<div class="wrapper">
<header class="lab-header">
<h1 class="lab-title">CSS Masonry</h1>
<div class="lab-description">
<p>
100% responsive. Resize the browser window to see the action, or try
the
<a href="https://w3bits.com/tools/grid-generator/">Grid Generator</a>
for more masonry layouts.
</p>
</div>
</header>
<div class="masonry-container">
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/banana.jpg"
alt="A banana"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/raspberries.jpg"
alt="A pair of raspberries"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/audio-cassette.jpg"
alt="An audio cassette"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/cactus.jpg"
alt="A cactus"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/stool.jpg"
alt="A stool"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/watch.jpg"
alt="A clock"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/lollipop.jpg"
alt="A lollipop"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/orange.jpg"
alt="An orange"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/red-chilli.jpg"
alt="A red chilli"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/rose.jpg"
alt="A rose"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/donuts.jpg"
alt="Some donuts"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/telephone.jpg"
alt="A telephone"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/orange.jpg"
alt="An orange"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/lollipop.jpg"
alt="A lollipop"
/>
</div>
<div class="masonry-item">
<img
decoding="async"
loading="lazy"
src="https://cdn.w3bits.com/stock/objects/eggs.jpg"
alt="Some eggs"
/>
</div>
</div>
</div>
</div>
:root {
--main-padding-inline: 2rem;
--accent: #213;
}
.lab-container {
padding-block: 5rem;
}
.lab-header {
text-align: center;
margin-bottom: 2.5rem;
}
.lab-title {
text-wrap: balance;
}
.lab-description {
margin-inline: auto;
max-width: 42rem;
}
.lab-description a {
text-underline-offset: 2px;
}
.lab-description a:hover {
text-decoration: none;
}
@media only screen and (min-width: 768px) {
.lab-container {
--main-padding-block: 7rem;
}
.lab-header {
margin-bottom: 3rem;
}
}
/* Masonry grid */
.masonry-container {
--items: 3;
--gap: 16px;
--radius: 8px;
transition: all 0.5s ease-in-out;
column-count: var(--items);
column-gap: var(--gap);
counter-reset: item;
}
.masonry-item {
position: relative;
counter-increment: item;
margin-bottom: var(--gap);
}
.masonry-item::before {
content: counter(item);
position: absolute;
top: 0.75rem;
left: 0.75rem;
z-index: 1;
font-size: 0.7rem;
font-weight: 700;
line-height: 1;
padding: 0.35rem 0.6rem;
border-radius: 9999px;
background-color: rgba(0, 0, 0, 0.45);
color: white;
opacity: 0.55;
pointer-events: none;
transition: opacity 0.3s ease;
}
.masonry-item:hover::before {
opacity: 0.9;
}
.masonry-container.hide-numbers .masonry-item::before {
display: none;
}
/* Masonry image effects */
.masonry-item img {
border-radius: var(--radius, 8px);
transition: all 0.5s ease-in-out;
}
.masonry-item:hover img {
opacity: 0.75;
}
/* Masonry on tablets */
@media only screen and (min-width: 768px) and (max-width: 1023px) {
.masonry-container {
--items: 2;
}
}
/* Masonry on big screens */
@media only screen and (min-width: 1024px) {
.masonry-container {
--items: 3;
}
}
@supports (display: grid-lanes) {
.masonry-container {
column-count: initial;
column-gap: initial;
display: grid-lanes;
grid-template-columns: repeat(var(--items), 1fr);
gap: var(--gap);
}
.masonry-item {
margin-bottom: initial;
}
}