当前位置: 首页 > 面试题库 >

内联SVG的响应式剪切路径

汪鸿波
2023-03-14
问题内容

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

<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的尺寸或其他属性<svg>在此上下文中没有意义。

在您的示例中发生的情况是,您将4000 px宽的剪切路径应用于标题。大概只有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>


 类似资料:
  • HTML5 支持内联 SVG。SVG Sorry, your browser does not support inline SVG. 什么是SVG? SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用于定义用于网络的基于矢量的图形 SVG 使用 XML 格式定义图形 SVG 图像在放大或改变尺寸的情况下其图形质量不会有损失 SVG 是万维网联盟的标准 SV

  • 是否可以在CSS中使用内联SVG定义? 我的意思是:

  • 问题内容: 据我所知,正如许多文章和本教程CSSMasking中所展示的那样,剪贴路径应该在IE中也可以使用 但是我无法让以下内容在IE上正常运行,但在Chrome上运行正常。 问题答案: 经过更深入的研究,当直接使用图像时,IE仅支持clip像矩形一样,但不支持clipPath复杂形状。 我的解决方案是将图像添加到SVG中,如下所示,这一次它可以在Chrome和IE9 +中使用。

  • 问题内容: 请执行以下操作: 与以下内容相比对性能有任何影响: 问题答案: 从文档的 性能: 用样式对象制作样式表可以通过ID引用它,而不必每次都创建一个新的样式对象。 它还仅允许通过桥发送一次样式。所有后续使用都将引用一个ID(尚未实现)。 另一个好处是样式错误将在编译时而不是运行时生成。 我个人仍然喜欢使用内联样式(并为共享样式创建新的组件),因为它使代码对我而言更具可读性,并且对性能的影响并

  • 我希望能够使用css或jquery对svg的各个部分/路径进行样式化/更改 经过一番搜索,我意识到用svg-xml无法做到这一点(不使用额外的js/jQuery脚本或其他脚本) 所以现在我将讨论内联svg 完整的标签应该是什么样子的?我是说正确的标记 这就是我所拥有的: null null 我甚至需要所有版本=“1.1”xmlns=“http://www.w3.org/2000/svg”xmlns

  • 我正在尝试创建一个按钮的六边形边框。我的策略是使容器元素比按钮大几个像素,并在两个元素上使用相同的。大小上的差异应该会产生一种边框效果。这在Firefox和Chrome中运行良好,但在Safari中不行。 如果没有,Safari中的边框是一个矩形。添加后,得到的六边形的宽度比其他浏览器中的要大得多。看来剪辑路径覆盖的按钮比它应该覆盖的要多得多。有什么方法可以解决这个问题,使它在Safari中运行良