2017-04-21 77 views
1

这里是my CodePen在Chrome中正常工作。在Firefox中结合CSS过渡和动画

.animated-box { 
 
    width: 100px; 
 
    height: 100px; 
 
    margin: 10px auto; 
 
    background: black; 
 
    border-radius: 50px; 
 
    transition-duration: 0.2s; 
 
} 
 

 
.animated-box:hover { 
 
    border-radius: 18px; 
 
    animation-name: test; 
 
    animation-duration: 0.7s; 
 
    animation-delay: 0.2s; 
 
} 
 

 
@keyframes test { 
 
    0% { 
 
    border-radius: 18px; 
 
    } 
 
    12% { 
 
    border-radius: 15px; 
 
    } 
 
    41% { 
 
    border-radius: 21px; 
 
    } 
 
    70% { 
 
    border-radius: 16px; 
 
    } 
 
    100% { 
 
    border-radius: 18px; 
 
    } 
 
}
<div class="animated-box"></div>

但是有一个问题,在Firefox。 如果同时存在CSS过渡和CSS动画属性,则不会播放动画。 如何使它工作?

将“out”动画制作为.animated-box选择器是错误的解决方案,因为此动画将在页面加载后播放。

这里是a video比较Firefox和Chrome的结果。

+1

那么,你的'过渡delay'没有做任何事情,所以我不知道为什么它的存在? ...如果你想同时做转换和动画,先把所有的代码放在第一位,然后我们才能说出为什么或如何使它工作 – LGSon

+0

它的工作在Firefox上,以及..哪个版本的Firefox不工作? –

+0

'transition-delay'用于在从圆形过渡到方形结束后产生“反弹”效果 – RNR

回答

1

该规范并不完全清楚应该发生什么,所以我相信Firefox和Chrome都在技术上遵守它。 最安全的解决方法是不使用过渡和动画的组合,而是完成动画中的所有操作。我将在下面给出一个演示。

背景
specification具有示出了动画延迟期间,元件的固有样式应该施加一个有用的图。这种风格由你转变。

Figure 1 in CSS3 animations specification: illustration of animation style

现在说明书陈述

用于关键​​帧和动画属性的值被在时间动画开始快照。在执行动画期间更改它们不起作用。

它看起来像火狐(至少在Linux上)快照右悬停效果应用值,然后使用它作为内在风格。这意味着不应用转换。 Chrome确实会执行转换,将其视为内在风格。

跨浏览器的工作液
而是第一,然后做一个过渡动画的,我们可以做动画的一切。我计算了关键帧应该如何移动和更新动画。这也实现了您在Firefox中看到的效果。

.animated-box { 
 
    width: 100px; 
 
    height: 100px; 
 
    margin: 10px auto; 
 
    background: black; 
 
    border-radius: 50px; 
 
} 
 

 
.animated-box:hover { 
 
    border-radius: 18px; 
 
    animation-name: test; 
 
    animation-duration: 0.9s; 
 
} 
 

 
@keyframes test { 
 
    0% { 
 
    border-radius: 50px; 
 
    } 
 
    22% { 
 
    border-radius: 18px; 
 
    } 
 
    32% { 
 
    border-radius: 15px; 
 
    } 
 
    54% { 
 
    border-radius: 21px; 
 
    } 
 
    77% { 
 
    border-radius: 16px; 
 
    } 
 
    100% { 
 
    border-radius: 18px; 
 
    } 
 
}
<div class="animated-box"></div>

+1

为了使它看起来非常好,您可能需要改变顺序并将最后一个值更改为100%{border-radius:50px; }'...仍然,加1 – LGSon

+0

@LGSon同意,我只是想坚持OP尽可能接近。 –

+2

明白了,尽管OP在非徘徊类中设置了过渡属性,这意味着它应该适用于鼠标悬停和悬停。如果你在Chrome上检查原始的codepen,你会发现它确实是 – LGSon