html - 用 svg 中的透明路径重叠彩色矩形/在与路径的交叉点上破坏矩形填充颜色
问题描述
我有与以下类似的代码,由动态内容创建工具生成,即该工具的用户将根据需要选择颜色。当矩形是彩色的但路径内部是透明的时会出现问题,因此矩形的颜色将填充路径内的所有部分。目标是显示矩形的颜色,但避免在路径的内部部分透明时着色,而是可以显示该透明部分后面的潜在对象。
<svg xmlns="http://www.w3.org/2000/svg" style="position: absolute;" id="id2_svg" >
<g id="id2_g" >
<rect id="id2_rect" style="fill:rgba(255 , 255 , 0 , 255);" />
<path id="id2_path" d="M 32.0 2.0 C 6.0 -2.0 -10.0 71.0 13.0 89.0 C 36.0 107.0 168.0 125.0 171.0 111.0 C 174.0 96.0 58.0 6.0 32.0 2.0" style= "fill: #fff; fill-opacity: 0; pointer-events: visiblePainted" />
</g>
</svg>
在路径样式中使用任何填充值都会产生相同的结果。使用描边可以保持路径内部确定但背景为黑色!
解决方案
OP正在添加此评论:
有什么办法可以打破与路径交叉处的矩形填充?
您可以像这样剪裁矩形:
<svg viewBox="0 0 300 150" >
<defs>
<clipPath id="clip">
<path id="id2_path" d="M 32.0 2.0 C 6.0 -2.0 -10.0 71.0 13.0 89.0 C 36.0 107.0 168.0 125.0 171.0 111.0 C 174.0 96.0 58.0 6.0 32.0 2.0" />
</clipPath>
</defs>
<g id="id2_g" >
<rect id="id2_rect" style="fill:rgba(255 , 255 , 0 , 255);" width="100" height="100" clip-path="url(#clip)" />
<use xlink:href="#id2_path" stroke="black" fill="none"/>
</g>
</svg>
OP正在评论:
其实我想要的是这个的反面。通过使用剪辑路径,我剪辑了路径的外部,即使其透明,但我想要的是剪辑路径内部并使其透明,同时保持矩形其余部分的颜色不变。无论如何感谢您的回答!
在这种情况下,我建议使用修改后的路径。我会在原始d
属性中添加:M0,0H300V150H0V0z
. 我希望这是你需要的。
<svg viewBox="0 0 300 150" >
<defs>
<clipPath id="clip">
<path id="id2_path" d="M 32.0 2.0 C 6.0 -2.0 -10.0 71.0 13.0 89.0 C 36.0 107.0 168.0 125.0 171.0 111.0 C 174.0 96.0 58.0 6.0 32.0 2.0
M0,0H300V150H0V0z" />
</clipPath>
</defs>
<g id="id2_g" >
<rect id="id2_rect" style="fill:rgba(255 , 255 , 0 , 255);" width="100" height="100" clip-path="url(#clip)" />
<path id="id2_path" d="M 32.0 2.0 C 6.0 -2.0 -10.0 71.0 13.0 89.0 C 36.0 107.0 168.0 125.0 171.0 111.0 C 174.0 96.0 58.0 6.0 32.0 2.0" stroke="black" fill="none" />
</g>
</svg>
更新:
这应该对我有帮助,但是您能否详细解释一下为什么将其添加到原始路径中
通过添加M0,0H300V150H0V0z
到路径中,您可以绘制一个与 svg 画布一样大的矩形。矩形是以相反的方式绘制的。在这种情况下,您从左到右绘制路径,从右到左绘制添加的矩形。通过这种方式,您可以创建一个带孔的矩形,并将此形状用于 clipPath:
添加字符串的模仿:M0,0H300V150H0V0z
移动到 svg 画布的原点
M0,0
从上一点到点 {300,0} 的水平线
H300
从上一点到点 {300,150} 的垂直线
V150
从上一点到点 {0,150} 的水平线
H0
从上一点到点 {0,0} 的垂直线
V0
关闭路径:
z
<svg viewBox="0 0 300 150" >
<path id="id2_path" d="M 32.0 2.0 C 6.0 -2.0 -10.0 71.0 13.0 89.0 C 36.0 107.0 168.0 125.0 171.0 111.0 C 174.0 96.0 58.0 6.0 32.0 2.0 M0,0H300V150H0V0z" />
</svg>
以及为什么您再次在
<g>
标签内添加原始路径点。
因为现在用于 clipPath 的路径看起来与添加的字符串不同。
推荐阅读
- python - 使用列表搜索字符串并返回多字变量。
- windows - BATCH 在子文件夹中查找字符串并移动到新位置
- javascript - 在 Firebase Cloud 函数中返回 XML
- android - 如何在 Android 的列表视图中删除图像周围的额外空间?
- vue.js - Vue 2 过滤器不是一个函数
- amazon-web-services - AWS 是否允许我们使用 SES 为客户预处理电子邮件?
- javascript - 使用 Javascript/HTML 使用 REST 服务
- arrays - Excel 计算行中两个词的出现次数
- javascript - 汇总:从 Lodash 导入功能时“导入不存在的导出”
- python - 如何使用 PYQT5 在 QTreeView 中选择和编辑新创建的文件夹