SVG与微信公众号的化学反应

2,296 阅读3分钟

楔子

某天一个朋友问我: “知道这个效果是怎么实现的么?”

说完甩给我一个预览链接

--> mp.weixin.qq.com/s/JaBjmGeuv… <--

看完惊奇了 微信公众号文章可以实现这种交互效果的吗?

好奇的我查看了一下源代码

image.png

通篇充斥着大量自带样式的svg标签 这是啥?

原理

本着不懂就搜的好习惯 借助搜索引擎大致明白了实现原理

基于微信公众号富文本编辑器的漏洞 把编辑好的svg内容插入到编辑器中

image.png

当然,代码的插入只是效果实现的基础。 剩下的交互效果就需要咱们自己来实现了

这里需要具备svg 及 svg动画 的知识储备; 附上svg api文档 有需要的同学可以自行学习

--> developer.mozilla.org/zh-CN/docs/… <--

实现

由于篇幅有限 这里我就上边的示例 粗略的聊聊它的代码实现 我们先进一段代码

    <svg 
        preserveAspectRatio="xMidYMin meet"
        width="500"
        height="400"
        viewBox="0 0 343 486" 
        xmlns="http://www.w3.org/2000/svg"
        style="..."
    >
        <animate 
            attributeName="height" 
            begin="click+7s" 
            calcMode="spline"
            keySplines="0.42 0 0.58 1; 0.42 0 0.58 1" 
            dur="4s" 
            keyTimes="0;0.1;1" 
            fill="freeze"
            values="486;1300;2946;"
        >
        </animate>
    </svg>

我们先看下svg 标签

  • width height 设置svg在网页上的显示宽高
  • viewBox 设置的是可视区域大小 可理解为画布大小 值为 x y width height;
  • preserveAspectRatio 设置svg viewBox 与 视图的缩放关系
    • xMidYMin 设置svg与视图 x y 的缩放方式 值有三个 Min Mid Max 对应 最小 中点 最大 对齐;
    • meet 设置svg的缩放方式 值有 meet 和 slice 具体效果可参看 demo
  • style 设置svg的样式 背景图片啥的

接下来是核心标签 animate

示例中所有的交互动画都是通过此元素来实现的

  • attributeName 设置动画的属性
  • begin 设置动画 开始指令和 时间 click+7s 即点击事件完成后延迟7秒 开始动画
  • dur 设置动画持续时间
  • values 设置动画关键帧的变化值
  • calcMode 设置动画的过度曲线
    • discrete 关键帧之间没有过度
    • linear 线性过度
    • spline 插值根据由三次Bézier样条曲线定义的时间函数从values列表中的一个值插入到下一个值。样条曲线的点在keyTimes属性中定义,每个区间的控制点在keySplines属性中定义。
    • paced 插值可在整个动画中产生均匀的变化速度
  • fill 设置动画结束后状态 freeze 结束后保持冻结状态 remove 动画结束就移除

借由上面两个标签 便可实现改变背景图片、宽高;实现变形、位移等交互行为,再组合gif图片、微信音频文件就可以完成一些比较有意思的业务场景了

示例中的交互实现方式

整个页面分位两大部分

第一部分是进入页面的首屏 第二部分为页面撑开后的主体内容部分

包裹他们的父级设置overflow:hidden 第一部分设置float:left 这样就成功把第二部分先隐藏掉了

点击第一部分svg 在7秒钟内轮播了 倒计时 睁眼效果 然后宽度变为0 高度变为第二部分的高度 撑开父级容器 第二部分内容成功显示 实现了两部分内容的切换效果

之后就是第二部分的 点击切换图片效果

局限

  • 一个svg只能设置一个交互行为 在复杂交互上显得乏力
  • 在代码编排上需要花较多心思 代码层级会比较冗杂繁琐
  • 调试不易 本地开发和实际终端效果可能会有出入 需要频繁预览调试
  • 只能通过animate 来设置交互 不允许js的插入

总结

总的来说 微信公众号加入svg效果真的挺好的 正所谓静不如动嘛 让用户有参与感 呈现出的效果有趣又好玩 这对于营销推广类内容来说 是非常加分的; 加入一点灵感的小火花 就能让你的公众号文章脱颖而出 大放异彩哟~~