创建响应式 SVG 剪辑路径 / 使 SVG <path> 响应式

Ron*_*Ron 3 svg clip-path

我正在尝试使用 SVG 元素创建响应式 SVG 剪辑路径<path>。但是,我无法使其正常工作。

我已经使用更基本的形状(例如 )让它工作<circle>,但不是<path>元素。我还让它使用元素的静态尺寸来工作<path>

我使用此处的说明作为参考:https://www.smashingmagazine.com/2015/05/creating-responsive-shapes-with-clip-path/。我还在 StackOverflow 和其他示例上查看了类似的问题,但它们主要处理基本形状而不是路径变量。

我使用的 SVG 形状是从 Adob​​e 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响应是必要的。然而,一旦我添加这个,剪切的图像就会消失。

我认为我哪里做错了

我怀疑路径元素指定的路径不是相对单位,但我不知道如何将单位更改为相对单位。


预先感谢所有回复!

ccp*_*rog 7

这个答案扭曲了剪辑路径的形状,使其始终跨越整个图像,无论其纵横比如何。

使用 时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)