我正在尝试使用 SVG 元素创建响应式 SVG 剪辑路径<path>。但是,我无法使其正常工作。
我已经使用更基本的形状(例如 )让它工作<circle>,但不是<path>元素。我还让它使用元素的静态尺寸来工作<path>。
我使用此处的说明作为参考:https://www.smashingmagazine.com/2015/05/creating-responsive-shapes-with-clip-path/。我还在 StackOverflow 和其他示例上查看了类似的问题,但它们主要处理基本形状而不是路径变量。
我使用的 SVG 形状是从 Adobe Illustrator 导出的雨滴形状。
这是我的代码:
超文本标记语言
<svg id="raindropSVG" viewBox="0 0 810 1012">
<defs>
<clipPath id="raindropClipPath" clipPathUnits="objectBoundingBox">
<path d="M0,604.4C0,523.7,30.7,408.8,97.5,320,217,160.9,409.2,0,409.2,0S597.2,167.8,717,331c63,85.7,93,196.4,93,274,0,224.5-181.3,407-405,407S0,829.5,0,604.4Z"/>
</clipPath>
</defs>
</svg>
<img src="clipped-image.jpg" alt="" class="clipped-img">
Run Code Online (Sandbox Code Playgroud)
CSS
.clipped-img {
clip-path: url(#raindropClipPath);
width: 100%;
height: auto;
}
#raindropSVG {
width: 0;
height: 0;
}
Run Code Online (Sandbox Code Playgroud)
这个想法是,改变宽度(或高度).clipped-img应该相应地缩放雨滴形状。
使用clipPathUnits="objectBoundingBox"对于做出clipPath响应是必要的。然而,一旦我添加这个,剪切的图像就会消失。
我认为我哪里做错了
我怀疑路径元素指定的路径不是相对单位,但我不知道如何将单位更改为相对单位。
预先感谢所有回复!
这个答案扭曲了剪辑路径的形状,使其始终跨越整个图像,无论其纵横比如何。
使用 时clipPathUnits="objectBoundingBox",只有 0 到 1 之间的坐标才会位于图像的边界矩形内。为此,您必须缩小路径。
幸运的是,viewBox您的路径为其尺寸命名。不幸的是,您不能将缩放的计算留给渲染器,而必须直接给出转换:scale(1 / 810, 1 / 1012)。请参阅a 的内容元素的限制<clipPath>。
SVG 1.1 和 SVG 2 规范名称都transform作为其自身的可能属性<clipPath>,但都没有定义它应该应用的坐标系。为了浏览器兼容性,最好不要管它并使用变换元素<path>,即使我可以看到在 Firefox 中结果没有差异。
.clipped-img {
clip-path: url(#raindropClipPath);
width: 100%;
height: auto;
}
#raindropSVG {
width: 0;
height: 0;
}Run Code Online (Sandbox Code Playgroud)
<svg id="raindropSVG">
<defs>
<clipPath id="raindropClipPath" clipPathUnits="objectBoundingBox">
<path transform="scale(0.0012345, 0.00098814)" d="M0,604.4C0,523.7,30.7,408.8,97.5,320,217,160.9,409.2,0,409.2,0S597.2,167.8,717,331c63,85.7,93,196.4,93,274,0,224.5-181.3,407-405,407S0,829.5,0,604.4Z"/>
</clipPath>
</defs>
</svg>
<img src="https://i.stack.imgur.com/zubYX.png" alt="" class="clipped-img">Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4742 次 |
| 最近记录: |