马黑黑 发表于 2025-8-24 11:20

让svg粒子自适应帖子容器尺寸

<p>核心是给 svg 标签设置宽高比与帖子容器宽高比一致的 viewbox 属性值,viewbox 属性中的起始坐标值取 viewbox 中宽高值一半的负值(便于后续计算),然后在 viewbox 设置的作画范围内绘制图像。应用实例是帖子《不朽》,不过由于该帖svg粒子处于运动中,做的时候没有严格按照本文的实现思路去做,有点随意,下面的粒子则能随机分布于帖子容器的范围内,保持粒子不会跨界。</p>
<div class="codebox" data-prev="1">
&lt;style&gt;
        <txt-green>/* 帖子容器宽高比例 16/9*/</txt-green>
        #papa {
                margin: 20px auto;
                width: 1280px;
                height: 720px;
                border: 1px solid gray;
                position: relative;
        }
        #msvg {
                position: absolute;
        }
&lt;/style&gt;

&lt;div id="papa"&gt;
        <txt-green>&lt;!-- svg宽高设为容器宽高 --&gt;</txt-green>
        &lt;svg id="msvg" width="100%" height="100%" viewbox="-320 -180 640 360"&gt;&lt;/svg&gt;
&lt;/div&gt;

&lt;script type="module"&gt;
        import Dr from 'https://638183.freep.cn/638183/web/mod/svgdr.js';
        var dr = Dr.dr(msvg);
        <txt-green>// 绘制50个小球 : 圆心坐标、半径、颜色随机</txt-green>
        Array.from({length: 50}).forEach(() =&gt; {
                <txt-green>// 圆心X坐标 : 320 - 最大半径10,圆心Y坐标 : 180 - 最大半径10</txt-green>
                var cx = Math.round(Math.random() * 310 * (Math.random() &gt; 0.5 ? 1 : -1)),
                        cy = Math.round(Math.random() * 170 * (Math.random() &gt; 0.5 ? 1 : -1)),
                        r = Math.round(Math.random() * 5) + 5, // 最大半径9.999999
                        color = '#' + Math.random().toString(16).substring(2, 8);
                dr.circle(cx,cy,r,color); <txt-green>// 画圆</txt-green>
        });
&lt;/script&gt;
</div>

<script type="module">
import linenumber from 'https://638183.freep.cn/638183/web/js/linenumber.js';
linenumber();
</script>

马黑黑 发表于 2025-8-24 11:24

粒子半径 r 的设置:

      r = Math.round(Math.random() * 5) + 5, // 最大半径9.999999

最大值接近10,但由于帖子的尺寸高出几倍,粒子的半径也跟着变大。所以,根据需要可以设置算式,比如你希望最大半径接近5,最小半径不低于2,则:

      r = Math.round(Math.random() * 3) + 2, // 最大半径4.999999

红影 发表于 2025-8-24 12:59

哦,这样就能让粒子随机分布在帖子的任意地方了{:4_187:}

马黑黑 发表于 2025-8-24 13:09

红影 发表于 2025-8-24 12:59
哦,这样就能让粒子随机分布在帖子的任意地方了

对,随机

红影 发表于 2025-8-24 13:51

马黑黑 发表于 2025-8-24 13:09
对,随机

嗯嗯,随机的也是好看的。

马黑黑 发表于 2025-8-24 17:50

红影 发表于 2025-8-24 13:51
嗯嗯,随机的也是好看的。

有时候会重叠

花飞飞 发表于 2025-8-24 19:56

随意点几次,每次出现的形状都不相同。。。
看是计算好了让它们不出界,很听话。。
产要是写算法的人厉害{:4_173:}

马黑黑 发表于 2025-8-24 21:24

花飞飞 发表于 2025-8-24 19:56
随意点几次,每次出现的形状都不相同。。。
看是计算好了让它们不出界,很听话。。
产要是写算法的人厉害 ...

一切设计在范围内,位置则随机变化

红影 发表于 2025-8-24 22:12

马黑黑 发表于 2025-8-24 17:50
有时候会重叠

运动时不怕重叠,运动速率不一样,有滞后,所以还是会分开的。

马黑黑 发表于 2025-8-24 22:58

红影 发表于 2025-8-24 22:12
运动时不怕重叠,运动速率不一样,有滞后,所以还是会分开的。

就是这个道理

红影 发表于 2025-8-24 23:24

马黑黑 发表于 2025-8-24 22:58
就是这个道理

重叠的还是不多的。

马黑黑 发表于 2025-8-25 14:43

红影 发表于 2025-8-24 23:24
重叠的还是不多的。

重叠也没关系

花飞飞 发表于 2025-8-25 15:52

马黑黑 发表于 2025-8-24 21:24
一切设计在范围内,位置则随机变化

今天的实例又看到了。。闪烁效果真漂亮

马黑黑 发表于 2025-8-25 19:44

花飞飞 发表于 2025-8-25 15:52
今天的实例又看到了。。闪烁效果真漂亮

这是很简单的实现机制

花飞飞 发表于 2025-8-25 20:30

马黑黑 发表于 2025-8-25 19:44
这是很简单的实现机制

效果好就好,一直喜欢这个呼吸灯效果,跟东西活了一样

马黑黑 发表于 2025-8-25 21:02

花飞飞 发表于 2025-8-25 20:30
效果好就好,一直喜欢这个呼吸灯效果,跟东西活了一样

明天做一个变大变小的

红影 发表于 2025-8-25 21:47

马黑黑 发表于 2025-8-25 14:43
重叠也没关系

的确,影响不大的。

花飞飞 发表于 2025-8-26 12:21

马黑黑 发表于 2025-8-25 21:02
明天做一个变大变小的

双手双脚支持。。。{:4_205:}

马黑黑 发表于 2025-8-26 12:22

花飞飞 发表于 2025-8-26 12:21
双手双脚支持。。。

还没动手

花飞飞 发表于 2025-8-26 12:39

马黑黑 发表于 2025-8-26 12:22
还没动手

没动手也支持。。你说了就会做的。{:4_173:}
页: [1] 2 3
查看完整版本: 让svg粒子自适应帖子容器尺寸