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


当前第2页 返回上一页

然后监听鼠标事件,得到x坐标,查询y坐标,动态地改变circle的圆心位置,如下代码所示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

let $dragButton = $volumnController.querySelector('.drag-button'),

    // 得到起始位置相对当前视窗的位置,相当于jQuery.fn.offset

    dragButtonPos = $dragButton.getBoundingClientRect();

function movePoint (event) {

    // 当前鼠标的位置减去圆心起始位置就得到移位偏差,12是半径值,这里先直接写死

    let diffX = event.clientX - Math.round(dragButtonPos.left + 12);

    // 需要做个边界判断

    diffX < 0 && (diffX = 0);

    diffX >= points.length && (diffX = points.length - 1);

    // startX是在上面的代码得到的长度为0的位置

    $dragButton.setAttribute('cx', diffX + startX);

    // 使用points数组得到y坐标

    $dragButton.setAttribute('cy', points[diffX]);

}

$dragButton.addEventListener('mousedown', function (event) {

    document.addEventListener('mousemove', movePoint);

});

document.addEventListener('mouseup', function () {

    document.removeEventListener('mousemove', movePoint);

});                    

这个实现的代码也是比较简单,需要注意的地方是起始位置的选取,这里有两个坐标系,一个是相对页面的视窗的,它的原点(0, 0)坐标点是当前页面可视区域(client)的左上角,第二个坐标系是SVG的坐标系,它的原点(0, 0)位置是SVG画布的左上角,如下图所示:

11-1.png

鼠标的位置是相对于视图client的,所以需要得到圆圈在client的位置,可以通过原生的getBoundingClient获取,然后用鼠标的clientX减掉圆圈的clientX就得到正确的位移偏差diff了,这个diff值加上圆??的在svg坐标的起始位置就能得到svg里的x坐标了,然后去查一下points数组就能得到y坐标,然后去设置circle的cx/cy值。

这个的实现已经算是十分简单的,大概30行代码。需要注意的是如果svg缩放了,那么坐标也要相应比例地改一下。所以最好是不要缩放,1:1显示就简单多了。

如果要显示具体的音量值呢?这个也好办,只需要在第一步保存点坐标的时候把在路径上的长度也保存下来就好了,最后效果如下:

svg-move-path-3.gif

如果路径比较复杂怎么办呢,一个x坐标可能会对应两个点,如下图所示:

12-1.png

这个也是有办法的,计算的方法类似,也是需要把路径上所有每隔1px的点坐标都取出来,然后计算一下鼠标的位置距离哪个点的坐标最接近,然后就取那个点就好了。当然在判断哪个点最优时,算法需要优化,不能直接一个for循环,具体可见这个codepen。

4. 路径的变形动画

路径结合关键帧可以做出一些有趣的效果,如这个codepen的示例:

svg-path-animate.gif

它的实现是hover的时候改变path的d值,然后做d的transition动画,如下代码:

1

2

3

4

5

6

7

8

9

10

11

<svg viewBox="0 0 10 10" class="svg-1">

  <path d="M2,2 L8,8" />

</svg>

<style>

.svg-1:hover path {

  d: path("M8,2 L2,8");

}

path {

    transition: d 0.5s linear;

}

</style>

这种变形过渡动画是有条件的,就是它的路径数据格式是要一致的,有多少个M/L/C属性都要保持一致,否则无法做变形动画。

5. 结合clip-path做遮罩效果

使用CSS通常只能用border-radius做一些圆角的遮罩,即用border-radius结合overflow: hidden实现,但是使用clip-path + svg的路径能够做出任意形状遮罩,如下做一个心形的:

13.jpg

如下代码所示:

1

2

3

4

5

6

7

8

<div style="width:200px;height:200px">

    <img src="photo.png" alt style="width:100%">

</div>

<style>

img {

    clip-path: url("#heart");

}

</style>

style里面的id: #heart是指向了一个SVG的的clipPath,如下所示:

1

2

3

4

5

<svg xmlns="http://www.w3.org/2000/svg" width="0" height="0">

    <clipPath id="heart" clipPathUnits="objectBoundingBox">

        <path transform="scale(0.0081967, 0.0101010)" d="m61.18795,24.08746c24.91828,-57.29309 122.5489,0 0,73.66254c-122.5489,-73.66254 -24.91828,-130.95562 0,-73.66254z"/>

    </clipPath>

</svg>                   

为了让这个path刚好能撑起div容器宽度的100%,需要设置:

1

clipPathUnits="objectBoundingBox"

这样会导致d属性里面的单位变成比例的0到1,所以需要把它缩小一下,原本的width是122,height是99,需要需要scale的值为(1 / 122, 1 / 99)。这样就达到100%占满的目的,如果一开始d属性坐标比例就是0到1,就不用这么搞了。

另外clip-path使用svg的path不支持变形动画。

本篇介绍了使用svg路径path做的几种效果:做一个路径动画、不规则形状的点击、沿着路径拖拽、路径的变形动画以及和clip-path做一些遮罩效果。可以说svg的path效果还是很强大的,当你有些效果用html/css无法实现的时候,不妨往svg的方向思考。

相关推荐:

如何使用Chrome控制台进行3D模型编辑的实现(代码)

在canvas上实现元素图片镜像翻转动画效果的方法

以上就是svg path路径的作用:svg path在网页开发中的使用方法的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

SVG是什么?SVG常用的方法(附代码)

html5实战-SVG的详解

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

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

SVG标签:<text >标签和<tspan>标签的应用(代码)

jpg图片转换成SVG文字路径动画的实例(附代码)

html5中的canvas 和 SVG分别是什么?它们的区别在何处?(实例)

如何在html5中使用SVG

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

在react中使用SVG的各种方法总结(附代码)

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




打赏

取消

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

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

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

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

评论

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