わかりましたので、私はこれで遊んでいて、バイブレーションを行っています。予想通り、機能させるには一連のベジエ曲線をつなぎ合わせる必要がありました。
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;
)。そのため、オブジェクトが上記の完全なループを実行するのにかかる時間は 4 秒です。
更新: わかりましたので、ようやく流動的な動きを開始する時間を見つけました:
http://jsfiddle.net/S7WRp/ (これも Webkit プレフィックスのみ)
クリックして開始します。最初のボールは JS を介してアニメーション化されます。2 つ目は CSS アニメーションです。3 番目と 4 番目のボールはどちらも一定の速度 (他のボールの終端速度) で移動しており、参照として使用されるため、最初の 2 つのボールが最初に加速し、最後に終端速度に達することがわかります。
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 倍します。