我正在进入CSS3动画和过渡的世界,所以请原谅我的无知。 这是我正在尝试做的简化版本:
这是我使用CSS3动画和过渡的混合(到目前为止在Chrome上测试,因此webkit前缀):
@-webkit-keyframes pulsate {
from {
-webkit-transform: scale(0.7);
}
to {
-webkit-transform: scale(0.8);
}
}
.ball {
background: blue;
width: 100px;
height: 100px;
border-radius: 50%;
transition: all 1s;
-webkit-transform: scale(0.7);
-webkit-transform-origin: center center;
-webkit-animation-duration: 800ms;
-webkit-animation-name: pulsate;
-webkit-animation-iteration-count: infinite;
-webkit-animation-direction: alternate;
-webkit-animation-timing-function: ease-in-out;
}
.ball:hover {
-webkit-transform: scale(2);
-webkit-animation-play-state: paused; /* transition works but gets reset at the end*/
/*-webkit-animation: 0;*/ /* transition works only one time, and no smooth transition on mouse out */
}
结果非常接近,但是一旦球在悬停时完成扩展,它会再次突然变小(不明白为什么)。我还尝试通过-webkit-animation: 0;
禁用动画,而不是暂停它,但它也不能正常工作。
我尝试了一种不同的方法,只使用关键帧(无转换),尝试在悬停时调用不同的关键帧:
@-webkit-keyframes pulsate {
from {
-webkit-transform: scale(0.7);
}
to {
-webkit-transform: scale(0.8);
}
}
@-webkit-keyframes expand {
to {
-webkit-transform: scale(2);
}
}
@-webkit-keyframes shrink {
to {
-webkit-transform: scale(0.7);
}
}
.ball {
background: blue;
width: 100px;
height: 100px;
border-radius: 50%;
transition: all 2s;
-webkit-transform: scale(0.7);
-webkit-transform-origin: center center;
-webkit-animation-duration: 800ms, 800ms;
-webkit-animation-name: shrink, pulsate;
-webkit-animation-iteration-count: 1, infinite;
-webkit-animation-direction: normal, alternate;
-webkit-animation-timing-function: ease-in-out, ease-in-out;
}
.ball:hover {
-webkit-animation-name: expand;
-webkit-animation-iteration-count: 1;
-webkit-animation-direction: normal;
-webkit-animation-fill-mode: forwards;
}
只要鼠标悬在球上,球就会保持很大,但当鼠标远离球时,球仍然没有平滑过渡。我希望它能够播放缩小动画,但事实并非如此。
我是否遗漏了某些内容,或者目前只使用纯CSS实现这是不可能的?
//相关主题,但对我不起作用:Stop animation and start transition on hover
答案 0 :(得分:3)
您需要添加动画延迟以允许转换完成,因为它会在动画开始时恢复为scale(.7)
。 Updated jsFiddle
-webkit-animation-delay:1s;
修改强>
我意识到我在这里发布的答案并不完全正确。确实,延迟动画了从大回到小回的过渡,但如果你在扩展时将其悬停在脉冲球上,它会在动画到大规模之前跳回到它的0值.7。
我想出了一个修复程序,只使用一些javascript来修复它this article。你必须稍微改变一下CSS,但结果并不是很明显。这是更新的代码
/* CSS */
body {margin: 100px;}
@-webkit-keyframes pulsate {
0% {
-webkit-transform: scale(0.7);
}
50% {
-webkit-transform: scale(0.8);
}
100% {
-webkit-transform: scale(0.7);
}
}
.ball {
background: blue;
width: 100px;
height: 100px;
border-radius: 50%;
-webkit-transform: scale(0.7);
-webkit-transform-origin: center center;
transition: all 1s;
}
.ball.animated {
-webkit-animation-duration: 1600ms;
-webkit-animation-name: pulsate;
-webkit-animation-iteration-count: infinite;
-webkit-animation-direction: alternate;
-webkit-animation-timing-function: ease-in-out;
}
/* Javascript */
var ball = document.getElementsByClassName('ball')[0],
pfx = ["webkit", "moz", "MS", "o", ""],
hovered = false;
function AnimationListener() {
if(hovered)
{
ball.classList.remove('animated');
ball.style.webkitTransform = 'scale(2)';
ball.style.transform = 'scale(2)';
}
}
function TransitionListener() {
if(!hovered)
{
ball.classList.add('animated');
}
}
function PrefixedEvent(element, type, callback) {
for (var p = 0; p < pfx.length; p++) {
if (!pfx[p]) type = type.toLowerCase();
element.addEventListener(pfx[p]+type, callback, false);
}
}
PrefixedEvent(ball, "AnimationIteration", AnimationListener);
ball.onmouseover = function() {
hovered = true;
}
ball.onmouseout = function() {
hovered = false;
PrefixedEvent(ball, "TransitionEnd", TransitionListener);
ball.style.webkitTransform = 'scale(.7)';
ball.style.transform = 'scale(.7)';
}
答案 1 :(得分:1)
只需更新此CSS规则,我已添加了From&amp; To - in Expand&amp;收缩:
@-webkit-keyframes expand {
from {
-webkit-transform: scale(1);
}
to {
-webkit-transform: scale(2);
}
}
@-webkit-keyframes shrink {
from {
-webkit-transform: scale(2);
}
to {
-webkit-transform: scale(1);
}
}