svgdr教程·draw + addTo
<style>.art > p { margin: 12px 0; font: normal 18px/24px sans-serif; }
.art mark { padding: 2px 6px; background: lightblue; }
.art svg { outline: none; }
.tRed { color: red; }
</style>
<div class="art">
<h2>draw & addTo</h2>
<p><strong>一、万能绘制指令 draw</strong></p>
<p>指令:<mark>draw()</mark>
<p>参数:<mark>name, option</mark>
<p>语法:<mark>draw(name, option)</mark>
<p>参数解释:</p>
<blockquote>
① name - 必须,要绘制的图形名称,例如 circle、path<br>
② option - 必须,格式为一系列键值对的JS对象,例如 <mark>{ cx: 120, y: 120, r: 100, fill: 'gray' }</mark><br>
* 健名若有连接符 - ,需要用引号包裹,例如 stroke-width: 4 应写成 <mark>'stroke-width': 4</mark>,否则JS报错
</blockquote>
<p><strong>二、添加到指令 addTo</strong></p>
<p>指令:<mark>addTo()</mark></p>
<p>参数:<mark>id</mark></p>
<p>语法:<mark>addTo(id)</mark></p>
<p>参数解释:</p>
<blockquote>
id为添加到的目标元素id标识符,例如将当前绘制的对象添加到id="g1"的分组标签:<mark>addTo('g1')</mark>
</blockquote>
<p>以下效果使用 draw() 指令绘制而成,过程中使用 addTo() 指令给元素添加animate动画。动画可通过点击圆暂停/继续:</p>
<svg id="svg1" width="300" height="300"></svg>
<p>svgdr绘制指令(不包含JS部分):</p>
<div id="div1"><pre id="pre1">
dr.draw('circle', {cx: 150, cy: 150, r: 130, fill: 'peru', cursor: 'pointer'}); //画圆
//画矩形
dr.draw('rect', {
id: 'rt1',
x: 5,
y: 5,
width: 290,
height: 290,
fill: 'none',
stroke: 'peru',
'stroke-width': 5,
'stroke-dasharray': 5,
});
//绘制动画并将动画授予矩形
dr.draw('animate', {
attributeName: 'stroke-dashoffset',
values: `0;${rt1.getTotalLength()}`,
dur: '20s',
repeatCount: 'indefinite'
}).addTo('rt1');
</pre></div>
<p>生成的SVG代码(不包含JS部分):</p>
<div id="div2"><pre id="pre2"></pre></div>
<p>理论上 draw() 指令可以创建所有的svg标签,但它不是真的万能,比如目前它无法创建嵌套的标签,只是单纯地完成指定标签的创建。addTo() 指令不能绘制元素,但可以配合其他绘制或创建元素指令将当前的元素移动到指定id的元素,从而达成标签嵌套的目的,在这个意义上来说,作为功能性的 svgdr 指令,它也是十分强大的。</p>
<p><a href="/forum.php?mod=viewthread&tid=79137&extra=page%3D1" targete="_blank">返回目录</a></p>
<!--p><a href="/art/bshow.php?st=7&sd=7&art=mahei_1730435960" targete="_blank">返回目录</a></p-->
</div>
<script type="module">
import hl from 'https://638183.freep.cn/638183/web/mod/helight.js';
import draw from 'https://638183.freep.cn/638183/web/mod/svgdr.js?v=0.53';
var dr1 = draw.dr('svg1');
dr1.draw('circle', {id: 'c1', cx: 150, cy: 150, r: 130, fill: 'peru', cursor: 'pointer'});
dr1.draw('rect', {
id: 'rt1',
x: 5,
y: 5,
width: 290,
height: 290,
fill: 'none',
stroke: 'peru',
'stroke-width': 5,
'stroke-dasharray': 5,
});
dr1.draw('animate', {
attributeName: 'stroke-dashoffset',
values: `0;${rt1.getTotalLength()}`,
dur: '20s',
repeatCount: 'indefinite'
}).addTo('rt1');
pre2.textContent = dr1.code(svg1);
dr1.js(`
var isRunning = true;
c1.onclick = () => {
isRunning ? svg1.pauseAnimations() : svg1.unpauseAnimations();
isRunning = !isRunning;
}
`);
hl.hl(div1, pre1);
hl.hl(div2, pre2);
</script>
谢谢老师辛苦,学习了!{:4_199:} 这个效果不是一般的漂亮。。而且也好懂
无论是技术还是颜值还有亲和度都顶级{:4_173:} 动态虚线边框之前在《茉》贴子里面出现过。
只有一点差别《茉》里的移动设为from="0" to="-48"这里用的是values="0;1160"。。转动方向不相同
两个都无限循环。 原来 draw叫做万能绘制指令,十分强大。。 泡沫 发表于 2024-11-14 12:37
原来 draw叫做万能绘制指令,十分强大。。
还好 这个可以赋予动画给图形,厉害了{:4_199:} 马黑黑 发表于 2024-11-15 11:52
还好
看到它就想到无限可能,很贴切的。{:4_173:} 泡沫 发表于 2024-11-15 15:50
看到它就想到无限可能,很贴切的。
嗯呐 马黑黑 发表于 2024-11-15 19:35
嗯呐
跟addTo() 指令双剑合壁,就更厉害了。{:4_173:}几乎无所不能 泡沫 发表于 2024-11-16 12:11
跟addTo() 指令双剑合壁,就更厉害了。几乎无所不能
那倒没有,强一点而已 马黑黑 发表于 2024-11-16 12:43
那倒没有,强一点而已
那就是本身就够强了 泡沫 发表于 2024-11-16 20:44
那就是本身就够强了
强一点点 马黑黑 发表于 2024-11-16 20:45
强一点点
那也是强。。合起来反正能干的事情更多,图案更完美,贴子更漂亮{:4_173:} 泡沫 发表于 2024-11-16 20:52
那也是强。。合起来反正能干的事情更多,图案更完美,贴子更漂亮
还行 马黑黑 发表于 2024-11-16 20:59
还行
{:4_180:}说行就行不行也得行。 泡沫 发表于 2024-11-16 21:31
说行就行不行也得行。
也好 马黑黑 发表于 2024-11-16 21:33
也好
又一个好,小本本记下来 泡沫 发表于 2024-11-16 21:34
又一个好,小本本记下来
应该的 马黑黑 发表于 2024-11-16 21:35
应该的
集够七个,召唤神龙{:5_117:}
页:
[1]
2