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

Raphael.js:组合自定义图形填充异常问题求助

为什么SVG嵌套图形填充时内外都被填充?

这是SVG默认的填充规则在搞鬼!我之前做自定义图标时也踩过一模一样的坑😅

核心原因:非零环绕规则(Non-zero Winding Rule)

SVG默认使用nonzero作为填充规则,它会根据路径的绘制方向(顺时针/逆时针)判断哪些区域属于“内部”:

  • 当你绘制外部图形和内部图形时,如果两者的路径方向相同(比如都是顺时针),非零规则会把两个图形的区域都判定为需要填充的内部区域,所以内外都会被填上颜色。
  • 而描边不受这个规则影响——它只是沿着路径线条渲染,所以轮廓显示完全正常。

两种快速解决方法

方法1:修改内部路径的绘制方向

把内部图形的路径方向改成和外部相反(比如外部顺时针,内部就改成逆时针),这样非零规则就能识别出中间的空心区域。
比如原来的内部顺时针路径:M 100 100 L 200 100 L 200 200 L 100 200 Z,改成逆时针:M 100 100 L 100 200 L 200 200 L 200 100 Z。

方法2:直接设置fill-rule="evenodd"

更省心的方式是给SVG元素或者路径元素加上fill-rule="evenodd"属性。这个规则逻辑直白:一个区域被路径穿过奇数次就填充,偶数次就不填充——不管路径方向如何,嵌套图形都会自动形成空心效果。
示例代码:

<svg width="300" height="300">
  <path d="M 50 50 L 250 50 L 250 250 L 50 250 Z M 100 100 L 200 100 L 200 200 L 100 200 Z" 
        fill="blue" 
        stroke="black" 
        fill-rule="evenodd" />
</svg>

这样设置后,你就能得到只有外部和内部之间的区域被填充的效果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:12:08