[关闭]
@songlaf 2018-06-15T23:19:14.000000Z 字数 1662 阅读 1090

SVG画运动的曲线


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

  1. <svg width="50cm" height="10cm" viewBox="0 0 600 600">
  2. <path id="path1" d="M100,500 C 300,200 400,200 500,500"
  3. fill="none" stroke="blue" stroke-width="5" />
  4. </svg>
  1. <script>
  2. $(function () {
  3. var svg = $("svg");
  4. var circle = document.createElementNS("http://www.w3.org/2000/svg","circle");
  5. circle.setAttribute("r", "15");
  6. circle.setAttribute("fill", "red");
  7. var ani = document.createElementNS("http://www.w3.org/2000/svg","animateMotion");
  8. ani.setAttribute("dur", "5s");
  9. ani.setAttribute("repeatCount", "indefinite");
  10. ani.setAttribute("rotate", "auto");
  11. var mpath = document.createElementNS("http://www.w3.org/2000/svg","mpath");
  12. //设置沿着贝塞尔取消运动
  13. mpath.setAttributeNS ("http://www.w3.org/1999/xlink", "href", "#path1");
  14. ani.appendChild(mpath);
  15. circle.appendChild(ani);
  16. svg.append(circle);
  17. x = 100;
  18. y = 500;
  19. x1 = 300;
  20. y1 = 200;
  21. x3 = 400;
  22. y3 = 200;
  23. //启动一个timer来修改贝塞尔曲线起点和控制点的位置,以达到变动曲线起点和曲线形状的目的
  24. setInterval(function () {
  25. x=x+1;
  26. y=y+1;
  27. x1 = x1 +1;
  28. y1 = y1 +1;
  29. x3 = x3 +1;
  30. y3 = y3 +1;
  31. var data = "M"+x+","+y+" C "+x1+","+y1+" "+x3+","+y3+" 500,500";
  32. $("#path1").attr("d",data);
  33. },100)
  34. })
  35. </script>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注