我已经为一个按钮创建了一个具有动画(改变形状)的类,该按钮将通过单击来触发。在变形之后,我想要一个只改变颜色的悬停效果。每一个操作都很好:.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/
发布于 2020-06-24 04:28:49
当animation-fill-mode属性设置为forwards时,初始值将用
“在动画执行过程中遇到的最后一个关键帧设置的计算值”(MDN文档)。
我不完全确定这是否意味着:hover规则本身也会被覆盖,但不管怎样,尽管计算值与初始值相同,但:hover规则将不再适用于计算值。也请看这个答案。
因此,最好的选择可能是从forwards速记属性中删除animation。
当然,这会在当前代码中产生其他问题。为了解决这个问题,您需要将与动画末尾相同的样式设置为.playBtn和.pauseBtn的基本选择器。
最后,为了防止来自为#musicBtn设置的规则(特别是暂停按钮)的干扰,您需要将#musicBtn添加到所有选择器中。
所以,对于play-button (暂停按钮也是如此)。
.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>小提琴手:https://jsfiddle.net/njkqpz9L/1/
发布于 2020-06-24 00:17:26
从forwards中删除animation填充模式,:hover样式将正确工作。
有关不同填充模式的更多信息,请参见https://developer.mozilla.org/en-US/docs/Web/CSS/animation-fill-mode。
https://stackoverflow.com/questions/62545524
复制相似问题