Search code examples
javascriptcssgsap

Show cursor image on hover with GSAP - center issue


I am using GSAP to show an image on hover that follows the cursor while moving around, it all works fine but I can't get the image to 'center center' the cursor, what am I missing?

const items = document.querySelectorAll('.container')

items.forEach((el) => {
  const image = el.querySelector('img')
  
  el.addEventListener('mouseenter', (e) => {
    gsap.to(image, { autoAlpha: 1 })
  })
  
   el.addEventListener('mouseleave', (e) => {
    gsap.to(image, { autoAlpha: 0 })
  })
  
  el.addEventListener('mousemove', (e) => {
    gsap.set(image, { x: e.offsetX })
  })
})
.container {
  position:relative;
  background:#ff0000;
  width:100%;
  height:60px;
}

.container img {
  position: absolute;
  width: 200px;
  height: 200px;
  object-fit: cover;
  transform: translateX(-50%) translateY(-50%);
  top: 50%;
  left: 50%;
  z-index: -10;
  opacity: 0;
  visibily: hidden;
  pointer-events: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.4.1/gsap.min.js"></script>

<div class="container">
  <img src="https://source.unsplash.com/random">
</div>


Solution

  • You need to remove left: 50%; from .container img.

    const items = document.querySelectorAll('.container')
    
    items.forEach((el) => {
      const image = el.querySelector('img')
      
      el.addEventListener('mouseenter', (e) => {
        gsap.to(image, { autoAlpha: 1 })
      })
      
       el.addEventListener('mouseleave', (e) => {
        gsap.to(image, { autoAlpha: 0 })
      })
      
      el.addEventListener('mousemove', (e) => {
        gsap.set(image, { x: e.offsetX })
      })
    })
    .container {
      position:relative;
      background:#ff0000;
      width:100%;
      height:60px;
    }
    
    .container img {
      position: absolute;
      width: 200px;
      height: 200px;
      object-fit: cover;
      transform: translateX(-50%) translateY(-50%);
      top: 50%;
      z-index: -10;
      opacity: 0;
      visibily: hidden;
      pointer-events: none;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.4.1/gsap.min.js"></script>
    
    <div class="container">
      <img src="https://source.unsplash.com/random">
    </div>