SVG 描边问题
SVG stroke issue
我正在使用 SVG 创建图表。
我用三个圆形元素创建了它,并添加了一个路径(三角形)来制作一个空白 space。但我不知道如何在底部隐藏一个几乎可见的薄边框。
也许我做错了什么?
这是我的演示:
`https://codepen.io/Groude/pen/VgmVvG`
这里有一张截图,可以更好地理解我在说什么:
SVG:
<svg viewBox="0 0 32 32">
<defs></defs>
<circle
r="16"
cx="16"
cy="16"
class="circle--progress"
stroke-dasharray="100 100"
></circle>
<circle
r="16"
cx="16"
cy="16"
fill="none"
stroke="#3FC364"
stroke-dasharray="100 100"
></circle>
<circle
r="16"
cx="16"
cy="16"
fill="none"
stroke="#EDBB40"
stroke-dasharray="66 100"
></circle>
<circle
r="16"
cx="16"
cy="16"
fill="none"
stroke="#FF8832"
stroke-dasharray="33 100"
></circle>
<path d="M16 16 L100 50 L200 -50 Z" fill="white"></path>
</svg>
<div class="text">
<div class="text__percentage">100%</div>
<div class="text__description">Sentiment<br />score</div>
</div>
</div>
CSS
.wrapper {
position: relative;
width: 400px;
height: 400px;
padding: 20px 0;
margin: 0 auto;
}
svg {
width: 100%;
height: 100%;
border-radius: 50%;
transform: rotate(90deg);
}
circle {
fill: transparent;
stroke-width: 3;
}
.circle--progress {
fill: transparent;
stroke: #C4C4C4;
stroke-width: 32;
stroke-opacity: .25;
}
.text {
position: absolute;
z-index: 2;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-family: sans-serif;
text-align: center;
}
.text__percentage {
font-size: 60px;
font-weight: bold;
}
.text__description {
font-size: 18px;
font-weight: 500;
line-height: 16px;
}
我假设您使用 Google Chrome 或类似的基于 Blink 或 Webkit 的浏览器来测试此 SVG 图像。在 Mozilla Firefox 或 Microsoft Edge 中打开页面不会显示您指出的非常细的边框,因此这是您的浏览器问题,而不是您的代码问题。我建议向 Google 发送有关此问题的错误报告。
同时,要为包括 Chrome 在内的所有浏览器解决此问题,请考虑使用 SVG <clipPath>
元素并将其应用于除白色三角形之外的所有形状。然后,在 CSS 中删除 svg
选择器中的 border-radius
属性。
<svg viewBox="0 0 32 32">
<defs>
<clipPath id="circle-viewport">
<circle r="16" cx="16" cy="16" />
</clipPath>
</defs>
<circle
r="16"
cx="16"
cy="16"
class="circle--progress"
stroke-dasharray="100 100"
clip-path="url(#circle-viewport)"
></circle>
<circle
r="16"
cx="16"
cy="16"
fill="none"
stroke="#3FC364"
stroke-dasharray="100 100"
clip-path="url(#circle-viewport)"
></circle>
<circle
r="16"
cx="16"
cy="16"
fill="none"
stroke="#EDBB40"
stroke-dasharray="66 100"
clip-path="url(#circle-viewport)"
></circle>
<circle
r="16"
cx="16"
cy="16"
fill="none"
stroke="#FF8832"
stroke-dasharray="33 100"
clip-path="url(#circle-viewport)"
></circle>
<path d="M16 16 L100 50 L200 -50 Z" fill="white"></path>
</svg>
问题似乎在于浏览器(Chrome、Safary 或同一引擎上的其他浏览器)如何使用 border-radius:50%
呈现 svg。用圆形蒙版剪裁它没有帮助。
一个解决方案是使图形看起来相同而不用 border-radius
切割(遮蔽)它看起来是圆形的。这将需要为彩色段设置欺骗圆半径和笔画宽度:
<circle
r="15" <--
cx="16"
cy="16"
fill="none"
stroke="#3FC364"
stroke-dasharray="100 100"
></circle>
circle {
fill: transparent;
stroke-width: 2; <--
}
并使进度圆圈适合图表的所需圆圈:
<circle
r="8" <--
cx="16"
cy="16"
class="circle--progress"
stroke-dasharray="100 100"
></circle>
.circle--progress {
fill: transparent;
stroke: #C4C4C4;
stroke-width: 16; <-- 8 radius + 8 half stroke width= 16 visible radius
stroke-opacity: .25;
}
查看完整示例:https://codepen.io/anon/pen/zeogLV
如果需要 border-radius
使图形与背景更好地融合 - 将其包裹在 div 中并将 border-radius
应用于 div。
参见示例 https://codepen.io/anon/pen/exgOvm?editors=1100
我更改了 body 背景,这样剪裁会更清晰。
我正在使用 SVG 创建图表。 我用三个圆形元素创建了它,并添加了一个路径(三角形)来制作一个空白 space。但我不知道如何在底部隐藏一个几乎可见的薄边框。 也许我做错了什么?
这是我的演示:
`https://codepen.io/Groude/pen/VgmVvG`
这里有一张截图,可以更好地理解我在说什么:
SVG:
<svg viewBox="0 0 32 32">
<defs></defs>
<circle
r="16"
cx="16"
cy="16"
class="circle--progress"
stroke-dasharray="100 100"
></circle>
<circle
r="16"
cx="16"
cy="16"
fill="none"
stroke="#3FC364"
stroke-dasharray="100 100"
></circle>
<circle
r="16"
cx="16"
cy="16"
fill="none"
stroke="#EDBB40"
stroke-dasharray="66 100"
></circle>
<circle
r="16"
cx="16"
cy="16"
fill="none"
stroke="#FF8832"
stroke-dasharray="33 100"
></circle>
<path d="M16 16 L100 50 L200 -50 Z" fill="white"></path>
</svg>
<div class="text">
<div class="text__percentage">100%</div>
<div class="text__description">Sentiment<br />score</div>
</div>
</div>
CSS
.wrapper {
position: relative;
width: 400px;
height: 400px;
padding: 20px 0;
margin: 0 auto;
}
svg {
width: 100%;
height: 100%;
border-radius: 50%;
transform: rotate(90deg);
}
circle {
fill: transparent;
stroke-width: 3;
}
.circle--progress {
fill: transparent;
stroke: #C4C4C4;
stroke-width: 32;
stroke-opacity: .25;
}
.text {
position: absolute;
z-index: 2;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-family: sans-serif;
text-align: center;
}
.text__percentage {
font-size: 60px;
font-weight: bold;
}
.text__description {
font-size: 18px;
font-weight: 500;
line-height: 16px;
}
我假设您使用 Google Chrome 或类似的基于 Blink 或 Webkit 的浏览器来测试此 SVG 图像。在 Mozilla Firefox 或 Microsoft Edge 中打开页面不会显示您指出的非常细的边框,因此这是您的浏览器问题,而不是您的代码问题。我建议向 Google 发送有关此问题的错误报告。
同时,要为包括 Chrome 在内的所有浏览器解决此问题,请考虑使用 SVG <clipPath>
元素并将其应用于除白色三角形之外的所有形状。然后,在 CSS 中删除 svg
选择器中的 border-radius
属性。
<svg viewBox="0 0 32 32">
<defs>
<clipPath id="circle-viewport">
<circle r="16" cx="16" cy="16" />
</clipPath>
</defs>
<circle
r="16"
cx="16"
cy="16"
class="circle--progress"
stroke-dasharray="100 100"
clip-path="url(#circle-viewport)"
></circle>
<circle
r="16"
cx="16"
cy="16"
fill="none"
stroke="#3FC364"
stroke-dasharray="100 100"
clip-path="url(#circle-viewport)"
></circle>
<circle
r="16"
cx="16"
cy="16"
fill="none"
stroke="#EDBB40"
stroke-dasharray="66 100"
clip-path="url(#circle-viewport)"
></circle>
<circle
r="16"
cx="16"
cy="16"
fill="none"
stroke="#FF8832"
stroke-dasharray="33 100"
clip-path="url(#circle-viewport)"
></circle>
<path d="M16 16 L100 50 L200 -50 Z" fill="white"></path>
</svg>
问题似乎在于浏览器(Chrome、Safary 或同一引擎上的其他浏览器)如何使用 border-radius:50%
呈现 svg。用圆形蒙版剪裁它没有帮助。
一个解决方案是使图形看起来相同而不用 border-radius
切割(遮蔽)它看起来是圆形的。这将需要为彩色段设置欺骗圆半径和笔画宽度:
<circle
r="15" <--
cx="16"
cy="16"
fill="none"
stroke="#3FC364"
stroke-dasharray="100 100"
></circle>
circle {
fill: transparent;
stroke-width: 2; <--
}
并使进度圆圈适合图表的所需圆圈:
<circle
r="8" <--
cx="16"
cy="16"
class="circle--progress"
stroke-dasharray="100 100"
></circle>
.circle--progress {
fill: transparent;
stroke: #C4C4C4;
stroke-width: 16; <-- 8 radius + 8 half stroke width= 16 visible radius
stroke-opacity: .25;
}
查看完整示例:https://codepen.io/anon/pen/zeogLV
如果需要 border-radius
使图形与背景更好地融合 - 将其包裹在 div 中并将 border-radius
应用于 div。
参见示例 https://codepen.io/anon/pen/exgOvm?editors=1100
我更改了 body 背景,这样剪裁会更清晰。