How to Create a 360-Degree Spinning Image Feature with Text Hover Effect Using GSAP

SHARE

SIGN UP FOR THE NEWSLETTER

Your subscription could not be saved. Please try again.
Your subscription has been successful.


Code:



Add this code to the first text editor widget to display text on the left

<div class="link">
  <a href="add your own link here" target="_blank" rel="noopener noreferrer" data-image="1">Top side</a>
</div>
<div class="link">
  <a href="#" target="_blank" rel="noopener noreferrer" data-image="2">Bottom side</a>
</div>                    
<div class="link">
  <a href="#" data-image="3" target="_blank" rel="noopener noreferrer">Left side</a>
</div>
<div class="link">
  <a href="#" data-image="4" target="_blank" rel="noopener noreferrer">Top view</a>
</div>
<div class="link">
  <a href="#" data-image="5" target="_blank" rel="noopener noreferrer">Bottom view</a>
</div>
<div class="link">
  <a href="#" data-image="5" target="_blank" rel="noopener noreferrer">Side view</a>
</div>


Add this code to the second text editor widget to display text on the right

<img class="image" src="add your img link here" alt="" data-id="1" />
<img class="image" src="add your img link here" alt="" data-id="2" />
<img class="image" src="add your img link here" alt="" data-id="3" />
<img class="image" src="add your img link here" alt="" data-id="4" />
<img class="image" src="add your img link here" alt="" data-id="5" />
      


Add this code to the parent container as shown in the video:

.pill {
  position: absolute;
  height: 50vh;
}

.pill img {
  position: absolute;
 height: 50vh;
  
  object-fit: cover;
  transition: z-index 0.5s, opacity 0.5s;
  opacity: 0;
}
.pill img[data-id="1"] {
  z-index: 10;
  opacity: 1;
}

.links {
  padding: 4rem 8rem;
  height: 10vh;
}

.menu a {
  text-decoration: none;
  font-family: "Sora", "Sans-Serif";
  font-size: 4rem;
  letter-spacing: -0.2rem;
  color: #23332E;
  transition: all 0.3s ease-in-out;
}

.menu a:hover {
  color: #fff;
}



Add this code to the HTML widget as shown in the video

<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>

<script>
   const linksContainer = document.querySelector(".links");
   let currentImageId = 1;

      document.querySelectorAll(".link a").forEach((link) => {
        link.addEventListener("mouseenter", function () {
          const targetImageId = parseInt(this.getAttribute("data-image"));
          let rotationValue = targetImageId > currentImageId ? 360 : 360;
          const pill = document.querySelector(".pill");
          const images = document.querySelectorAll(".pill img");

          gsap.to(pill, {
            rotation: rotationValue,
            duration: 0.4,
            onComplete: function () {
              gsap.set(pill, {
                rotation: 0,
              });
            },
          });
          gsap.set(images, {
            zIndex: 0,
            opacity: 0,
            delay: 0.25,
          });
          gsap.set(`.pill img[data-id='${targetImageId}']`, {
            zIndex: 10,
            opacity: 1,
            delay: 0.25,
          });
          currentImageId = targetImageId;
        });
      });
 </script>
      


TIP! If you don’t want the 360-degree spinning effect, remove the following code from:

let rotationValue = targetImageId > currentImageId ? 360 : 360;

gsap.to(pill, {
rotation: rotationValue,
duration: 0.4,
onComplete: function () {
gsap.set(pill, {
rotation: 0,
});
},
});

SIGN UP FOR THE NEWSLETTER

Your subscription could not be saved. Please try again.
Your subscription has been successful.