马黑黑 发表于 2026-6-8 20:50

svg接力绘图演示

<div class="hEdiv" data-prev="1"><pre class="hEpre">
&lt;style&gt;
    #msvg {
      display: block;
      margin: auto;
      path {
            stroke-dasharray: var(--perimeter);
            stroke-dashoffset: var(--perimeter);
            fill: none;
            stroke: green;
            stroke-width: 2;
            animation: draw 4s var(--delay) linear forwards;
      }
      circle {
            stroke-dasharray: var(--perimeter);
            stroke-dashoffset: var(--perimeter);
            fill: none;
            stroke: green;
            stroke-width: 2;
            animation: draw 4s var(--delay) linear forwards, fill 2s calc(var(--delay) + 4s) forwards;
      }
    }
    .tMid { text-align: center; }
    @keyframes draw { to { stroke-dashoffset: 0; } }
    @keyframes fill { to { fill: lightgreen; } }
&lt;/style&gt;

&lt;svg id="msvg" width="400" height="400" viewBox="-200 -200 400 400" xmlns="http://www.w3.org/2000/svg"&gt;
    &lt;path d="M-180 0 L0 -180 L180 0 L0 180Z"&gt;&lt;/path&gt;
    &lt;path d="M-88 -88 L88 -88 L88 88 L-88 88Z"&gt;&lt;/path&gt;
    &lt;circle x="0" y="0" r="86"&gt;&lt;/circle&gt;
&lt;/svg&gt;
&lt;p class="tMid"&gt;&lt;button type="button" onclick="reStartAnimation()"&gt;再来一次&lt;/button&gt;&lt;/p&gt;

&lt;script&gt;
    const paths = document.querySelectorAll('#msvg path');
    const circle = document.querySelector('#msvg circle');

    [...paths, circle].forEach((elm, key) =&gt; {
      elm.style.cssText += `
            --perimeter: ${Math.ceil(elm.getTotalLength())};
            --delay: ${key * 4}s;
      `;
    });
   
    function reStartAnimation() {
      [...paths, circle].forEach(elm =&gt; {
            elm.style.animation = 'none';
            setTimeout(() =&gt; {
                elm.style.animation = 'draw 4s var(--delay) linear forwards';
                if (elm.tagName === 'circle') {
                  elm.style.animation += ', fill 2s calc(var(--delay) + 4s) forwards';
                }
            });

      });
    }
&lt;/script&gt;
</pre></div>

<script type="module">
    import hl from 'https://638183.freep.cn/638183/web/js/hl.js';
    const divs = document.querySelectorAll('.hEdiv');
    const pres = document.querySelectorAll('.hEpre');
    divs.forEach((div,idx) => hl.hl(div, pres));
</script>

马黑黑 发表于 2026-6-8 20:54

本例通过对CSS动画的控制,依此绘制三个图形:两个矩形(path图形)、一个圆,圆还填充了颜色。

实现手段主要通过 CSS 完成,但为了避免手动计算图形路径长度,使用了JS做辅助获取相应的CSS变量值。

红影 发表于 2026-6-8 21:45

这接力画真好看{:4_187:}

杨帆 发表于 2026-6-8 21:54

马黑黑 发表于 2026-6-8 20:54
本例通过对CSS动画的控制,依此绘制三个图形:两个矩形(path图形)、一个圆,圆还填充了颜色。

实现手 ...

大开眼界,CSS动画让SVG图形的依此绘制过程可视化,谢谢马老师的绝妙演示{:4_190:}

马黑黑 发表于 2026-6-9 12:28

杨帆 发表于 2026-6-8 21:54
大开眼界,CSS动画让SVG图形的依此绘制过程可视化,谢谢马老师的绝妙演示

这个可能还是有点抽象,我会发一文再讲讲

马黑黑 发表于 2026-6-9 12:28

红影 发表于 2026-6-8 21:45
这接力画真好看

看着好玩吧{:4_170:}

杨帆 发表于 2026-6-9 16:38

马黑黑 发表于 2026-6-9 12:28
这个可能还是有点抽象,我会发一文再讲讲

化静为动,化繁为简,化隐为显,马老师您辛苦了{:4_180:}

马黑黑 发表于 2026-6-9 18:17

杨帆 发表于 2026-6-9 16:38
化静为动,化繁为简,化隐为显,马老师您辛苦了

有空玩玩,谈不上辛苦
页: [1]
查看完整版本: svg接力绘图演示