这次我们来介绍如何用SVG在公众号图文中实现各种卡牌翻转和翻页等特效,包括卡牌单面旋转,双面旋转,翻页效果的实现。

熟悉前端开发的同学都知道,我们可以借助CSS的伪3D API轻松的实现3D卡片的旋转和翻页效果,而对于SVG这种2D图形接口,又如何模拟类似的效果呢?

今天我来带大家剖析卡片旋转和翻页效果在SVG中的实现方法和原理,相信看过本文后,你也可以轻松的实现各种旋转和翻页效果。

翻页效果的实现原理

简单地说,我们可以通过设置对象x轴方向的缩放来模拟卡片的旋转效果。为此我们要通过animateTransform标签来设置对象的缩放(scale)值,生成旋转动画。

单面旋转动画

通过将scale值从1 1变为0 1,让图形在x轴方向被压扁,产生类似旋转的效果。

<animateTransform 
  attributeName="transform" 
  type="scale" 
  values="1 1;0 1" 
  dur="1s" 
  fill="freeze" 
  restart="never" 
  begin="click">
</animateTransform>

由于SVG的坐标原点默认是在左上角,元素的缩放也是以坐标原点进行的。因此我们需要改变缩放原点坐标,使卡片在中心点缩放。

通过改变原点坐标值,我们可以实现元素绕任意点旋转或缩放。

<!-- 将原点设置在卡片中心 -->
<g transform="translate(300 430)">
  <foreignObject x="-300" y="-430" width="600" height="861">
    <!-- 卡片SVG -->
    <svg viewBox="0 0 600 861"></svg> 
  </foreignObject>
</g>

双面旋转动画

和单面实现的原理类似,不同的是:我们需要将正反两张卡片放在一个分组中,通过旋转该分组来模拟双面翻转的效果。当旋转动画执行到一半时,需要隐藏正面的卡片,使用户有卡片被翻转的错觉。

<g transform="translate(300 430)">
  <g transform="translate(-300 -430)">
    <g>
      <!-- 卡片背面 -->
      <foreignObject x="0" y="0" width="600" height="861">
        <svg viewBox="0 0 600 861"></svg>
      </foreignObject>
    </g>
  
    <g>
      <!-- 卡片正面 -->
      <foreignObject x="0" y="0" width="600" height="861">
        <svg viewBox="0 0 600 861"></svg>
      </foreignObject>
      <!-- 旋转到一半时,隐藏正面卡片 -->
      <set 
        attributeName="visibility" 
        to="hidden" 
        begin="click+0.25s"
        >
      </set>
    </g>
  </g>
  <animateTransform 
    attributeName="transform" 
    type="scale" 
    additive="sum" 
    values="1 1;-1 1" 
   >
  </animateTransform>
</g>

翻页动画

01

明白了卡牌翻页的原理,翻页效果的实现就是小菜一碟了。这里我们在翻牌代码的基础上,结合斜切(skewY)属性来实现翻页特效。

<g transform="translate(0 430)">
  <!-- 翻页元素 -->
  <foreignObject x="0" y="-430" width="600" height="861">
    <svg viewBox="0 0 600 861">
    </svg>
  </foreignObject>
  <animateTransform type="scale"></animateTransform>
  <animateTransform 
    attributeName="transform" 
    type="skewY" 
    values="0;-5;-5" 
    keyTimes="0;0.5;1" 
    dur="1s" 
    fill="freeze" 
    restart="never" 
    begin="click" 
    calcMode="spline" 
    additive="sum" 
    keySplines="0.5 0 0.5 1;0 0 1 1">
  </animateTransform>
</g>

总结

通过三个案例我们已经掌握了卡片旋转和翻页效果的原理,只要设置好缩放的中心点,再结合scale和skewX,skewX等变换属性就能轻松的实现这些效果。

为了节约篇幅,上面例子中的代码都做了简化,大家可以点击“阅读原文”结合源文件来学习,做教程不易,请大家多点“在看分享”,你的支持是我的动力!