本文摘自PHP中文网,作者不言,侵删。
这篇文章给大家介绍的文章内容是关于SVG Path路径在网页开发的作用,有很好的参考价值,希望可以帮助到有需要的朋友。SVG是矢量图形表示,它的一个强大之处在于path标签可以表示任意的矢量形状,利用好这个path可以做出很多传统html/css做不出来的效果。下面举几个例子。
1. 做路径动画
这个我在《SVG导航下划线光标跟随效果》文后补充介绍了这个实现,最后的效果是这样的:
实现代码如下:
利用animateMotion结合path做的动画,具体说明可见上文。
2. 实现不规则形状的点击
如下图所示,需要实现点到哪个洲就进入哪个洲的效果,例如点到非洲就进入非洲:
我们可以用div定一个框盖在非洲的上面,但是用div的话只能是规则的四方形,没办法实现点到非洲大陆的时候才进入,但是大陆的轮廓又是不规则的,所以用传统html是不能解决这个问题的。但是用SVG的path可以解决这个问题,方法1是监听path的点击事件即可,如下图所示:
因为这个轮廓可以跟UI要到,他们一般都是用AI/PS等矢量软件画出来的,让他们导一个SVG给你就好了。
方法2是可以调SVG的isPointInFill这个API判断点击的点是否在Path的fill区域里面,这个也可以实现,但是相对于方法1来说比较麻烦,因为还需要把鼠标的位置转换为svg视图的位置。
3. 沿着路径拖拽的交互
在第1点沿着路径的动画是自动的过程,有没有办法让用户自己拖拽过去呢,实现如下效果:
这种的场景有音量控制等需要有百分比控制的。可以先用一个SVG的在线工具画出一个这样的图形:
就可以拿到SVG的代码:
1 2 3 4 5 |
|
这里比较关键的是path标签里的d属性,d是data的缩写,定义这个路径的形状,它里面可以用很多属性控制形状的变化,如下图所示:
为了实现这个交互,需要动态地改变circle的圆心位置(cx, cy)到路径上相应的地方。SVG没有直接提供相关的API,但是它提供了一个可以间接利用的API叫getPointAtLength,传递一个长度参数,如下代码所示:
1 2 3 4 5 |
|
控制台输出:
把circle的cx/cy改成上面的x/y坐标,圆圈就会跑到对应的位置去了:
这里的问题在于这个API传递的length参数是相对于曲线长度的,但是鼠标移动的位置是线性的,没办法直接知道当前鼠标在曲线上距离起始位置多少。
所以需要算一下,在这个场景里面我们可以取鼠标的x坐标在曲线上对应的位置就可以了,如下图示意:
到这里就有思路了,可以把这条路径上每隔一个像素长度就算一下它的坐标在哪里,然后存在一个数组里面。由于鼠标移动的时候x坐标是知道的,就可以查一下在这个数组里面相应x坐标的y坐标是多少,就能得到想要的圆心位置了。
所以先计算一下,保存到一个数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
这里用一个p0ints数组来保存,它的索引index就为x坐标,值为y坐标。在这个例子里面,总长度为451.5px,得到的points数组长度为388. 你可以隔0.5px长度就保存一个坐标,不过在这个例子里面1px就够了。
相关阅读 >>
canvas与SVG的区别有什么?canvas和SVG的区别比较
更多相关阅读请进入《SVG》频道 >>
Vue.js 设计与实现 基于Vue.js 3 深入解析Vue.js 设计细节
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者