<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Masonry Layout con CSS Grid</title>
</head>
<body>
    <h1>Masonry Gallery</h1>

    <div class="gallery" id="gallery">
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/300" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/320" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/400/300" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/200" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/500/300" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/250/300" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/250" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/120/150" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/301" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/302" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/303" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/304" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/305" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/306" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/307" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/308" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/309" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/310" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/290" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/299" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/230" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/298" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/297" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/296" alt=""></div>
        </div>
        <div class="gallery-item">
            <div class="content"><img src="https://picsum.photos/200/312" alt=""></div>
        </div>
    </div>
     
</body>
</html>
body {
  background-color: #eee;
}
.hello {
  opacity: 1 !important;
}
.full {
  position: fixed;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
}
.full .content {
  background-color: rgba(0,0,0,0.75) !important;
  height: 100%;
  width: 100%;
  display: grid;
}
.full .content img {
  left: 50%;
  transform: translate3d(0, 0, 0);
  animation: zoomin 1s ease;
  max-width: 100%;
  max-height: 100%;
  margin: auto;
}
.byebye {
  opacity: 0;
}
.byebye:hover {
  transform: scale(0.2) !important;
}
.gallery {
  display: grid;
  grid-column-gap: 8px;
  grid-row-gap: 8px;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  grid-auto-rows: 8px;
}
.gallery img {
  max-width: 100%;
  border-radius: 8px;
  box-shadow: 0 0 16px #333;
  transition: all 1.5s ease;
}
.gallery img:hover {
  box-shadow: 0 0 32px #333;
}
.gallery .content {
  padding: 4px;
}
.gallery .gallery-item {
  transition: grid-row-start 300ms linear;
  transition: transform 300ms ease;
  transition: all 0.5s ease;
  cursor: pointer;
}
.gallery .gallery-item:hover {
  transform: scale(1.025);
}
@media (max-width: 600px) {
  .gallery {
    grid-template-columns: repeat(auto-fill, minmax(30%, 1fr));
  }
}
@media (max-width: 400px) {
  .gallery {
    grid-template-columns: repeat(auto-fill, minmax(50%, 1fr));
  }
}
@-moz-keyframes zoomin {
  0% {
    max-width: 50%;
    transform: rotate(-30deg);
    filter: blur(4px);
  }
  30% {
    filter: blur(4px);
    transform: rotate(-80deg);
  }
  70% {
    max-width: 50%;
    transform: rotate(45deg);
  }
  100% {
    max-width: 100%;
    transform: rotate(0deg);
  }
}
@-webkit-keyframes zoomin {
  0% {
    max-width: 50%;
    transform: rotate(-30deg);
    filter: blur(4px);
  }
  30% {
    filter: blur(4px);
    transform: rotate(-80deg);
  }
  70% {
    max-width: 50%;
    transform: rotate(45deg);
  }
  100% {
    max-width: 100%;
    transform: rotate(0deg);
  }
}
@-o-keyframes zoomin {
  0% {
    max-width: 50%;
    transform: rotate(-30deg);
    filter: blur(4px);
  }
  30% {
    filter: blur(4px);
    transform: rotate(-80deg);
  }
  70% {
    max-width: 50%;
    transform: rotate(45deg);
  }
  100% {
    max-width: 100%;
    transform: rotate(0deg);
  }
}
@keyframes zoomin {
  0% {
    max-width: 50%;
    transform: rotate(-30deg);
    filter: blur(4px);
  }
  30% {
    filter: blur(4px);
    transform: rotate(-80deg);
  }
  70% {
    max-width: 50%;
    transform: rotate(45deg);
  }
  100% {
    max-width: 100%;
    transform: rotate(0deg);
  }
}
var gallery = document.querySelector('#gallery');
var getVal = function (elem, style) { return parseInt(window.getComputedStyle(elem).getPropertyValue(style)); };
var getHeight = function (item) { return item.querySelector('.content').getBoundingClientRect().height; };
var resizeAll = function () {
    var altura = getVal(gallery, 'grid-auto-rows');
    var gap = getVal(gallery, 'grid-row-gap');
    gallery.querySelectorAll('.gallery-item').forEach(function (item) {
        var el = item;
        el.style.gridRowEnd = "span " + Math.ceil((getHeight(item) + gap) / (altura + gap));
    });
};
gallery.querySelectorAll('img').forEach(function (item) {
    item.classList.add('byebye');
    if (item.complete) {
        console.log(item.src);
    }
    else {
        item.addEventListener('load', function () {
            var altura = getVal(gallery, 'grid-auto-rows');
            var gap = getVal(gallery, 'grid-row-gap');
            var gitem = item.parentElement.parentElement;
            gitem.style.gridRowEnd = "span " + Math.ceil((getHeight(gitem) + gap) / (altura + gap));
            item.classList.remove('byebye');
        });
    }
});
window.addEventListener('resize', resizeAll);
gallery.querySelectorAll('.gallery-item').forEach(function (item) {
    item.addEventListener('click', function () {        
        item.classList.toggle('full');        
    });
});

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.