CSS:如何在另一个动画运行时保持悬停过渡平滑

Posted

技术标签:

【中文标题】CSS:如何在另一个动画运行时保持悬停过渡平滑【英文标题】:CSS: How to keep a hover transition smooth while another animation is running 【发布时间】:2016-12-22 19:18:27 【问题描述】:

我创建了一个按钮。此按钮由以下 CSS 属性定义:

#button 
    width: 50px;
    height: 50px;
    border: 3px solid #F1F2F0;
    text-align:center;
    background-color: #02BFC1;
    display: table;
    position: absolute;
    margin: auto;
    top: 0;
    bottom: 0;
    left: 0;
    right:0;
    -webkit-transition: all 0.5s ease;
    cursor: pointer;
    box-shadow: 0px 0px 30px rgba(0,0,0,0.4);
    animation: blinker 2s ease infinite;

此按钮使用动画blinker 闪烁,该动画将background-color 从较深的蓝色平滑地更改为较浅的蓝色,定义如下:

@keyframes blinker   
    50%  background-color: #03FCFF; 

它还有一个悬停动画:

#button:hover 
    background-color: #F37C2B;
    transform: scale(1.1);
    box-shadow: 0px 0px 70px rgba(0,0,0,0.4);
    animation-name: none;

我的问题是:在我添加闪烁动画之前,悬停动画曾经是完全平滑的。现在,它只是立即将background-color 变为橙色,而transform: scale(1.1) 仍然平滑地变化。

如何使悬停按钮暂停blinker 动画并平滑更改background-color,并通过鼠标离开按钮恢复动画?如果可能的话,我想只使用 CSS 而不是 js。

如果您愿意,可以修改此JSFiddle 进行回复。

编辑:这不仅适用于 chrome,我怎样才能让它如此呢?

【问题讨论】:

【参考方案1】:

您的 CSS 中发生了太多事情。作为一般规则,如果您希望代码快速高效,请尝试让事情尽可能简单

这里是你的工作代码和一些解释:

button 
  width: 50px;
  height: 50px;
  display: block;
  border: 3px solid #F1F2F0;
  background-color: #02BFC1;
  margin: 30px auto;
  cursor: pointer;
  box-shadow: 0px 0px 30px rgba(0, 0, 0, 0.4);
  animation: 2s ease infinite blinker;
  transition: background-color .5s ease, transform .5s ease, box-shadow .5s ease; /* it is best to select the properties you want to transition instead of using 'all' */


@keyframes blinker 
  50% 
    background-color: #03FCFF;
  


button:hover 
  background-color: #F37C2B;
  box-shadow: 0px 0px 70px rgba(0, 0, 0, 0.4);
  animation: none;
  transform: scale(1.1);
<button></button>

不要忘记使用项目所需的前缀。

【讨论】:

悬停不平滑的问题你还不解决? @JocaPinto 您使用的是哪个浏览器?在 Firefox 48 中对我来说非常流畅。 你说得对,它在 Chrome 中运行不顺畅。这是一个错误,我没有找到任何 CSS 解决方案(除了改变你的效果),对不起。 一定有办法

以上是关于CSS:如何在另一个动画运行时保持悬停过渡平滑的主要内容,如果未能解决你的问题,请参考以下文章

平滑的 CSS 过渡动画旋转

CSS3:动画之间的平滑过渡:hover

平滑的悬停过渡?

如何使 CSS3 悬停过渡只运行一次,而不是在用户“取消悬停”后“倒带”?

如何禁用过渡或动画时间的悬停效果,然后在过渡或动画在 css 中完成后启用它?

CSS:在悬停时替换文本,但平滑过渡到新文本不起作用?