@songlaf
2018-06-15T23:19:14.000000Z
字数 1662
阅读 1256
1)首先是如何生成起点到终点的抛物线,贝赛尔曲线是用来生成平滑的抛物线的,所以首先了解下贝塞尔曲线的原理。
贝塞尔曲线是通过起点和中间增加控制点来生成的,如果把起点和终点链接起来是一条直线,如果在起点和终点中间的地方增加控制点,那么线会朝着点的方向以曲线来扭曲,于是就产生了抛物线,可以通过控制点的数量和坐标来控制曲线的形状。
可以参考这个网站,这个网址的控制点可以拖动,可以通过修改控制点来直观的了解贝塞尔曲线
https://www.jasondavies.com/animated-bezier/
2)svg提供了生成了贝塞尔曲线的方式,可以参考这个网址,
https://www.cnblogs.com/yjstonestar/p/5003715.html
3)如果曲线一成不变,那么就很枯燥,曲线的变动可以通过修改起点、终点、控制点来完成
比如下面这条贝塞尔曲线
我可以通过修改pat的属性d的数值,比如如果我把起点修改,那么曲线就会变动,
为了达到好的效果,尽量起点和控制点的位置都变动
比如我修改如下
起点有(10,10)变成(20,20),第一个控制点由(20,20)变成(30,20)
那么在网页上就会产生曲线起点移动的效果。
4)曲线变动也比较枯燥,可以在曲线上增加一个小球,
svg可以设置一个元素沿着某种方式来运动,如果把元素的运动方式设置成跟随曲线,那么就会产生元素沿着曲线运动的效果。
设置运动属性href属性。
可以参考下面的网址
https://segmentfault.com/q/1010000010875025
5)这里给一个例子程序:
html
<svg width="50cm" height="10cm" viewBox="0 0 600 600"><path id="path1" d="M100,500 C 300,200 400,200 500,500"fill="none" stroke="blue" stroke-width="5" /></svg>
<script>$(function () {var svg = $("svg");var circle = document.createElementNS("http://www.w3.org/2000/svg","circle");circle.setAttribute("r", "15");circle.setAttribute("fill", "red");var ani = document.createElementNS("http://www.w3.org/2000/svg","animateMotion");ani.setAttribute("dur", "5s");ani.setAttribute("repeatCount", "indefinite");ani.setAttribute("rotate", "auto");var mpath = document.createElementNS("http://www.w3.org/2000/svg","mpath");//设置沿着贝塞尔取消运动mpath.setAttributeNS ("http://www.w3.org/1999/xlink", "href", "#path1");ani.appendChild(mpath);circle.appendChild(ani);svg.append(circle);x = 100;y = 500;x1 = 300;y1 = 200;x3 = 400;y3 = 200;//启动一个timer来修改贝塞尔曲线起点和控制点的位置,以达到变动曲线起点和曲线形状的目的setInterval(function () {x=x+1;y=y+1;x1 = x1 +1;y1 = y1 +1;x3 = x3 +1;y3 = y3 +1;var data = "M"+x+","+y+" C "+x1+","+y1+" "+x3+","+y3+" 500,500";$("#path1").attr("d",data);},100)})</script>