JSFiddle - React, Tailwind, and code Playground
HTML
<div class="gallery" id="gallery">
<div class="gallery-item">
<img src="https://picsum.photos/450/325?image=100" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/450?image=200" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/280?image=300" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/540?image=400" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/380?image=500" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/300?image=600" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/400?image=700" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/300?image=800" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/280?image=900" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/480?image=925" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/550?image=950" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/600?image=1000" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/325?image=25" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/450?image=50" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/280?image=75" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/540?image=100" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/380?image=125" alt="" class="">
</div>
<div class="gallery-item">
<img src="https://picsum.photos/450/300?image=161" alt=""...
CSS
.gallery-item img {
max-width: 100%;
display: block;
}
.masonry-layout {
--columns: 5;
--gap: 0.6rem;
display: grid;
grid-template-columns: repeat(var(--columns), 1fr);
grid-gap: var(--gap);
}
.masonry-layout .masonry-item {
margin-bottom: var(--gap);
}
.masonry-layout.columns-1 {
--columns: 1;
}
.masonry-layout.columns-2 {
--columns: 2;
}
.masonry-layout.columns-3 {
--columns: 3;
}
.masonry-layout.columns-4 {
--columns: 4;
}
.masonry-layout.columns-5 {
--columns: 5;
}
JavaScript
const masonryLayout = (containerElem, itemsElems, columns) => {
// Crea Container para las columnas
containerElem.className = ''
containerElem.classList.add('masonry-layout', `columns-${columns}`)
containerElem.innerHTML = '';
// Crea n-columnas de acuerdo a "columns"
let columnsElements = []
for (let i = 1; i <= columns; i++) {
let column = document.createElement('div');
column.classList.add('masonry-column', `column-${i}`);
containerElem.appendChild(column);
columnsElements.push(column);
}
// Ubica cada imagen en la columna correspondiente
for (let m = 0; m < Math.ceil(itemsElems.length / columns); m++) {
for (let n = 0; n < columns; n++) {
let item = itemsElems[m * columns + n];
columnsElements[n].appendChild(item);
item.classList.add('masonry-item')
}
}
}
masonryLayout(document.getElementById("gallery"), document.querySelectorAll(".gallery-item"),2);
window.onresize = function(e){
let columnNumber = Math.ceil(document.body.clientWidth / 300);
masonryLayout(document.getElementById("gallery"), document.querySelectorAll(".gallery-item"),columnNumber);
console.log("resize");
}