CSS动画会禁用悬停过渡效果

时间:2020-06-23 23:55:38

标签: html css

我创建了一个带有动画(更改形状)的类,该类将由单击触发。变形后,我希望有一个仅改变颜色的悬停效果。每个人都可以正常工作:.playBtn:hover.pauseBtn:hover

但是,当我同时添加它们时,似乎动画会禁用悬停效果(悬停效果将不适用!)。有谁知道为什么会这样?

这是我的代码(主要主题是CSS,但也添加了HTML和JS以防万一):

var bgMusic = document.getElementById("bgMusic"),
    musicBtn = document.getElementById("musicBtn"),
    music = false;

function toggleMusic() {
  if (music) {
    bgMusic.pause()
  } else {
    bgMusic.play();
  }
};

bgMusic.onplaying = function() {
  musicBtn.classList.remove("playBtn");
  musicBtn.classList.add("pauseBtn");
  music = true;
};

bgMusic.onpause = function() {
  musicBtn.classList.remove("pauseBtn");
  musicBtn.classList.add("playBtn");
  music = false;
};
#musicBtn {
  width: 0;
  height: 0;
  border-left: 16px solid grey;
  border-top: 8px solid transparent;
  border-bottom: 8px solid transparent;
  margin-top: 3.5px;
  -webkit-transition-property: all;
  -moz-transition-property: all;
  -ms-transition-property: all;
  -o-transition-property: all;
  transition-property: all;
  -webkit-transition-duration: .4s;
  -moz-transition-duration: .4s;
  -ms-transition-duration: .4s;
  -o-transition-duration: .4s;
  transition-duration: .4s;
}

#musicBtn:hover {border-left: white 16px solid;}

.playBtn {animation: play-btn .6s ease forwards;}

@keyframes play-btn {
  from {
    transform: rotateZ(0);
    width: 5px;
    height: 15px;
    border-left: 5px solid white;
    border-top: 0 solid transparent;
    border-right: 5px solid white;
    border-bottom: 0 solid transparent;
  } to {
    transform: rotateZ(-360deg);
    width: 0;
    height: 0;
    border-left: 16px solid grey;
    border-top: 8px solid transparent;
    border-right: 0 solid transparent;
    border-bottom: 8px solid transparent;
  }
}

.playBtn:hover {border-left: 16px solid white;}  /*IT WON'T TAKE EFFECT!*/

.pauseBtn {animation: pause-btn .6s ease forwards;}

@keyframes pause-btn {
  from {
    transform: rotateZ(0deg);
    width: 0;
    height: 0;
    border-left: 16px solid grey;
    border-top: 8px solid transparent;
    border-right: 0 solid transparent;
    border-bottom: 8px solid transparent;
  } to {
    transform: rotateZ(360deg);
    width: 5px;
    height: 15px;
    border-left: 5px solid white;
    border-top: 0 solid transparent;
    border-right: 5px solid white;
    border-bottom: 0 solid transparent;
  }
}

.pauseBtn:hover {border-left: 5px solid grey; border-right: 5px solid grey;}  /*IT WON'T TAKE EFFECT!*/
<audio id="bgMusic" src="some music ...."></audio>
<div><div id="musicBtn" onclick="toggleMusic();"></div></div>
jsfiddle:https://jsfiddle.net/cf5abeoz/

2 个答案:

答案 0 :(得分:0)

forwards删除animation填充模式,:hover样式将正常工作。

有关不同填充模式的更多信息,请参见https://developer.mozilla.org/en-US/docs/Web/CSS/animation-fill-mode

答案 1 :(得分:0)

animation-fill-mode属性设置为forwards时,初始值将被覆盖
”“ [执行动画时]遇到的最后一个关键帧设置的计算值” MDN docs)。

我不确定这是否意味着:hover规则本身也会被覆盖,但是无论哪种方式,尽管计算值与初始值相同,但:hover规则不会使用计算出的值了。 Also see this answer

因此,最好的选择可能是从forwards速记属性中删除animation
当然,这会在当前代码中产生其他问题。为了解决这个问题,您需要为.playBtn.pauseBtn的基本选择器设置与动画末尾相同的样式。
最后,为了防止受到#musicBtn设置的规则(尤其是暂停按钮)的干扰,您需要在所有选择器的前面加上#musicBtn

因此,对于播放按钮(与暂停按钮相同)

.playBtn {animation: play-btn .6s ease forwards;}

成为

#musicBtn.playBtn {
  width: 0;
  height: 0;
  border-left: 16px solid grey;
  border-top: 8px solid transparent;
  border-right: 0 solid transparent;
  border-bottom: 8px solid transparent;
  animation: play-btn .6s ease;
}

基本上就是这样。在下面的实时代码段中,我还更改了其他一些内容,您可以简单地忽略这些内容或查看您是否喜欢它们并将它们应用于您自己的代码。对于您的代码来说,它们不是必需的。

document.getElementById("musicBtn").onclick = function() {
  if (this.classList.contains("pause")) {
    this.classList.replace("pause","play");
  } else {
    this.classList.replace("play","pause");
  }
};
body {background:black;}

#musicBtn {-webkit-transition-duration:.4s; -moz-transition-duration:.4s; -ms-transition-duration:.4s; -o-transition-duration:.4s; transition-duration:.4s;}

#musicBtn.play {animation:play-btn .6s ease; width:0; height:0; border-left:16px solid grey; border-top:8px solid transparent; border-right:0 solid transparent; border-bottom:8px solid transparent;}
#musicBtn.play:hover {border-left:16px solid white;}
@keyframes play-btn {
  from {transform:rotateZ(0deg); width:5px; height:15px; border-left:5px solid white; border-top:0 solid transparent; border-right:5px solid white; border-bottom:0 solid transparent;}
  to {transform:rotateZ(-360deg); width:0; height:0; border-left:16px solid white; border-top:8px solid transparent; border-right:0 solid transparent; border-bottom:8px solid transparent;}
}

#musicBtn.pause {animation:pause-btn .6s ease; width:5px; height:15px; border-left:5px solid grey; border-top:0 solid transparent; border-right:5px solid grey; border-bottom:0 solid transparent;}
#musicBtn.pause:hover {border-left:5px solid white; border-right:5px solid white;}
@keyframes pause-btn {
  from {transform:rotateZ(0deg); width:0; height:0; border-left:16px solid white; border-top:8px solid transparent; border-right:0 solid transparent; border-bottom:8px solid transparent;}
  to {transform:rotateZ(360deg); width:5px; height:15px; border-left:5px solid white; border-top:0 solid transparent; border-right:5px solid white; border-bottom:0 solid transparent;}
}
<div class="play" id="musicBtn"></div>
jsfiddle:https://jsfiddle.net/njkqpz9L/1/