搜索
热搜: 活动 交友 discuz
查看: 6|回复: 1

马黑黑老师 SVG:使用symbol封装现成路径

[复制链接]
  • TA的每日心情
    开心
    昨天 18:14
  • 签到天数: 403 天

    连续签到: 5 天

    [LV.9]以坛为家II

    451

    主题

    1216

    回帖

    1万

    积分

    社区管理员

    积分
    12918

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理

    发表于 昨天 23:11 | 显示全部楼层 |阅读模式

    很多时候现成的路径并不能完美适配当前的工作场景,这种情形我们需要对路径做一些必要的处理。更改路径 d 属性数据无异于重新设计路径,对之进行简单封装更经济划算。symbol 可以拥有自己的 viewBox,非常合适用于此类需求的路径封装。

    假设我们有如下包含 path 路径的 svg 代码:

    <svg id="msvg" width="24" height="24">
        <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" fill="darkred"></path>
    </svg>
    

    从中我们得知 path 路径建立于宽高为 24*24 的画布。现在,我们想将路径应用于其它尺寸的工作场景,例如 400*400 外加 viewBox 设置为 -200 -200 400 400 的 SVG 画布。以下是实现代码:

    <svg width="400" height="400" viewBox="-200 -200 400 400">
        <symbol id="sb1" viewBox="0 0 24 24">
            <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" fill="pink"></path>
        </symbol>
        <use href="#sb1" x="-200" y="-200" width="400" height="400"></use>
    </svg>
    

    上述实现代码的核心在于:在新的工作场景,先将路径原始的绘制范围设置为 symbol 的 viewBox 属性值,然后将原始路径置入 symbol 中,最后使用 use 实例化 symbol 图案。各主要步骤描述如下:

    其一:原始画布工作区域转 symbol viewBox 属性

    通常,路径设计的时候都基于某一个尺寸以及视口进行,自己设计的心中有数,别人设计的需要分析一下。如果 path 路径没有额外封装,那么,凡带有 svg 标签的 path 路径,先检查 svg 标签有没有 viewBox 属性,若有,viewBox 属性就是路径的绘制视口,若没有,路径的绘制区域就是 svg 的宽高;如果 path 路径额外封装于其它标签,则观察路径直接父元素是什么,是 symbol 就将整个 symbol+path 一同移植,是别的就遵循 svg 的绘制视口或宽高尺寸去构造新场景 symbol 的 viewBox 属性。

    有时候仅拿到了 path 路径的 d 属性值,这时候就需要更强大的分析能力,依据路径数据分析其绘制范围,并通过简单尝试校准路径的原始绘制视口。

    其二:使用 use 标签实例化 symbol 图案

    symbol 内部包裹的路径不会自动渲染,需要使用 use 标签将其实例化后才能将图案呈现于 svg 画布中。use 标签通过 href 属性指明实例化哪一个 symbol,同时拥有一些常用属性。下面列举几个经常用到的 use 标签的属性:

    href : 实例化对象 【例】href="#sb1"
    x : 图案渲染的 x 坐标 【例】x ="-200"
    y :图案渲染的 y 坐标 【例】y="-200"
    width : 图案的宽度 【例】width="400"
    height :图案的高度 【例】height="400"

    其中的 width 和 height 需要一个前提,即 href 所引用的对象具有 viewBox 属性设置,否则 use 的宽高设置无效(此时 use 渲染的实例效果为 symbol 或其他对象的实际内部尺寸)。

    最后看一下前边路径例子的渲染效果:

    (一)原始心形图案:

    (二)封装后的心形图案:

  • TA的每日心情
    奋斗
    7 小时前
  • 签到天数: 485 天

    连续签到: 50 天

    [LV.9]以坛为家II

    184

    主题

    790

    回帖

    1万

    积分

    社区贵宾

    积分
    12412

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献

    发表于 7 小时前 | 显示全部楼层
    很实用,谢谢醉美管理员精彩分享
    该会员没有填写今日想说内容.
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|小黑屋|纳兰音画网 ( 蜀ICP备2021011087号 )

    GMT+8, 2026-5-9 19:35 , Processed in 0.079565 second(s), 23 queries .

    Powered by Discuz! X3.5

    © 2001-2020 Comsenz Inc.

    快速回复 返回顶部 返回列表