马黑黑 发表于 2026-7-27 08:46

SVG vector-effect 属性之禁用描边缩放

<div class="hEdiv" data-prev="1"><pre class="hEpre">
&lt;style&gt;
    .pa {
      width: 400px;
      min-width: 200px;
      height: auto;
      aspect-ratio: 2/1; /* 保持2:1宽高比 */
      border: 1px solid gray;
      overflow: hidden; /* 拖曳改变元素尺寸支持 */
      resize: horizontal; /* 横向拖曳 */
      margin: 30px auto 0;
    }
&lt;/style&gt;

&lt;div class="pa"&gt;
    &lt;svg width="100%" height="100%" viewBox="0 0 100 50"&gt;
      &lt;!-- 路径 :设置为描边不缩放 --&gt;
      &lt;path
          d="M 2 25 A1 0.4,0 0 0, 98 25"
          fill="none"
          stroke="red"
          stroke-width="2"
          vector-effect="non-scaling-stroke"
      /&gt;
      &lt;!-- 圆 :不禁止描边缩放(缺省默认) --&gt;
      &lt;circle
          cx="10"
          cy="10"
          r="5"
          fill="lightgreen"
          stroke="orange"
          stroke-width="1"
      /&gt;
      &lt;!--矩形 :描边不缩放 --&gt;
      &lt;rect
          x="50"
          y="25"
          width="10"
          height="10"
          fill="tan"
          stroke="red"
          stroke-width="4"
          vector-effect="non-scaling-stroke"
      &gt;
            &lt;animateTransform
            attributeName="transform"
            type="rotate"
            from="0 55 30"
            to="360 55 30"
            dur="8s"
            vector-effect="non-rotation"
            repeatCount="indefinite"
            /&gt;
      &lt;/rect&gt;
    &lt;/svg&gt;
&lt;/div&gt;
</pre></div>

<script type="module">
    import hl from 'https://638183.freep.cn/638183/web/js/hl.js';
    const divs = document.querySelectorAll('.hEdiv');
    const pres = document.querySelectorAll('.hEpre');
    divs.forEach((div,idx) => hl.hl(div, pres));
</script>

马黑黑 发表于 2026-7-27 08:47

当我们在 viewBox 中绘制图形,图形的大小缩放看 svg 的宽高,具体依据的是 SVG 根元素的 width、height 和 viewBox 设定的 width、height 的比例关系。

而 SVG 子元素如果存在描边(stroke)属性,默认情况下,描边的厚度(stroke-width)也会自动跟随上述二者的比例缩放。某些场景下,可能不希望描边变细或变粗,这时候就得用上 vector-effect 属性,该属性可以翻译为“矢量效果”,其可选值中有一个 non-scaling-stroke,基于矢量图形的缩放效果,该值意为不缩放描边厚度。

一楼示例,圆缺省默认缩放描边厚度,A指令绘制的路径、旋转的矩形则禁用缩放。预览效果时可以拖曳方框右下角水平改变方框的尺寸,方框内的 SVG 会跟随改变大小,SVG 内的 子元素尺寸会自适应场景产生缩放变化,变化过程中的观察对象为三个子元素的 stroke-width。

杨帆 发表于 2026-7-27 11:32

第一次知道这个新属性,谢谢马老师仔细讲解与演示{:4_190:}

梦江南 发表于 2026-7-27 12:41

谢谢黑黑老师详细讲解。学习了。{:4_187:}

红影 发表于 2026-7-27 17:41

仔细盯着图像的描边看了,貌似还是描边的厚度随着比例缩放更好,会感觉不到描边变化,否则感觉图形变小时,好像描边变厚了似的。
这样对比着看真好,感谢黑黑的讲解,学习了{:4_187:}

马黑黑 发表于 2026-7-27 18:41

杨帆 发表于 2026-7-27 11:32
第一次知道这个新属性,谢谢马老师仔细讲解与演示

{:4_190:}

马黑黑 发表于 2026-7-27 18:41

梦江南 发表于 2026-7-27 12:41
谢谢黑黑老师详细讲解。学习了。

{:4_190:}

马黑黑 发表于 2026-7-27 18:41

红影 发表于 2026-7-27 17:41
仔细盯着图像的描边看了,貌似还是描边的厚度随着比例缩放更好,会感觉不到描边变化,否则感觉图形变小时, ...

这得看场景需求

红影 发表于 2026-7-27 21:50

马黑黑 发表于 2026-7-27 18:41
这得看场景需求
嗯嗯,也对,有什么需求就应该用对应的描边{:4_187:}

马黑黑 发表于 2026-7-27 21:51

红影 发表于 2026-7-27 21:50
嗯嗯,也对,有什么需求就应该用对应的描边

不然 SVG 不会这么设计的

红影 发表于 2026-7-29 21:43

马黑黑 发表于 2026-7-27 21:51
不然 SVG 不会这么设计的

这个用图示的方式直接展示的好,让人得到更直观的感觉{:4_204:}

马黑黑 发表于 2026-7-30 21:37

红影 发表于 2026-7-29 21:43
这个用图示的方式直接展示的好,让人得到更直观的感觉

不困惑就好

红影 发表于 2026-7-30 22:49

马黑黑 发表于 2026-7-30 21:37
不困惑就好

感谢黑黑的详细讲解{:4_187:}

马黑黑 发表于 2026-7-31 08:00

红影 发表于 2026-7-30 22:49
感谢黑黑的详细讲解

甭客气

红影 发表于 2026-7-31 20:36

马黑黑 发表于 2026-7-31 08:00
甭客气

看看这样的帖子很有收获{:4_187:}

马黑黑 发表于 2026-7-31 22:19

红影 发表于 2026-7-31 20:36
看看这样的帖子很有收获

有收获没收获也差不多,玩玩

红影 发表于 2026-8-1 08:43

马黑黑 发表于 2026-7-31 22:19
有收获没收获也差不多,玩玩

玩的时候也需要认真点才好{:4_204:}

马黑黑 发表于 2026-8-1 09:07

红影 发表于 2026-8-1 08:43
玩的时候也需要认真点才好

做帖人怕就怕认真二字

霜染枫丹 发表于 2026-8-1 14:10

马老师下午好!

我不用知其所以然,能用最关键,这个很漂亮,对我很有用。
感谢分享,一并抱走,很高兴有您的分享!祝好!{:4_204:}{:4_190:}

马黑黑 发表于 2026-8-1 14:58

霜染枫丹 发表于 2026-8-1 14:10
马老师下午好!

我不用知其所以然,能用最关键,这个很漂亮,对我很有用。


{:4_190:}
页: [1] 2
查看完整版本: SVG vector-effect 属性之禁用描边缩放