具有内联 SVG 的响应式剪辑路径
Responsive clip-path with inline SVG
在有背景的元素上(图像或纯色并不重要):
<header id="block-header"></header>
我正在尝试使用 SVG 应用剪辑路径。为此,我将 SVG 内嵌到同一个元素中,如下所示:
<header id="block-header">
…
<svg width="100%" height="100%" viewBox="0 0 4000 1696" preserveAspectRatio="none">
<defs>
<clipPath id="myClip">
<path d="M0 1568.18V0h4000v1568.18S3206.25 1696 2000 1696C984.37 1696 0 1568.18 0 1568.18z"/>
</clipPath>
</defs>
</svg>
…
</header>
您可以 运行 下面的代码片段或检查 JSFiddle。您可以看到原始 SVG 图像(黑色)内联,底部有曲线并且响应迅速。相反,红色矩形显示应用(或更确切地说,未应用)与 clip-path
.
相同的图像
我想我误解了 viewBox
或 preserveAspectRatio
属性,但在这里找不到确切的错误。任何帮助将不胜感激。
#block-header {
background: Red;
min-height: 100px;
-webkit-clip-path: url(#myClip);
clip-path: url(#myClip);
}
<h1>SVG image</h1>
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100" viewBox="0 0 4000 1696" preserveAspectRatio="none"><path d="M0 1568.18V0h4000v1568.18S3206.25 1696 2000 1696C984.37 1696 0 1568.18 0 1568.18z"/></svg>
<h1><code>clip-path</code> using the same SVG</h1>
<header id="block-header">
<svg width="100%" height="100" viewBox="0 0 4000 1696" preserveAspectRatio="none">
<defs>
<clipPath id="myClip">
<path d="M0 1568.18V0h4000v1568.18S3206.25 1696 2000 1696C984.37 1696 0 1568.18 0 1568.18z"/>
</clipPath>
</defs>
</svg>
</header>
对 SVG 裁剪路径的引用是对裁剪路径定义本身的引用,<svg>
的尺寸或其他属性在此上下文中没有意义。
您的示例中发生的情况是您将 4000 像素宽的剪辑路径应用于页眉。这可能只有 900 像素宽。所以曲率是不可见的。
如果您想要一个响应式剪辑路径,您应该使用 clipPathUnits="objectBoundingBox"
来定义它。
#block-header {
background: Red;
min-height: 100px;
-webkit-clip-path: url(#myClip);
clip-path: url(#myClip);
}
<h1>SVG image</h1>
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100" viewBox="0 0 1 1" preserveAspectRatio="none"><path d="M0,0 1,0 1,0.9 C 1,0.9, 0.77,1, 0.5,1 0.23,1, 0,0.9,0,0.9z"/></svg>
<h1><code>clip-path</code> using the same SVG</h1>
<header id="block-header">
<svg width="0" height="0">
<defs>
<clipPath id="myClip" clipPathUnits="objectBoundingBox">
<path d="M0,0 1,0 1,0.9 C 1,0.9, 0.77,1, 0.5,1 0.23,1, 0,0.9,0,0.9z"/>
</clipPath>
</defs>
</svg>
</header>
在有背景的元素上(图像或纯色并不重要):
<header id="block-header"></header>
我正在尝试使用 SVG 应用剪辑路径。为此,我将 SVG 内嵌到同一个元素中,如下所示:
<header id="block-header">
…
<svg width="100%" height="100%" viewBox="0 0 4000 1696" preserveAspectRatio="none">
<defs>
<clipPath id="myClip">
<path d="M0 1568.18V0h4000v1568.18S3206.25 1696 2000 1696C984.37 1696 0 1568.18 0 1568.18z"/>
</clipPath>
</defs>
</svg>
…
</header>
您可以 运行 下面的代码片段或检查 JSFiddle。您可以看到原始 SVG 图像(黑色)内联,底部有曲线并且响应迅速。相反,红色矩形显示应用(或更确切地说,未应用)与 clip-path
.
我想我误解了 viewBox
或 preserveAspectRatio
属性,但在这里找不到确切的错误。任何帮助将不胜感激。
#block-header {
background: Red;
min-height: 100px;
-webkit-clip-path: url(#myClip);
clip-path: url(#myClip);
}
<h1>SVG image</h1>
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100" viewBox="0 0 4000 1696" preserveAspectRatio="none"><path d="M0 1568.18V0h4000v1568.18S3206.25 1696 2000 1696C984.37 1696 0 1568.18 0 1568.18z"/></svg>
<h1><code>clip-path</code> using the same SVG</h1>
<header id="block-header">
<svg width="100%" height="100" viewBox="0 0 4000 1696" preserveAspectRatio="none">
<defs>
<clipPath id="myClip">
<path d="M0 1568.18V0h4000v1568.18S3206.25 1696 2000 1696C984.37 1696 0 1568.18 0 1568.18z"/>
</clipPath>
</defs>
</svg>
</header>
对 SVG 裁剪路径的引用是对裁剪路径定义本身的引用,<svg>
的尺寸或其他属性在此上下文中没有意义。
您的示例中发生的情况是您将 4000 像素宽的剪辑路径应用于页眉。这可能只有 900 像素宽。所以曲率是不可见的。
如果您想要一个响应式剪辑路径,您应该使用 clipPathUnits="objectBoundingBox"
来定义它。
#block-header {
background: Red;
min-height: 100px;
-webkit-clip-path: url(#myClip);
clip-path: url(#myClip);
}
<h1>SVG image</h1>
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100" viewBox="0 0 1 1" preserveAspectRatio="none"><path d="M0,0 1,0 1,0.9 C 1,0.9, 0.77,1, 0.5,1 0.23,1, 0,0.9,0,0.9z"/></svg>
<h1><code>clip-path</code> using the same SVG</h1>
<header id="block-header">
<svg width="0" height="0">
<defs>
<clipPath id="myClip" clipPathUnits="objectBoundingBox">
<path d="M0,0 1,0 1,0.9 C 1,0.9, 0.77,1, 0.5,1 0.23,1, 0,0.9,0,0.9z"/>
</clipPath>
</defs>
</svg>
</header>