svgdr教程·实例化 use
<style>.art p { margin: 12px 0; font: normal 18px/24px sans-serif; }
.art mark { padding: 2px 6px; background: lightblue; }
.art svg { outline: 1px solid silver; }
.tRed { color: red; }
</style>
<div class="art">
<h2>实例化 use</h2>
<p>svg中的 <span class="tRed"><use></span> 标签用于实例化由 <span class="tRed"><g></span> 标签或 <span class="tRed"><symbol></span> 标签所设计的图案,类似于JS对HTML元素的深度克隆,即能将 <span class="tRed"><g></span> 标签和 <span class="tRed"><symbol></span> 标签里的含子内容在内的所有可视内容完备呈现。我们知道,g分组和symbol模板自身不在DOM中渲染,所以,<span class="tRed"><use></span> 标签是在实例化它们而后在自己设定的位置上呈现出来,可以实现单个或多个实例化。use标签还可以拥有自己的尺寸,但仅在实例化带有 viewBox 属性的 symbol 模板时有效。</p>
<p>指令:<mark>use()</p>
<p>参数:<mark>href, x, y, width, height</mark></p>
<p>语法:<mark>use(href, x, y, width, height)</mark></p>
<p>参数说明:</p>
<blockquote>
① herf - 必须,字符型,use标签绑定的g或symbol标签的id,按照规范,id需要前缀 #,例:<span class="tRed">#Id</span><br>
② x - 可选,use左上角X坐标值,数值或字符型百分比,缺省时默认为0<br>
③ y - 可选,use左上角Y坐标值,其余同上<br>
④ width - 可选,use宽度,数值或百分比,仅在实例化自带 viewBox 属性的 symbol 模板时有效<br>
⑤ height - 可选,use高度,其余同上
</blockquote>
<p>下面我们来绘制简易的小鸟头部:一个大一点的圆充当头部轮廓、一个小小的圆做眼睛,一个折线模拟喙即鸟嘴,它们都放入g标签,g标签又放入defs标签。然后用一个for循环,一口气实例化6个由g标签组织起来的图案。先看效果:</p>
<svg id="svg1" width="760" height="100"></svg>
<p>以下是 svgdr 绘制代码:</p>
<div id="div1"><pre id="pre1">
dr.defs('defs'); //创建defs标签
dr.g('g1').addTo('defs'); //创建g分组标签并加入defs标签中
dr.circle(20, 20, 20, 'lightblue', '#333', 2).addTo('g1'); //大圆 :头部轮廓
dr.circle(30, 15, 3, '#333').addTo('g1'); //小圆 :眼睛
dr.polyline('90 15, 40 20, 85 25','none', '#333', 2).addTo('g1'); //折线 :喙
//实例化6个g1分组
for(var i = 0; i < 6; i++) {
dr1.use('#g1', 20 + i * 120, 30);
};
</pre></div>
<p>再看看SVG代码:</p>
<div id="div2"><pre id="pre2"></pre></div>
<p>以上是实例化g分组的演示。接着看看use实例化symbol模板的实例:</p>
<svg id="svg2" width="760" height="200"></svg>
<p>svgdr 绘制代码:</p>
<div id="div3"><pre id="pre3">
dr.symbol('symb', '0 0 90 90');
dr.polyline('80 15,50 25, 80 25', 'none', 'black', 2).addTo('symb');
dr.circle(25, 25, 25, 'silver').addTo('symb');
dr.circle(40, 20, 3, 'black').addTo('symb');
dr.use('#symb', 20, 20, 100, 100);
dr.use('#symb', 150, 20, 200, 200);
dr.use('#symb', 400, 20, 300, 300);
</pre></div>
<p>svgdr绘制代码生成的SVG代码:</p>
<div id="div4"><pre id="pre4">
</pre></div>
<p>需要特别注意:① use标签的width和height属性要起作用需要一个前提,那就是 symbol 设置有 viewBox 属性;② href 属性原先写成 xlink:href,该写法已被 href 写法取代,虽然人们还习惯使用 xlink:href;③ use 标签 herf 属性的值指向被实例化的 symbol 标签,其值由 <span class="tRed">#id</span> 构成;④ symbol 标签可以不用作为 defs 标签的子标签存在,它可以自成一家,放在svg标签内的任何地方。⑤ 和 g 分组一样,一个svg里面可以有多个symbol标签。</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';
var dr1 = draw.dr('svg1');
dr1.defs('defs');
dr1.g('g1').addTo('defs');
dr1.circle(20, 20, 20, 'lightblue', '#333', 2).addTo('g1');
dr1.circle(30, 15, 3, '#333').addTo('g1');
dr1.polyline('90 15, 40 20, 85 25','none', '#333', 2).addTo('g1');
for(var i = 0; i < 6; i++) {
dr1.use('#g1', 20 + i * 120, 30);
};
pre2.textContent = dr1.code(svg1);
var dr2 = draw.dr('svg2')
dr2.symbol('symb', '0 0 90 90');
dr2.polyline('80 15,48 25, 80 25', 'none', 'black', 2).addTo('symb');
dr2.circle(25, 25, 25, 'silver').addTo('symb');
dr2.circle(40, 20, 3, 'black').addTo('symb');
dr2.use('#symb', 20, 20, 100, 100);
dr2.use('#symb', 150, 20, 200, 200);
dr2.use('#symb', 400, 20, 300, 300);
pre4.textContent = dr2.code(svg2);
hl.hl(div1, pre1);
hl.hl(div2, pre2);
hl.hl(div3, pre3);
hl.hl(div4, pre4);
</script>
<g> 标签或 <symbol> 标签画出图案,
再由<use>实例显示并摆到指定的位置{:4_199:}
两种方式都层次分明~~ symbol模板不仅更改了位置,还更改了大小。。
简单的三个图案相加绘制出一个很具体形象的小鸟。。
绘小图讲大道理
{:4_173:} 花飞飞 发表于 2024-11-22 19:55
symbol模板不仅更改了位置,还更改了大小。。
简单的三个图案相加绘制出一个很具体形象的小鸟。。
绘小图 ...
{:4_196:} 花飞飞 发表于 2024-11-22 19:52
标签或标签画出图案,
再由实例显示并摆到指定的位置
两种方式都层次分明~~
都不错的 g分组标签并加入defs标签,就可以用use去调用g标签的图案了,svgdr里还能用循环语句去调用呢。{:4_204:} symbol 标签的调用更好,它有自己的 viewBox,调用时,修改xy还是起到缩放效果。{:4_187:} 红影 发表于 2024-11-22 21:34
symbol 标签的调用更好,它有自己的 viewBox,调用时,修改xy还是起到缩放效果。
xy是位置,width、height才是宽高 红影 发表于 2024-11-22 21:30
g分组标签并加入defs标签,就可以用use去调用g标签的图案了,svgdr里还能用循环语句去调用呢。
svgdr只是以供绘制指令,JS要它在哪做事它就在哪儿做事
<use> 标签文绉绉的说法是实例化,我更喜欢用调用这个词汇,可以通过herf去调用 <g> 标签或 <symbol> 标签里绘好东西{:4_173:} 红影 发表于 2024-11-22 21:37
标签文绉绉的说法是实例化,我更喜欢用调用这个词汇,可以通过herf去调用标签或标签里绘好东西{:4_173 ...
它不是调用,本质上就是实例化。g和symbol是图纸,use是对图纸的应用(use就是使用的意思) 马黑黑 发表于 2024-11-22 21:36
xy是位置,width、height才是宽高
嗯,我说错了,虽然心里知道的,前面两个值是位置,后面的两个才是改变大小用的。 马黑黑 发表于 2024-11-22 21:37
svgdr只是以供绘制指令,JS要它在哪做事它就在哪儿做事
是的,完全服从指挥{:4_173:} 马黑黑 发表于 2024-11-22 21:39
它不是调用,本质上就是实例化。g和symbol是图纸,use是对图纸的应用(use就是使用的意思)
嗯,就是展现出来,调用这个词容易引起误解,我是想好记乱用它的{:4_173:} 听老师详细讲解“svgdr教程·实例化 use”代码。{:4_190:} 马黑黑 发表于 2024-11-22 20:29
都不错的
{:4_205:}相当不错,每天一课,天天有收获 马黑黑 发表于 2024-11-22 20:29
{:4_173:}一起乐一个总是可以滴 花飞飞 发表于 2024-11-23 18:41
一起乐一个总是可以滴
我看可以 花飞飞 发表于 2024-11-23 18:40
相当不错,每天一课,天天有收获
也不是每天一课,看忙不忙 马黑黑 发表于 2024-11-23 20:26
我看可以
{:4_190:}喝一个冬天的第一杯奶茶{:4_173:}
页:
[1]
2