醉美水芙蓉 发表于 2026-8-7 22:26:48

马黑黑《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-8-7 22:27:39

当我们在 viewBox 中绘制图形,图形的大小缩放看 svg 的宽高,具体依据的是 SVG 根元素的 width、height 和 viewBox 设定的 width、height 的比例关系。<br />
<br />
而 SVG 子元素如果存在描边(stroke)属性,默认情况下,描边的厚度(stroke-width)也会自动跟随上述二者的比例缩放。某些场景下,可能不希望描边变细或变粗,这时候就得用上 vector-effect 属性,该属性可以翻译为“矢量效果”,其可选值中有一个 <font style="background-color:silver">non-scaling-stroke</font>,基于矢量图形的缩放效果,该值意为<font style="background-color:silver">不缩放描边厚度</font>。<br />
<br />
一楼示例,圆缺省默认缩放描边厚度,A指令绘制的路径、旋转的矩形则禁用缩放。预览效果时可以拖曳方框右下角水平改变方框的尺寸,方框内的 SVG 会跟随改变大小,SVG 内的 子元素尺寸会自适应场景产生缩放变化,变化过程中的观察对象为三个子元素的 stroke-width。</td></tr></table>

klxf 发表于 2026-8-8 14:31:02

实用的教程,谢谢分享
页: [1]
查看完整版本: 马黑黑《SVG vector-effect 属性之禁用描边缩放》