js动态修改path值 svg_SVG基本形状path路径置换

前言

前段时间研究 SVG 压缩优化,发现SVG预定义的 rect、circle、ellipse、line、polyline、polygon 六种基本形状可通过path路径转换实现,这样可以在一定程度上减少代码量。不仅如此,我们常用的 SVG Path 动画(路径动画),是以操作path中两个属性值stroke-dasharray和stroke-dashoffset来实现,基本形状转换为path路径,有利于实现路径动画。

SVG基本形状

SVG 提供了rect、circle、ellipse、line、polyline、polygon六种基本形状用于图形绘制,这些形状可以直接用来绘制一些基本的形状,如矩形、椭圆等,而复杂图形的绘制则需要使用 path 路径来实现。

84b63757b8adf87e0da27dbd8b3b4560.png

rect 矩形

SVG中rect元素用于绘制矩形、圆角矩形,含有6个基本属性用于控制矩形的形状以及坐标,具体如下:

x:矩形左上角x位置, 默认值为 0

y:矩形左上角y位置, 默认值为 0

width:矩形的宽度, 不能为负值否则报错, 0 值不绘制

height:矩形的高度, 不能为负值否则报错, 0 值不绘制

rx:圆角x方向半径, 不能为负值否则报错

ry:圆角y方向半径, 不能为负值否则报错

这里需要注意,rx 和 ry 的还有如下规则:

rx 和 ry 都没有设置, 则 rx = 0 ry = 0

rx 和 ry 有一个值为0, 则相当于 rx = 0 ry = 0,圆角无效

rx 和 ry 有一个被设置, 则全部取这个被设置的值

rx 的最大值为 width 的一半, ry 的最大值为 height 的一半

比如:

rx = rx || ry || 0;

ry = ry || rx || 0;

rx = rx > width / 2 ? width / 2 : rx;

ry = ry > height / 2 ? height / 2 : ry;

if(0 === rx || 0 === ry){

rx = 0,

ry = 0; //圆角不生效,等同于,rx,ry都为0

}

circle 圆形

SVG中circle元素用于绘制圆形,含有3个基本属性用于控制圆形

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态修改 SVG 文件中的 path ,需要使用 webpack 和 svg-sprite-loader 插件。以下是完整的配置: 1. 安装 svg-sprite-loader 插件 ```bash npm install svg-sprite-loader --save-dev ``` 2. 在 vue.config.js 中添加配置 ```javascript const path = require('path') function resolve(dir) { return path.join(__dirname, '.', dir) } module.exports = { chainWebpack: config => { const svgRule = config.module.rule('svg') svgRule.uses.clear() svgRule .use('svg-sprite-loader') .loader('svg-sprite-loader') .options({ symbolId: 'icon-[name]', extract: true, spriteFilename: 'img/icons.svg', runtimeCompat: true, publicPath: process.env.NODE_ENV === 'production' ? '/your/public/path/' : '/', symbolDest: 'img/icons/[name].svg', pluginHooks: { // 用于动态修改 path beforeSanitizeElements: [function (sprite) { sprite.querySelectorAll('path').forEach((path) => { path.setAttribute('d', 'M0 0H10V10H0z') }) }] } }) const fileRule = config.module.rule('file') fileRule.uses.clear() fileRule .use('file-loader') .loader('file-loader') .options({ name: 'img/[name].[hash:8].[ext]' }) }, configureWebpack: { resolve: { alias: { '@': resolve('src') } } } } ``` 这里解释一下每个配置项的含义: - `symbolId`:设置 SVG sprite 的 symbol id 的名字,这里使用 `icon-[name]` 的方式命名 - `extract`:是否将构建后的 sprite 文件提取出来,默认为 true - `spriteFilename`:提取出来的 sprite 文件名称,默认为 `img/icons.svg` - `runtimeCompat`:兼容各种运行时,可以让你在 Vue 中使用 SVG sprite,如果使用了 Vue CLI 4.x,建议开启 - `publicPath`:构建后的 publicPath,建议使用绝对路径 - `symbolDest`:构建后的 sprite 文件存储路径,这里设置为 `img/icons/[name].svg` - `pluginHooks.beforeSanitizeElements`:使用插件钩子,在 sanitizeElements 之前修改 path 3. 在组件中使用 SVG sprite ```vue <template> <div> <svg aria-hidden="true" class="icon"> <use xlink:href="#icon-xxx"></use> </svg> </div> </template> <script> export default { name: 'ComponentName' } </script> <style scoped> .icon { width: 20px; height: 20px; fill: currentColor; } </style> ``` 其中,`xlink:href` 中的 `#icon-xxx` 对应到 SVG sprite 中的 symbol id,`fill: currentColor` 可以自动填充颜色。 注意:如果要修改 SVG sprite 中的 path ,需要在插件钩子中进行修改,具体的修改方式可以根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值