在弯曲的路径中移动一个 div(就像过去 Flash 中的补间)? [英] Move a div in a curved path (like tweening in Flash old days)?
问题描述
我想构建一个类似的功能
fromHeretoThere(x1,y1,x2,y2){//....}
这样我就可以将
这只能使用 Canvas 吗?HTML5?你有什么插件/脚本推荐吗?
编辑:这是一项正在进行的工作,它将下面描述的第二个概念打包为可重用的 JS 对象.您可以编辑代码或直观地拖动曲线以查看生成的代码:
.
I'd like to build a function like
fromHeretoThere(x1,y1,x2,y2){
//....
}
So that I can move a <div>
or an image from one point on the HTML page to another point in a curve.
Is this doable only using Canvas? HTML5? any plugin/scripts yo suggest?
Edit: Here's a work in progress that packages up the second concept described below as a re-usable JS object. You can edit the code or visually drag the curve to see the resulting code:
http://phrogz.net/SVG/animation_on_a_curve.html
I'd personally use SVG, which makes this sort of thing (animating along an arbitrary Bézier curve) trivial using the <animateMotion>
element. As a bonus, you can even cause it to calculate the rotation for you. Some examples:
- http://www.w3.org/TR/SVG/images/animate/animMotion01.svg
- https://developer.mozilla.org/en/SVG/Element/animateMotion
- http://devfiles.myopera.com/articles/76/SolarSystem.svg
Note that you don't even have to actually use SVG to display the result; you could simply create an off-screen SVG with this animation and sample the transform of the animated element to get your desired point/rotation.
Alternatively (if you don't want the rotation, or want to calculate it yourself while controlling the rate of traversal) you can create an SVG path and just use getPointAtLength()
/getTotalLength()
to find where you should be along the path at a given percentage of the total traversal distance. With this you don't even need an SVG document:
// Moving along an S curve from 0,0 to 250,450
var p = document.createElementNS('http://www.w3.org/2000/svg','path');
p.setAttribute('d','M0,0 C350,20 -200,400 250,450');
var len = p.getTotalLength();
for (var i=0;i<=100;i+=10){
var pct = i/100;
var pt = p.getPointAtLength(pct*len);
console.log( i, pt.x, pt.y );
}
// 0 0 0
// 10 65.54324340820312 10.656576156616211
// 20 117.17988586425781 49.639259338378906
// 30 120.2674789428711 114.92564392089844
// 40 100.49604034423828 178.4400177001953
// 50 78.06965637207031 241.1177520751953
// 60 63.526206970214844 305.9412841796875
// 70 74.59959411621094 370.6294860839844
// 80 122.1227798461914 415.8912658691406
// 90 184.41302490234375 438.8457336425781
// 100 250 450
Now all you have to do is set the .style.top
and .style.left
of your <div>
or <img>
appropriately. The only 'hard' part is deciding what you want to the curve to look like and defining where to put the handles.
这篇关于在弯曲的路径中移动一个 div(就像过去 Flash 中的补间)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!