<div id="gallery">
  <figure id="1">
    <img src="https://assets.codepen.io/652/the-lucky-neko-CM7a-XBD4AU-unsplash.jpg" alt="a white kitten with brown and black spots sitting with its paws slightly outstretched. " title="Photo by The Lucky Neko for Unsplash">
    <figcaption>Kitten: Ollie (12 Weeks)</figcaption>
  </figure>

  <figure id="2">
    <img src="https://assets.codepen.io/652/karsten-winegeart-NE0XGVKTmcA-unsplash.jpg" alt="a brown French bulldog puppy laying down and looking up with a hopeful look in its eyes. " title="Photo by Karsten Winegeart for Unsplash">
    <figcaption>Puppy: Barney (9 Weeks)</figcaption>
  </figure>

  <figure id="3">
    <img src="https://assets.codepen.io/652/kabo-NjWZ07sPEJE-unsplash.jpg" alt="A large long-haired orange cat with a white belly. " title="Photo by Kabo for Unsplash">
    <figcaption>Cat: Walter (5 Years) </figcaption>
  </figure>

  <figure id="4">
    <img class="colorturn" src="https://assets.codepen.io/652/giacomo-lucarini-7M0SG3ZKdlE-unsplash.jpg" alt="A light brown, long-haired chihuahua sitting next to three rubber duckies. " title="Photo by Giacomo Lucarini for Unsplash">
    <figcaption>Dog: Miss Sunshine (2 Years) </figcaption>
  </figure>

  <figure id="5">
    <img src="https://assets.codepen.io/652/sergey-semin-Y0WXj3xqJz0-unsplash.jpg" alt="A tabby kitten with green eyes. " title="Photo by Sergey Semin for Unsplash">
    <figcaption>Kitten: Reese (8 Weeks)</figcaption>
  </figure>

  <figure id="6">
    <img src="https://assets.codepen.io/652/jordan-bigelow-X5VoG4MA5aI-unsplash.jpg" alt="A light brown puppy standing on a white and tan woven pet bed. " title="Photo by Sergey Semin for Unsplash">
    <figcaption>Puppy: Bruce (10 Weeks)</figcaption>
  </figure>

</div>
body {
  background-color: #eee;
  font-family: Montserrat, sans-serif;
  font-weight: 700;
}

#gallery {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  width: 75vw;
  margin: 20px auto;
}

figure {
  cursor: move;
  margin: 10px;
  padding: 0px;
  position: relative;
}

figure img {
  width: 100%;
}

img {
  filter: hue-rotate(10);
  padding: 0px;
  border: 3px solid #fff;
  box-shadow: 0px 0px 3px #ccc;
  z-index: -1;
  position: relative;
  width: 100%;
  box-sizing: border-box;
}

.colorturn {
  filter: hue-rotate(330deg) saturate(0.8);
}

figcaption {
  background-color: rgba(255, 255, 255, 0.5);
  width: 100%;
  text-align: center;
  color: #5e423f;
  z-index: 1;
  padding: 9px 0px 11px 0px;
  text-transform: uppercase;
  font-size: 1vw;
  position: absolute;
  bottom: 6px;
}

@media screen and (max-width: 600px) {
  figcaption {
    font-size: 3vw;
  }
  #gallery {
    grid-template-columns: 1fr;
    width: 90vw;
  }
}

.heart::before {
  font-family: "FontAwesome";
  content: "\f004";
  top: 0.4em;
  left: 0.5em;
  color: #fff;
  z-index: 1000;
  font-size: 2vw;
  position: absolute;
  opacity: 0;
  transform: scale(0);
  animation: animat 4.5s ease-in-out forwards;
}

.dark::before {
  color: #5e423f;
}

@keyframes animat {
  0% {
    opacity: 0;
    transform: scale(0);
  }

  10% {
    opacity: 1;
    transform: scale(1.2);
  }

  20% {
    opacity: 1;
    transform: scale(1);
  }
  
  90% {
    opacity: 1;
    transform: scale(1);
  }
  100% {
    opacity: 0;
    transform: scale(0);
  }
}
//Drag and drop Sortable.js
new Sortable(gallery, {
  swapThreshold: 1,
  animation: 150
});

//Add random heart
function heart_loop() {
  var number = 1 + Math.floor(Math.random() * 6);
  if (number == 1 || number == 5 || number == 6) {
    $("#" + number).addClass("heart dark");
  } else {
    $("#" + number).addClass("heart");
  }
  setTimeout(function () {
    $("#" + number).removeClass();
    heart_loop();
  }, 5000);
}

heart_loop();

External CSS

  1. https://fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic
  2. https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.15.0/Sortable.min.js
  2. https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js