好的,所以我一直在玩这个,并完成了振动。正如我所料,我必须拼凑一堆贝塞尔曲线才能使其工作:
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-delay来抵消它。
- 您可以通过将它们全部乘以某个常数来放大/缩小距离,它应该可以工作。
- 这里
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。