svgdr教程·内部CSS
本帖最后由 马黑黑 于 2024-11-24 13:14 编辑 <br /><br /><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>内部CSS</h2>
<p>SVG内部可以拥有css代码,原理和HTML一致:css理论上可以放置在body标签内的任何地方,而不仅仅局限于<header>标签之内。一般来说,放在SVG内部的css主要作用于svg元素和子元素,不过它一样可以冒泡,这意味着svg内部的css同样可以作用于其外部的HTML元素。</p>
<p>指令:<mark>css()</mark></p>
<p>参数:<mark>csscode</mark></p>
<p>语法:<mark>css(csscode)</mark></p>
<p>参数说明:</p>
<blockquote>
① csscode - 字符型,css代码,不包含<style></style>标签,svgdr会自动添上<br><br>
* 若需要分行书写css代码,请使用反引号<mark>``</mark>将代码包裹起来
</blockquote>
<p>下例的演示:在svg内部建立CSS代码,用以驱动一系列小圆运行CSS关键帧动画。先看效果——</p>
<svg id="msvg" width="800" height="400"></svg>
<p>再看 svgdr 绘制代码:</p>
<div id="div1"><pre id="pre1">
var all = 20;
Array.from({length: all}).forEach((c,k) => {
var cx = k * 40 + 10,
cy = 420,
r = Math.random() * 2 + 8,
color = '#' + Math.random().toString(16).substring(2,8),
delay = Math.random() * -8 +'s',
dur = Math.random() * 4 + 4 + 's';
dr.circle(cx,cy,r,color).style(`--delay: ${delay}; --dur: ${dur};`);
});
dr.css(`
circle { transform-box: fill-box; transform-origin: center; animation: up var(--dur) var(--delay) linear infinite, flash .75s var(--delay) infinite alternate; }
@keyframes up { to { cy: -20; } }
@keyframes flash { to { opacity: 0; } }
`);
</pre></div>
<p>代码中,我们绘制了20个小圆,为了配套后续设计的动画,每一个小圆都加入行内style属性,用来为每一个小圆设置两个CSS变量。而后,使用 css() 指令创建svg内部 style 标签,里面是一些css代码,它设置了 circle 标签的一些CSS属性,还有两个关键动画选择器。这里需要留意一下,行内 style 属性和 svg 内部 style 标签是有区别的,行内 style 属性首先是作为一个标签的属性而存在,其次仅作用于该标签,而 svg 内部 style 标签则是独立的标签,它所创建的CSS样式理论上可以作用于DOM的所有节点,例如,下面这个 div 标签,它不隶属于 svg 的子元素,一样可以运行svg内部所设计的 flash 关键帧动画:</p>
<div style="width: 20px; height: 20px; background: green; animation: flash .5s linear infinite;"></div>
<p>上述svgdr绘制代码生成的SVG代码:</p>
<div id="div2"><pre id="pre2"></pre></div>
<p>将svg的内部CSS移到svg的外部,本讲小圆的动画效果并无二致,不过,若将SVG代码存为 .svg,则不能这么干。</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 dr = draw.dr('msvg');
var all = 20;
Array.from({length: all}).forEach((c,k) => {
var cx = k * 40 + 10,
cy = 420,
r = Math.random() * 2 + 8,
color = '#' + Math.random().toString(16).substring(2,8),
delay = Math.random() * -8 +'s',
dur = Math.random() * 4 + 4 + 's';
dr.circle(cx,cy,r,color).style(`--delay: ${delay}; --dur: ${dur};`);
});
dr.css(`
circle { transform-box: fill-box; transform-origin: center; animation: up var(--dur) var(--delay) linear infinite, flash .75s var(--delay) infinite alternate; }
@keyframes up { to { cy: -20; } }
@keyframes flash { to { opacity: 0; } }
`);
pre2.textContent = dr.code(msvg);
hl.hl(div1, pre1);
hl.hl(div2, pre2);
</script>
听老师讲“svgdr教程·内部CSS”,辛苦了!{:4_190:} 20个小圆的平面位置均匀分布,半径和颜色是随机的,cy从420上升到-20,时间间隔和滞后也是随机的,还有明暗变化,让小球那么错落有致地运行,好看{:4_199:} 这个例子的前半部分就属于行内 style 吧,svgdr的内部css也很简洁方便呢{:4_187:} 红影 发表于 2024-11-24 15:40
这个例子的前半部分就属于行内 style 吧,svgdr的内部css也很简洁方便呢
还好吧,本讲例子的另外的目的之一就是想也区别一下 style 属性和 style 标签 红影 发表于 2024-11-24 15:35
20个小圆的平面位置均匀分布,半径和颜色是随机的,cy从420上升到-20,时间间隔和滞后也是随机的,还有明暗 ...
之前用过的,还是双向运行的 继HTML之后,这样的css动画也可以在SVG里嵌入,这包容性简直绝了,无所不能的。。 这串JS代码比较不那么陌生,之前粒子贴子里有出现过的。。
行内 style 属性和 svg 内部 style 标签是有区别的
刚试了一下,把这一对< style >移到SVG外部,动画也同样完美运行。。
闪动的小正方形虽然在外面,
< div style="width: 100px; height: 100px; background: green; animation: flash .5s linear infinite;">< /div>
同样继承了 flash动画效果。。
这么试了两次算是明白 “style 标签则是独立的标签,可以作用所有的节点”这句话的意思了。。{:4_173:} 花飞飞 发表于 2024-11-24 17:47
继HTML之后,这样的css动画也可以在SVG里嵌入,这包容性简直绝了,无所不能的。。
嵌套到HTML里来的SVG代码,CSS放在哪里都可以,存为 .svg 文档时,放在svg里面才行。
另外,.svg 对CSS、JS交互是不认可的,例如CSS的 :hover 属性,JS设计的种种东东,等等。这些要起作用,必须是嵌入式的SVG代码而不是独立 .svg 文档。 花飞飞 发表于 2024-11-24 18:07
这串JS代码比较不那么陌生,之前粒子贴子里有出现过的。。
行内 style 属性和 svg 内部 style 标签是有 ...
这个理解起来不是太难吧 马黑黑 发表于 2024-11-24 18:08
嵌套到HTML里来的SVG代码,CSS放在哪里都可以,存为 .svg 文档时,放在svg里面才行。
另外,.svg 对CS ...
可以理解为:要存为SVG动画时,这些动画必须在内部,跟着一起包走,动画才能显现。。这点不能把人家整不见了。。
马黑黑 发表于 2024-11-24 18:10
这个理解起来不是太难吧
小白开始的时候难的。。现在回头看看不难了{:4_173:} 花飞飞 发表于 2024-11-24 18:26
小白开始的时候难的。。现在回头看看不难了
是的,有个过程 花飞飞 发表于 2024-11-24 18:12
可以理解为:要存为SVG动画时,这些动画必须在内部,跟着一起包走,动画才能显现。。这点不能把人家整不见 ...
理解正确 马黑黑 发表于 2024-11-24 17:46
还好吧,本讲例子的另外的目的之一就是想也区别一下 style 属性和 style 标签
嗯嗯,两者还是有区别的,看到黑黑在帖子里特地强调了{:4_187:} 马黑黑 发表于 2024-11-24 17:47
之前用过的,还是双向运行的
是的,之前黑黑做过很多小球的呢{:4_173:} 红影 发表于 2024-11-24 20:05
是的,之前黑黑做过很多小球的呢
特喜欢玩球{:4_189:} 红影 发表于 2024-11-24 20:04
嗯嗯,两者还是有区别的,看到黑黑在帖子里特地强调了
{:4_199:} 小辣椒就看看{:4_173:} 马黑黑 发表于 2024-11-24 21:01
特喜欢玩球
小球也是特别美的图形呢{:4_187:}
页:
[1]
2