I am trying to trigger a CSS animation on mouseover event. Sadly, it does not work as desired.
This is what I tried. I am trying to achieve the same motion on mouseover as the keyframe declaration within CSS would.
It works as desired in Firefox +Chrome(mobile) but not in Chrome (PC).
const element = document.querySelector('.circ');
element.addEventListener('mouseover', function() {
console.log(1);
element.style.animation = "move 1000ms infinite ease-in-out alternate";
});
element.addEventListener('mouseout', function() {
//mouseout triggers automatically following mouseover without provocation
console.log(2);
element.style.animation = "none";
});
.circ {
pointer-events: all;
}
.rect {
pointer-events: none;
}
@keyframes move {
0% {
transform: translateX(0);
}
100% {
transform: translateX(500px);
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="container" class="svg-container">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 100">
<rect x="0" y="0" width="530" height="200" fill="#EFEFEF"></rect>
<g class="crcl">
<circle class="circ" cx="10" cy="50" r="10" fill="blue"></circle>
</g>
</svg>
</div>
</body>
</html>
2
Answers
It is possible to achieve the desired effect with existing
mouseover
andmouseout
by overlaying the exact same transparent element as the recipientkeyframe
element. Then add a listener on the overlaid element to program the movement on the bottom element.Such as
The animation actually works but it constantly resets itself.
The problem: your attaching the event listener to the animated circle.
As this circle will start to move on mouseover it will almost immediately trigger the mouseout event.
You should probably start and stop the animation when hovering the svg or rect instead.
Example2: start animation on hover; stop on click