You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何SVG <use>在Safari中的尺寸与定位和Firefox、Chrome不一致?

SVG 调用在Safari中缩放定位异常问题

在SVG的<defs>区块中定义<symbol>后,使用<use>元素调用时,该元素在Safari中无法正确缩放和定位,但在Firefox与Chrome中表现正常。

以下代码在Firefox和Chrome中会在方框中心显示两个重叠的小实心圆,但在Safari中,通过<use>调用的圆尺寸过大且位置偏移:

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink">
    <defs>
        <symbol id="mark" width="8" height="8" viewBox="0 0 8 8">
            <circle cx="4" cy="4" r="4"/>
        </symbol>
    </defs>
    <g>
        <use href="#mark" x="46" y="46" fill="black"/>
        <circle href="#mark" cx="50" cy="50" r="2" stroke="none" fill="red"/>
        <rect x="0" y="0" width="100" height="100" stroke="red" fill="none"/>
    </g>
</svg>

效果对比

  • Safari输出效果:Safari中SVG显示效果
  • Firefox输出效果:Firefox中SVG显示效果

请问我在viewbox和尺寸设置方面遗漏了什么?


问题原因与解决方法

问题出在Safari对<symbol>元素的width/height属性与viewBox的组合处理逻辑和其他浏览器不一致:当<symbol>同时声明width/height和viewBox时,Safari没有正确基于viewBox进行缩放计算,反而直接将symbol的尺寸当作渲染尺寸,导致<use>调用时出现偏移和缩放异常。

解决方法1:移除<symbol>的width/height属性

<symbol>作为可复用的图形模板,仅通过viewBox定义其坐标系统即可,多余的width/height会干扰Safari的渲染逻辑。修改后的<symbol>如下:

<symbol id="mark" viewBox="0 0 8 8">
    <circle cx="4" cy="4" r="4"/>
</symbol>

同时在<use>元素上明确指定显示尺寸:

<use href="#mark" x="46" y="46" fill="black" width="8" height="8"/>

解决方法2:显式为<use>指定width/height

如果需要保留<symbol>的width/height,只需在<use>元素上显式声明尺寸,覆盖Safari的默认行为:

<use href="#mark" x="46" y="46" fill="black" width="8" height="8"/>

另外注意:原代码中第二个<circle>使用href="#mark"是错误用法,<circle>不支持href属性,应改为<use>元素,并根据需要设置尺寸以实现与红色小圆重叠的效果:

<use href="#mark" cx="50" cy="50" width="4" height="4" fill="red"/>

内容的提问来源于stack exchange,提问作者Lance Berc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 02:50:30