我正在寻找使用纯CSS动画逼真的物体动画。具体做法是:
据我所知,CSS中的平滑动画目前只能通过使用立方Bézier曲线来实现:
https://developer.mozilla.org/en-US/docs/Web/CSS/timing-function
我发现可以通过cubic-bezier(0.33, 0, 0.66, 0.33)
完全建模下降,这可以看到上升反弹的cubic-bezier(0.33, 0.66, 0.66, 1)
:
http://jsfiddle.net/BYossarian/Frg74/2/
有谁知道(2)和/或(3)的最佳Bézier曲线? 如果任何人对任何其他类型的物理运动有任何意见,那也会很棒。
如果需要的话,我可以用眼球,但我希望有人可能会这样做。
答案 0 :(得分:2)
好的,所以我一直在玩这个,并且已经完成了振动。正如我所料,我必须拼凑一堆Bézier曲线才能使它工作:
http://jsfiddle.net/BYossarian/wrK44/6/(仅限webkit前缀)
红色球通过CSS动画,灰色框使用JS进行动画处理以供参考。 单击容器以开始/停止。
动画的CSS(没有前缀)是:
.vibrate {
animation: shm 2s infinite alternate;
}
@keyframes shm {
from {
margin-left:0px;
animation-timing-function: cubic-bezier(0.25, 0.01, 0.55, 0.16);
}
25% {
margin-left:29.3px;
animation-timing-function: cubic-bezier(0.52, 0.44, 0.47, 0.44);
}
50% {
margin-left:100px;
animation-timing-function: cubic-bezier(0.53, 0.56, 0.48, 0.56);
}
75% {
margin-left:170.7px;
animation-timing-function: cubic-bezier(0.45, 0.84, 0.75, 0.99);
}
to {
margin-left:200px;
}
}
几个笔记:
animation-duration
是球从一个边缘移动到另一个边缘的时间(通过设置animation-direction: alternate;
覆盖了返回行程),因此对象执行的时间为上面的完整循环是4s。更新:好的,所以我终于抽出时间让流畅的动作继续进行:
http://jsfiddle.net/S7WRp/(同样,仅限webkit前缀)
点击开始。第一个球通过JS动画。第二是CSS动画。第三个和第四个都以恒定速度(其他球的终端速度)行进并用作参考,因此您可以看到前两个球在开始时加速,然后在结束时达到终端速度。
CSS:
@keyframes fluidDrop {
from {
top: 0px;
animation-timing-function: cubic-bezier(0.7, 0.22, 0.725, 0.61);
}
13.33% {
top: 31.79px;
animation-timing-function: cubic-bezier(0.16, 0.1875, 0.24, 0.094);
}
23.66% {
top: 88.3px;
animation-timing-function: cubic-bezier(0.234, 0.15, 0.88, 0.85);
}
65% {
top: 441.5px;
animation-timing-function: linear;
}
to {
top: 800px;
}
}
更多笔记:
top
值以匹配您希望对象落下的距离。现在,它的距离是800px,因此,例如,如果你想让它落到1600px的距离,你可以将所有关键帧的所有top
值乘以2。