当前位置: 首页 > 知识库问答 >
问题:

这是Chrome中的svg笔画宽度错误吗?

徐英锐
2023-03-14

我试图创建一个svg点,我可以扩大使用笔画宽度。

css lang-css prettyprint-override">svg{
  zoom: 3000%;
  margin-top: 1px;
  fill: red;
  stroke: blue;
}

body{
    display: flex;
  div{
    display: flex;
    flex: 1;
    align-items: center;
    flex-direction: column;
    height: 100%;
    padding: 20px 0;
  }
}
<div>
  stroke-width: 1px;
<svg stroke-width="1" xmlns="http://www.w3.org/2000/svg" width="4" height="6.843" viewBox="0 0 4 6.843">
  <g id="Group_614" data-name="Group 614" transform="translate(-851.372 -396.657)">
    <path id="Group_608" data-name="Group 608" d="M16,22.1a.371.371,0,1,1-.371.371h0A.371.371,0,0,1,16,22.1Z" transform="translate(837.372 375.561)" stroke-miterlimit="10"/>
    <circle id="Ellipse_20" data-name="Ellipse 20" cx="0.5" cy="0.5" r="0.5" transform="translate(852.872 401)" />
  </g>
</svg>
</div>

<div>
  stroke-width: 2px;
<svg stroke-width="2" xmlns="http://www.w3.org/2000/svg" width="4" height="6.843" viewBox="0 0 4 6.843">
  <g id="Group_614" data-name="Group 614" transform="translate(-851.372 -396.657)">
    <path id="Group_608" data-name="Group 608" d="M16,22.1a.371.371,0,1,1-.371.371h0A.371.371,0,0,1,16,22.1Z" transform="translate(837.372 375.561)" stroke-miterlimit="10"/>
    <circle id="Ellipse_20" data-name="Ellipse 20" cx="0.5" cy="0.5" r="0.5" transform="translate(852.872 401)" />
  </g>
</svg>
</div>

<div>
  stroke-width: 3px;
<svg stroke-width="3px"  xmlns="http://www.w3.org/2000/svg" width="4" height="6.843" viewBox="0 0 4 6.843">
  <g id="Group_614" data-name="Group 614" transform="translate(-851.372 -396.657)">
    <path id="Group_608" data-name="Group 608" d="M16,22.1a.371.371,0,1,1-.371.371h0A.371.371,0,0,1,16,22.1Z" transform="translate(837.372 375.561)" stroke-miterlimit="10"/>
    <circle id="Ellipse_20" data-name="Ellipse 20" cx="0.5" cy="0.5" r="0.5" transform="translate(852.872 401)" />
  </g>
</svg>
</div>


<div>
  stroke-width: 4px;
<svg stroke-width="4px" xmlns="http://www.w3.org/2000/svg" width="4" height="6.843" viewBox="0 0 4 6.843">
  <g id="Group_614" data-name="Group 614" transform="translate(-851.372 -396.657)">
    <path id="Group_608" data-name="Group 608" d="M16,22.1a.371.371,0,1,1-.371.371h0A.371.371,0,0,1,16,22.1Z" transform="translate(837.372 375.561)" stroke-miterlimit="10"/>
    <circle id="Ellipse_20" data-name="Ellipse 20" cx="0.5" cy="0.5" r="0.5" transform="translate(852.872 401)" />
  </g>
</svg>
</div>

共有1个答案

司寇星海
2023-03-14

试图绘制笔划超过半径两倍的圆不是一个好主意。正如您所发现的,这种情况下的行为是不可靠的,许多2D呈现库不能很好地处理它。SVG规范中也没有定义正确的行为。

不过,你的问题有一个简单的解决办法。只需画一条零长度的线,它有圆形的端盖。好消息是这不是诡计。这样做是安全的,因为规范中指定了此行为。并且所有的SVG呈现器都能正确地处理它。

svg{
  margin-top: 1px;
  fill: none;
  stroke: blue;
  stroke-linecap: round;
}

body{
    display: flex;
  div{
    display: flex;
    flex: 1;
    align-items: center;
    flex-direction: column;
    height: 100%;
    padding: 20px 0;
  }
}
<div>
  stroke-width: 1px;
<svg stroke-width="1" width="120" height="120" viewBox="0 0 4 4">
  <path d="M2,2h0"/>
</svg>
</div>

<div>
  stroke-width: 2px;
<svg stroke-width="2" width="120" height="120" viewBox="0 0 4 4">
  <path d="M2,2h0"/>
</svg>
</div>

<div>
  stroke-width: 3px;
<svg stroke-width="3" width="120" height="120" viewBox="0 0 4 4">
  <path d="M2,2h0"/>
</svg>
</div>


<div>
  stroke-width: 4px;
<svg stroke-width="4" width="120" height="120" viewBox="0 0 4 4">
  <path d="M2,2h0"/>
</svg>
</div>
 类似资料:
  • 使用后记多年,我现在正在学习SVG。PS有一个功能是我迄今为止无法复制的:零宽度线。在 PS 中,宽度为零的行始终可见:PostScript 将零行宽转换为最小的可打印宽度。在屏幕上,当缩放时,它们永远不会有任何思考,但无论比例如何,它们都可见。当我想渲染非常细的线条时,我已经使用了它们,而不会担心我将要使用的最终分辨率,事实证明它们非常有用。 然而,在官方SVG文档(https://www.w3

  • 笔:https://codepen.io/anon/pen/zezppk(在Chrome中可视化) 想法:动画一个SVG笔画,使它以长度0(一个等于路径总长度的dashOffset)开头,所以没有呈现任何内容。然后,逐步减小Dashoff集,直到显示出整个SVG笔画。到目前为止,没有问题,这是一个相当普遍的效果,事实上。但我想额外加点:笔画的“起点”也必须逐渐抵消,才能达到笔下的效果。 具体要求是

  • 问题内容: 是否可以固定HTML5 元素的宽度和高度? 通常的方法如下: 问题答案: 的DOM元素具有和对应的属性的和属性。在JavaScript代码中将它们设置为数值,以调整画布的大小。例如: 请注意,这将清除画布,但是您应该遵循此操作来处理那些不能完全清除画布的浏览器。尺寸更改后,您需要重绘要显示的所有内容。 进一步注意的是,高度和宽度是用于绘制逻辑帆布尺寸和是 不同的 距离和CSS属性。如果

  • 问题内容: 如果使用IE11,似乎无法正确计算弹性项目宽度。 4个盒子每个都有flex-basis:50%,所以我们应该得到两行,每个盒子两个,但是在IE11中,每个盒子只有一行。将边框设置为0时,它可以正常工作。 知道这是一个错误还是有办法使IE11表现出来(并且仍然使用边框)? PS值得庆幸的是,在我的项目中,仅需要支持流行浏览器的最新版本,但是IE11就是其中之一。 问题答案: 使用该属性计

  • 编辑:codesandbox:https://codesandbox.io/s/40xj3zv5w7上的示例,图像变得非常小,而不是400px宽和10px高。

  • 我在不起作用的浏览器中使用了这个SVG掩码来表示灰度: 不久前,这工作得很好,但现在我在控制台中出现了这个错误: 不安全地尝试加载URL数据:image/svg+xml;UTF8,http://www.w3.org/2000/svg'height='0'>#Greyscale from frame[my domain here]。域、协议和端口必须匹配。 不用说,灰度滤镜不再起作用了。 null