svg path路径的作用:svg path在网页开发中的使用方法


本文摘自PHP中文网,作者不言,侵删。

这篇文章给大家介绍的文章内容是关于SVG Path路径在网页开发的作用,有很好的参考价值,希望可以帮助到有需要的朋友。

SVG是矢量图形表示,它的一个强大之处在于path标签可以表示任意的矢量形状,利用好这个path可以做出很多传统html/css做不出来的效果。下面举几个例子。

1. 做路径动画

这个我在《SVG导航下划线光标跟随效果》文后补充介绍了这个实现,最后的效果是这样的:

6.gif

实现代码如下:

1-1.png

利用animateMotion结合path做的动画,具体说明可见上文。

2. 实现不规则形状的点击

如下图所示,需要实现点到哪个洲就进入哪个洲的效果,例如点到非洲就进入非洲:

4-1.png

我们可以用div定一个框盖在非洲的上面,但是用div的话只能是规则的四方形,没办法实现点到非洲大陆的时候才进入,但是大陆的轮廓又是不规则的,所以用传统html是不能解决这个问题的。但是用SVG的path可以解决这个问题,方法1是监听path的点击事件即可,如下图所示:

2-1.png

因为这个轮廓可以跟UI要到,他们一般都是用AI/PS等矢量软件画出来的,让他们导一个SVG给你就好了。

方法2是可以调SVG的isPointInFill这个API判断点击的点是否在Path的fill区域里面,这个也可以实现,但是相对于方法1来说比较麻烦,因为还需要把鼠标的位置转换为svg视图的位置。

3. 沿着路径拖拽的交互

在第1点沿着路径的动画是自动的过程,有没有办法让用户自己拖拽过去呢,实现如下效果:

svg-move-path.gif

这种的场景有音量控制等需要有百分比控制的。可以先用一个SVG的在线工具画出一个这样的图形:

5.png

就可以拿到SVG的代码:

1

2

3

4

5

<svg class="volumn-controller" width="580" height="400" xmlns="http://www.w3.org/2000/svg">

    <path class="volumn-path" stroke="#000" d="m100,247c93,-128 284,-129 388,6" opacity="0.5" stroke-width="1" fill="#fff"/>

    <circle class="drag-button" r="12" cy="247" cx="100" stroke-width="1" stroke="#000" fill="#fff"/>

 </g>

</svg>

这里比较关键的是path标签里的d属性,d是data的缩写,定义这个路径的形状,它里面可以用很多属性控制形状的变化,如下图所示:

7-1.png

为了实现这个交互,需要动态地改变circle的圆心位置(cx, cy)到路径上相应的地方。SVG没有直接提供相关的API,但是它提供了一个可以间接利用的API叫getPointAtLength,传递一个长度参数,如下代码所示:

1

2

3

4

5

let volumnPath = document.querySelector('.volumn-path');

// 输出path在长度为100的位置的点坐标

console.log(volumnPath.getPointAtLength(100));

// 输出当前path的总长度

console.log(volumnPath.getTotalLength());

控制台输出:

8-1.png

把circle的cx/cy改成上面的x/y坐标,圆圈就会跑到对应的位置去了:

9-1.png

这里的问题在于这个API传递的length参数是相对于曲线长度的,但是鼠标移动的位置是线性的,没办法直接知道当前鼠标在曲线上距离起始位置多少。

所以需要算一下,在这个场景里面我们可以取鼠标的x坐标在曲线上对应的位置就可以了,如下图示意:

10-1.png

到这里就有思路了,可以把这条路径上每隔一个像素长度就算一下它的坐标在哪里,然后存在一个数组里面。由于鼠标移动的时候x坐标是知道的,就可以查一下在这个数组里面相应x坐标的y坐标是多少,就能得到想要的圆心位置了。

所以先计算一下,保存到一个数组:

1

2

3

4

5

6

7

8

9

10

11

12

13

let $volumnController = document.querySelector('.volumn-controller'),

    $volumnPath = $volumnController.querySelector('.volumn-path');

// 得到当前路径的总长度

let pathTotalLength = $volumnPath.getTotalLength() >> 0;

let points = [];

// 起始位置为长度为0的位置

let startX = Math.round($volumnPath.getPointAtLength(0).x);

// 每隔一个像素距离就保存一下路径上点的坐标

for (let i = 0; i < pathTotalLength; i++) {

    let p = $volumnPath.getPointAtLength(i);

    // 保存的坐标用四舍五入,可以平衡误差

    points[Math.round(p.x) - startX] = Math.round(p.y);

}

这里用一个p0ints数组来保存,它的索引index就为x坐标,值为y坐标。在这个例子里面,总长度为451.5px,得到的points数组长度为388. 你可以隔0.5px长度就保存一个坐标,不过在这个例子里面1px就够了。

阅读剩余部分

相关阅读 >>

如何在html5中使用SVG

html5中canvas与SVG有什么区别

SVG如何实现坐标系统变换(附代码)

canvas与SVG的区别有什么?canvas和SVG的区别比较

html5实战-SVG的详解

react中如何优雅的使用SVG

css如何改变SVG颜色

htnl5利用SVG页面高斯模糊的方法

浅谈网页中提升SVG文件可访问性的几种方法

SVG中的symbol如何制作icon

更多相关阅读请进入《SVG》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...