Если вы хотите отменить анимацию только при выходе из нее до завершения анимации, анимация может быть связана с селектором css :hover
:
#navOpen{
width: 64px;
height: 64px;
/* reused the css-sprites because of laziness... */
background: url('https://i.postimg.cc/hv0L4vsL/css-sprites.png') no-repeat left/cover;
transition: transform 2s;
}
#navOpen:hover{
transform: rotate(90deg);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
<div id="navOpen"></div>
Однако, если вы действительно хотите закончить sh всю анимацию перед реверсом, она немного более многословна. Основная причина в том, что вы должны проверять каждый раз, когда анимация заканчивается, если она все еще находится в правильном состоянии . При этом я имею в виду состояние , как если бы пользователь завис над вашим #navbar
, и ему назначен класс navOpenPlay
или navOpenPlayBack
.
// Javascript accessor to use "onanimationend"
let nav = document.getElementById("navOpen")
// First of all, we need to keep track if an animation is running or not.
// This helps us, to prevent interruption of an animation through adding/removing css classes before the animation finished.
// We stock this information in the variable `navIsReady`.
let navIsReady = true
// Define a function to change the state.
// If play === true, we add animation for onMouseOver by adding the corresponding css classes
function changeState(play) {
// Verify if another animation is currently running
if (navIsReady === true) {
navIsReady = false // indicate that an animation is running
if (play) { // previously called on mouseOver
$(nav).removeClass("navOpenPlayBack").addClass("navOpenPlay")
} else { // previously called on mouseOut
$(nav).removeClass("navOpenPlay").addClass("navOpenPlayBack")
}
}
}
// Define a callback when an animation ends.
// The callback checks that the object is in the right state after finishing the animation
nav.onanimationend = function(event) {
navIsReady = true // allow animations again
// Check if the navigation is in the correct state after finishing the animation
if ($(nav).is(':hover') && (!$(nav).hasClass("navOpenPlay"))) {
// False state. Change the state through a call
changeState(true)
} else if (!$(nav).is(':hover') && (!$(nav).hasClass("navOpenPlayBack"))) {
// False state. Change the state through a call
changeState(false)
}
};
// Hook MouseOver and MouseOut events
$(nav).mouseover(function() {
changeState(true)
});
$(nav).mouseout(function() {
changeState(false)
});
#navOpen {
width: 64px;
height: 64px;
background: url('https://i.postimg.cc/hv0L4vsL/css-sprites.png') no-repeat left/cover;
}
.navOpenPlay {
animation: Play 1s steps(24) 1 forwards;
}
.navOpenPlayBack {
animation: PlayBack 1s steps(24) 1 backwards;
}
@keyframes Play {
0% {
background-position: 0px;
}
100% {
background-position: -1536px;
}
}
@keyframes PlayBack {
0% {
background-position: -1536px;
}
100% {
background-position: 0px;
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
<div id="navOpen"></div>