马黑黑 发表于 2024-9-13 20:05

svg动画:自己触发自己

本帖最后由 马黑黑 于 2024-9-13 20:10 编辑 <br /><br /><style>
.artbox { position: relative; }
.artbox > p { position: relative; margin: 10px 0; font: normal 18px / 26px sans-serif; }
.artbox mark { color: black; background: lightblue; padding: 2px 4px; }
.textRed { color: red; }
.textMid { text-align: center; }
.showDiv { position: relative; display: grid; place-items: center; }
.artbox mark { background: lightblue; padding: 0 6px; }
#codebox { display: none; }
#text { width: 98%; height: 360px; padding: 8px; font-size: 16px; border: 3px solid lightblue; border-radius: 6px; resize: none; tab-size: 4; }
</style>

<div class="artbox">
        <p>以下代码在svg里绘制一个圆,<mark>&lt;circle&gt;</mark>标签里包含一个<span class="textRed">animate</span>动画,该动画会令其父元素按动画标签所描述的方式运动。下面是代码和效果演示:</p>

<div class="hE"><pre id="code">
&lt;svg width="600" height="150" style="border:1px solid gray;fill:steelblue;stroke: none"&gt;
        &lt;circle cx="50" cy="75" r="30"&gt;
                &lt;animate
                        attributename="cx"
                        values="50;550;50"
                        dur="6s"
                        begin="0s;m1.end"
                        id="m1"
                /&gt;
        &lt;/circle&gt;
&lt;/svg&gt;
</pre></div>

        <p><button id="btn1" type="button" value="1">点击查看效果</button></p>
        <div id="sbox1" class="showDiv"></div>
        <p>动画代码解释:3~9行代码我们分行写以便可以更好地观察理解。下面是动画代码说明——</p>
        <p>第4行:指定 animate 动画要改变的 circle 标签属性 cx,即圆心水平方向位置;<br>第5行:values 属性可以替代 from 和 to/by 属性,值至少包含两组用于描述运动的数值,各组数值间用分号隔开。这里,令圆心 cx 坐标从50(像素)出发,移动到550,再移动到原点50;<br>第6行:一个运动周期的时长,6秒;<br>第7行:begin 属性用来触发动画,支持多值,值间用分号隔开。0s 表示0秒开始运行动画,即页面一打开就运行,m1.end 表示,id="m1" 的动画结束(end)时触发;<br>第8行:给 animate 动画标签赋予 id 标识。这里请特别留意第7行代码的动画触发条件之一:自身运行结束。</p>
        <p>本例没有设置<mark>repeatCount="indefinite"</mark>却能永动运行动画,关键点在代码7、8行。</p>
       
</div>

<script>
var sc = document.createElement('script');
sc.chartset = 'utf-8';
sc.src = 'https://638183.freep.cn/638183/web/js2024/helight.js';
document.body.appendChild(sc);

var runCodes = (str,ele) => {
        let reg = /(<script(.*?)>)(.|\n)*?(<\/script>)/g;
        let js_str, html_str;
        if(str.match(reg) !== null) {
                js_str = str.match(reg);
                html_str = str.replace(js_str, '').trim();
                js_str = js_str.replace(/<[\/]{0,1}script[^>]*>/g,'').trim();
        } else {
                js_str = '';
                html_str = str.trim();
        }
        ele.innerHTML = html_str;
        let myfunc = new Function(js_str);
        myfunc();
};

btn1.onclick = () => {
        runCodes(code.innerText, sbox1);
        btn1.disabled = true;
}
</script>

花飞飞 发表于 2024-9-13 20:24

设置了6秒结束时就是开始时,所以就永动了

花飞飞 发表于 2024-9-13 20:25

代码在白老师手里就是出神入化,总有无限多的创意

花飞飞 发表于 2024-9-13 20:25

SVG知 识点多多。。{:4_173:}

红影 发表于 2024-9-13 20:50

它的出发条件是m1.end,而它自身又是m1 ,所以变成永动了?

红影 发表于 2024-9-13 20:50

这个其实并不是很好理解,但它就那么实实在在地实现了{:4_173:}

红影 发表于 2024-9-13 20:54

style="border:1px solid gray;fill:steelblue;stroke: none"
这个也挺奇怪,边框是给svg的,颜色是给里面的圆的。

马黑黑 发表于 2024-9-13 21:29

红影 发表于 2024-9-13 20:54
style="border:1px solid gray;fill:steelblue;stroke: none"
这个也挺奇怪,边框是给svg的,颜色是给里面 ...

svg很多属性可以用在CSS里面,stroke,fill等,这点比canvas画布强。

马黑黑 发表于 2024-9-13 21:29

花飞飞 发表于 2024-9-13 20:24
设置了6秒结束时就是开始时,所以就永动了

严格讲不是6秒,是自己的动画结束再触发,你设计3秒0.5秒都一样

马黑黑 发表于 2024-9-13 21:30

红影 发表于 2024-9-13 20:50
这个其实并不是很好理解,但它就那么实实在在地实现了

应该是好理解的:自己动画结束了再次触发动画

马黑黑 发表于 2024-9-13 21:30

花飞飞 发表于 2024-9-13 20:25
代码在白老师手里就是出神入化,总有无限多的创意

果酱了

马黑黑 发表于 2024-9-13 21:40

花飞飞 发表于 2024-9-13 20:25
SVG知 识点多多。。

svg琐碎,但它的知识体系是简洁的

小辣椒 发表于 2024-9-13 22:00

不懂~~~就先看看代码

马黑黑 发表于 2024-9-13 22:51

小辣椒 发表于 2024-9-13 22:00
不懂~~~就先看看代码

svg有自己的一整套标签和标签属性

红影 发表于 2024-9-13 22:59

马黑黑 发表于 2024-9-13 21:29
svg很多属性可以用在CSS里面,stroke,fill等,这点比canvas画布强。

哦,这个倒是方便了呢。

红影 发表于 2024-9-13 23:00

马黑黑 发表于 2024-9-13 21:30
应该是好理解的:自己动画结束了再次触发动画

跟小猫抓自己尾巴似的呗{:4_173:}

樵歌 发表于 2024-9-14 07:10

加分分。肯定成果!

马黑黑 发表于 2024-9-14 10:52

樵歌 发表于 2024-9-14 07:10
加分分。肯定成果!

{:4_190:}

马黑黑 发表于 2024-9-14 10:52

红影 发表于 2024-9-13 23:00
跟小猫抓自己尾巴似的呗

嗯,很像

小辣椒 发表于 2024-9-14 14:27

马黑黑 发表于 2024-9-13 22:51
svg有自己的一整套标签和标签属性

还有一整套,那我都不懂的了
页: [1] 2
查看完整版本: svg动画:自己触发自己