【问题标题】:Responsive clip-path with inline SVG带有内联 SVG 的响应式剪辑路径
【发布时间】:2015-04-03 09:44:47
【问题描述】:

在有背景的元素上(图像或纯色并不重要):

<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>

您可以运行下面的代码 sn-p 或查看JSFiddle。您可以看到内嵌的原始 SVG 图像(黑色),底部有曲线并且反应灵敏。相比之下,红色矩形显示与clip-path 相同的应用(或者更确切地说,未应用)的图像。

我想我误解了viewBoxpreserveAspectRatio 属性,但在这里找不到确切的问题。任何帮助将不胜感激。

#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>

【问题讨论】:

    标签: css svg responsive-design clip-path


    【解决方案1】:

    对 SVG 剪辑路径的引用指的是剪辑路径定义本身,&lt;svg&gt; 的尺寸或其他属性在此上下文中毫无意义。

    您的示例中发生的情况是您将 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>    

    Fiddle here

    【讨论】:

    • 圆形、多边形等都可以正常工作。我怀疑你正在做的是使用太大的值。使用 clipPathUnits="objectBoundingBox" 时,坐标应在 0..1 范围内。将它们视为边界框的百分比。 (0,0) 是元素的左上角,(1,1) 是元素的右下角。
    • 但是,如何将d="M0 1568.18V0h4000v1568.18S3206.25 1696 2000 1696C984.37 1696 0 1568.18 0 1568.18z" 转换为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"?谢谢!
    • 您通过 viewBox 缩放原始剪辑坐标。所以 1568/1696 ~= 0.9 等等。但是,我的剪辑路径只是原始路径的近似值。不准确。
    • 这里有一个出色的脚本可以转换此数据:stackoverflow.com/a/29509756/842768
    • 我找到了这个在线工具,您可以在其中输入路径坐标,它会将其转换为 objectBoundingBox 所需的基于分数/小数的系统 - yoksel.github.io/relative-clip-path
    猜你喜欢
    • 2020-08-22
    • 2019-05-06
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多