简体   繁体   English

CSS animation 禁用 hover 过渡效果

[英]CSS animation disables hover transition effect

I have created a class with an animation (changes the shape) for a button that will be triggered by a click.我创建了一个 class 和一个 animation (更改形状),用于单击将触发的按钮。 After the shapeshift, I wanted to have a hover effect which only changes the color.变形后,我想要一个只改变颜色的 hover 效果。 Each one works fine separately: .playBtn:hover and .pauseBtn:hover .每个单独工作正常: .playBtn:hover.pauseBtn:hover

However, when I add both of them, it seems the animations disable the hover effects (the hover effect won't apply.)?但是,当我添加它们时,动画似乎禁用了 hover 效果(hover 效果不适用。)? Does anyone have an idea why this happens?有谁知道为什么会这样?

Here is my code (main subject is CSS, but HTML and JS are also added just in case):这是我的代码(主要主题是 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/ jsfiddle: https://jsfiddle.net/cf5abeoz/

Remove the forwards fill-mode from the animation and the :hover styles will work correctly.forwards中删除animation填充模式, :hover styles 将正常工作。

For more information on the different fill-modes see https://developer.mozilla.org/en-US/docs/Web/CSS/animation-fill-mode .有关不同填充模式的更多信息,请参阅https://developer.mozilla.org/en-US/docs/Web/CSS/animation-fill-mode

When the animation-fill-mode property is set to forwards , the initial values will be overwritten withanimation-fill-mode属性设置为forwards时,初始值将被覆盖
"the computed values set by the last keyframe encountered during execution [of the animation]" ( MDN docs ). “[动画]执行期间遇到的最后一个关键帧设置的计算值”MDN 文档)。

I'm not entirely sure whether that means the :hover rules themselves also get overwritten, but either way, although the computed values are the same as the initial values, the :hover rules won't work anymore with the computed values.我不完全确定这是否意味着:hover规则本身也会被覆盖,但无论哪种方式,尽管计算值与初始值相同,但:hover规则将不再适用于计算值。 Also see this answer .另请参阅此答案

So your best option is probably to remove the forwards from your animation shorthand property.因此,您最好的选择可能是从您的animation速记属性中删除forwards
Of course this creates other problems in your current code.当然,这会在您当前的代码中产生其他问题。 In order to fix that, you need to set the same styles as at the end of the animation, to the basic selector for the .playBtn and .pauseBtn .为了解决这个问题,您需要将与 animation 末尾相同的 styles 设置为.playBtn.pauseBtn的基本选择器。
Finally, in order to prevent interference from the rules set for #musicBtn (in particular for the pause-button), you need to prepend #musicBtn to all your selectors.最后,为了防止为#musicBtn (特别是暂停按钮)设置的规则造成干扰,您需要在所有选择器前面加上#musicBtn

So, for the play-button : (and same for the pause-button )因此,对于播放按钮:(对于暂停按钮也是如此)

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

becomes变成

#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;
}

That's basically it.基本上就是这样。 In the live snippet below I changed some other things as well, you can simply ignore those or see if you like them and apply them to your own code.在下面的实时代码片段中,我还更改了其他一些内容,您可以简单地忽略这些内容,或者查看您是否喜欢它们并将它们应用到您自己的代码中。 They are not necessary for your code to work.它们不是您的代码工作所必需的。

 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/ jsfiddle: https://jsfiddle.net/njkqpz9L/1/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM