SVG图像圆形笔画图案正在 chrome 上切割

2ledvvac  于 2023-05-04  发布在  Go
关注(0)|答案(3)|浏览(93)

我在Chrome/Chromium中的SVG渲染有一个疯狂的问题(Firefox按预期工作)。
我想渲染一个空填充的圆,但包含模板的笔划,但由于某种原因,一旦我尝试更改屏幕分辨率,圆笔划开始被切断,主要是在底部/右边缘。我不知道为什么会这样。我想知道我应该做些什么来防止中风被削减,任何帮助都欢迎

UPD我不关心IE和其他过时的浏览器。只是现代的

复制链接:https://jsfiddle.net/k8cbq4dv/
随附屏幕截图x1c 0d1x
代码本身:

<div id="root">
    <svg width="100%" viewBox="0 0 40 40" style="background-color: rgb(204, 255, 204);">
        <defs>
            <pattern id="greenglaze" patternUnits="userSpaceOnUse" width="5" height="5">
                <image href="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSyiQU4yEPR1SIEF1mRiFOP1IMFoQ4s8y0vGJTRhRt4CbE4BaOuFEXrwEDWmI8ngIzbk_c&amp;usqp=CAU" width="5" height="5" preserveAspectRatio="none"></image>
            </pattern>
        </defs>
        <circle cx="20" cy="20" r="12.91549430918954" fill="transparent" transform-origin="center" stroke="url(#greenglaze)" stroke-width="7.9" stroke-dasharray="100 0" stroke-dashoffset="-0" transform="rotate(-90, 0, 0)"></circle>
    </svg>
</div>
tquggr8v

tquggr8v1#

这只是一个怀疑,所以答案可能仍然是不正确的。至少对我来说,jsFiddle错误确实消失了。
这可能是因为Chromium在识别最终图形的边界框方面存在问题,因为它必须考虑笔划的宽度。如果它在这一点上计算错误,它可能会决定一些重复的模式将永远在有效的剪辑路径之外,只是不渲染它们。
解决方案是不使用笔划宽度,而是绘制两个组合的圆形路径:

<div id="root">
  <svg width="100%" viewBox="0 0 40 40" style="background-color: rgb(204, 255, 204);">
    <defs>
      <pattern id="greenglaze" patternUnits="userSpaceOnUse" width="5" height="5">
        <image href="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSyiQU4yEPR1SIEF1mRiFOP1IMFoQ4s8y0vGJTRhRt4CbE4BaOuFEXrwEDWmI8ngIzbk_c&amp;usqp=CAU" width="5" height="5" preserveAspectRatio="none"></image>
      </pattern>
    </defs>
    <path d="M 20 4.135
             A 15.865 15.865 0 0 0 20 35.865
             A 15.865 15.865 0 0 0 20 4.135 z
             M 20 10.035
             A 9.965 9.965 0 0 1 20 29.965
             A 9.965 9.965 0 0 1 20 10.035 z"
          fill="url(#greenglaze)" transform="rotate(-90, 20, 20)" />
    </svg>
</div>
vdgimpew

vdgimpew2#

我迟到了,但经过一段时间的检查。据了解,您的circle正在您的“甜甜圈”上进行“切割”。
因为你的image被设置为preserveAspectRatio="none",它将根据窗口大小调整内容的大小,并触发在图像的侧面剪切。
也许这可能有帮助,但在 * circle* 中使用**stroke-miterlimit**可以解决这个问题。

<div id="root">
  <svg viewBox="0 0 40 40" style="width: 100%; background-color: rgb(204, 255, 204);">
    <defs>
      <pattern id="greenglaze" patternUnits="userSpaceOnUse" width="5" height="5">
        <image href="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSyiQU4yEPR1SIEF1mRiFOP1IMFoQ4s8y0vGJTRhRt4CbE4BaOuFEXrwEDWmI8ngIzbk_c&amp;usqp=CAU" width="5" height="5" preserveAspectRatio="none"></image>
      </pattern>
    </defs>
    <circle cx="20" cy="20" r="11" stroke="url(#greenglaze)" fill="transparent" transform-origin="center" stroke="url(#greenglaze)" stroke-miterlimit="30" stroke-width="7px" stroke-dasharray="100 0" stroke-dashoffset="-0" transform="rotate(-90, 0, 0)"/>
  </svg>
</div>
ufj5ltwl

ufj5ltwl3#

前面的代码并没有真正解决这个问题。
我的英语不是最好的。
我在这里做了几个测试,我认为解决方案是使用css。

svg {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
        }
<div id="root">
  <svg width="100%" viewBox="0 0 40 40" style="background-color: rgb(204, 255, 204);">
    <defs>
      <pattern id="greenglaze" patternUnits="userSpaceOnUse" width="5" height="5">
        <image href="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSyiQU4yEPR1SIEF1mRiFOP1IMFoQ4s8y0vGJTRhRt4CbE4BaOuFEXrwEDWmI8ngIzbk_c&amp;usqp=CAU" 
               width="5" 
               height="5" 
               preserveAspectRatio="none"></image>
      </pattern>
    </defs>
    <circle cx="20" 
            cy="20" 
            r="12.91549430918954" 
            fill="transparent" 
            transform-origin="center" 
            stroke="url(#greenglaze)" 
            stroke-width="7.9" 
            stroke-dasharray="100 0" 
            stroke-dashoffset="-0" 
            transform="rotate(-90, 0, 0)"></circle>
  </svg>
</div>

相关问题