PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Wednesday, November 9, 2022

[FIXED] How can I make a mouseleave animation play using forEach loop with AnimeJS

 November 09, 2022     anime.js, foreach, html, javascript, loops     No comments   

Issue

I am using Anime.js to animate an SVG when mouseleave each item.

I have a list within a loop, with an SVG at the end of each list. The issue with my code is that all SVGs animate at the same time when hovering over each item. When I mouseleave each item, I would like the function to animate each SVG separately relative to the hovered item.

I don't know what I'm doing wrong, but I've been stuck for hours.

I could have simply animated with CSS, but it's hard to animate the SVG path as I want without using a library.

Here is my code:

let hoverItem = document.querySelectorAll(".item");

hoverItem.forEach((line) => {
  line.addEventListener("mouseleave", function () {
    anime
      .timeline({
        loop: false
      })
      .add({
        targets: "path",
        d: [
          { value: "M 10 80 Q 645 128 1290 80" },
          { value: "M 10 80 Q 645 11 1290 80" },
          { value: "M 10 80 Q 645 121 1290 80" },
          { value: "M 10 80 Q 645 34 1290 80" },
          { value: "M 10 80 Q 645 102 1290 80" },
          { value: "M 10 80 Q 645 65 1290 80" },
          { value: "M 10 80 Q 645 80 1290 80" }
        ],
        easing: "easeOutElastic(1, .6)",
        duration: 600
      });
  });
});
<ul>

  <li class="item">
    <div class="title">TITLE</div>
    <svg width="1290" height="110" viewBox="0 0 1290 110">
      <path d="M 10 80 Q 640 80 1290 80" stroke-width="1.5" stroke="#D7C9B8" fill="transparent" />
    </svg>
  </li>

  <li class="item">
    <div class="title">TITLE</div>
    <svg width="1290" height="110" viewBox="0 0 1290 110">
      <path d="M 10 80 Q 640 80 1290 80" stroke-width="1.5" stroke="#D7C9B8" fill="transparent" />
    </svg>
  </li>

  <li class="item">
    <div class="title">TITLE</div>
    <svg width="1290" height="110" viewBox="0 0 1290 110">
      <path d="M 10 80 Q 640 80 1290 80" stroke-width="1.5" stroke="#D7C9B8" fill="transparent" />
    </svg>
  </li>

</ul>

Any help would be appreciated.


Solution

To do what you require you need to set the targets property to the path related to the .item which raised the mouseleave event.

To do that you can get a reference to the .item element from the Event object passed to the event handled, then querySelector() to get the related path.

let hoverItem = document.querySelectorAll(".item");

hoverItem.forEach((line) => {
  line.addEventListener("mouseleave", function(e) {
    anime.timeline({
      loop: false
    }).add({
      targets: e.target.querySelector('path'),
      d: [{
        value: "M 10 80 Q 645 128 1290 80"
      }, {
        value: "M 10 80 Q 645 11 1290 80"
      }, {
        value: "M 10 80 Q 645 121 1290 80"
      }, {
        value: "M 10 80 Q 645 34 1290 80"
      }, {
        value: "M 10 80 Q 645 102 1290 80"
      }, {
        value: "M 10 80 Q 645 65 1290 80"
      }, {
        value: "M 10 80 Q 645 80 1290 80"
      }],
      easing: "easeOutElastic(1, .6)",
      duration: 600
    });
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js" integrity="sha512-z4OUqw38qNLpn1libAN9BsoDx6nbNFio5lA6CuTp9NlK83b89hgyCVq+N5FdBJptINztxn1Z3SaKSKUS5UP60Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<ul>
  <li class="item">
    <div class="title">TITLE</div>
    <svg width="1290" height="110" viewBox="0 0 1290 110">
      <path d="M 10 80 Q 640 80 1290 80" stroke-width="1.5" stroke="#D7C9B8" fill="transparent" />
    </svg>
  </li>
  <li class="item">
    <div class="title">TITLE</div>
    <svg width="1290" height="110" viewBox="0 0 1290 110">
      <path d="M 10 80 Q 640 80 1290 80" stroke-width="1.5" stroke="#D7C9B8" fill="transparent" />
    </svg>
  </li>
  <li class="item">
    <div class="title">TITLE</div>
    <svg width="1290" height="110" viewBox="0 0 1290 110">
      <path d="M 10 80 Q 640 80 1290 80" stroke-width="1.5" stroke="#D7C9B8" fill="transparent" />
    </svg>
  </li>
</ul>



Answered By - Rory McCrossan
Answer Checked By - Candace Johnson (PHPFixing Volunteer)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing