使用HTML和CSS的SVG剪辑路径存在问题

使用HTML和CSS的SVG剪辑路径存在问题,html,css,svg,clip,Html,Css,Svg,Clip,我一直试图理解如何将SVG片段路径应用于HTML元素,但遇到了一些奇怪的问题 这是小提琴: 需要注意的几点: 内联剪辑路径css声明仅适用于Chrome和Opera 相对尺寸为50%的SVG似乎根本不适用于任何浏览器 具有绝对尺寸的SVG仅在Firefox中有效 请注意,第二和第三个元素在Chrome和Opera中完全消失。现在,看看这把小提琴: 一个在Firefox中正常工作,但在Chrome和Opera中,10px的边距移动了底层元素,但没有移动剪辑。SVG clipPath维度似乎作为一个

我一直试图理解如何将SVG片段路径应用于HTML元素,但遇到了一些奇怪的问题

这是小提琴:

需要注意的几点:

内联剪辑路径css声明仅适用于Chrome和Opera

相对尺寸为50%的SVG似乎根本不适用于任何浏览器

具有绝对尺寸的SVG仅在Firefox中有效

请注意,第二和第三个元素在Chrome和Opera中完全消失。现在,看看这把小提琴:

一个在Firefox中正常工作,但在Chrome和Opera中,10px的边距移动了底层元素,但没有移动剪辑。SVG clipPath维度似乎作为一个整体应用于文档,而不是所讨论的元素

毫不奇怪,这两种小提琴在IE10中都不起作用。我在IE10中见过SVG的工作原理,所以可能唯一的问题是SVG和HTML的混合?不确定

还要注意的是,两者都不适用于Safari

我的实现错了吗?有没有合适的方法将SVG片段路径与我缺少的HTML元素混合使用?

诀窍是使用clipPathUnits=objectBoundingBox并将点修改为边界框的比例

此方法创建相对剪辑路径,并在Safari中使用

请参见以下内容:

诀窍是使用clipPathUnits=objectBoundingBox并将点修改为边界框的比率

此方法创建相对剪辑路径,并在Safari中使用


请参见以下内容:

将clipPathUnits=objectBoundingBox添加到剪辑路径就是解决方案。但是,如果同一页面中有多个菱形,safari 6.1版似乎只显示第一个,其余的则按预期chrome和firefox显示所有菱形。

将clipPathUnits=objectBoundingBox添加到剪辑路径是解决方案。但是,如果同一页面中有几个方块,safari 6.1版似乎只显示第一个方块,而其他的chrome和firefox则按预期显示所有方块。

我不确定它是否会回答您的问题,但我的替代解决方案不是将百分比分配给剪辑路径,而是使用svg标记的viewBox属性

这里有一个简单的例子:

<svg viewBox='0 0 100 8' style="width: 100%;">
    <defs>
        <clipPath id="clippy">
            <rect x="${normalizedValue}" y="0" width="2" height="8" />
        </clipPath>
    </defs>
    <rect x="0" y="0" width="100" height="8" fill="red" clip-path="url(#clippy)" />
</svg>
使用css宽度:100%我定义了一个svg,它有一个与主容器一样宽的条,同时使用viewBox我将它定义为一个内部大小为100x8的矩形

您可以注意到,在svg中,所有内容都是相对于viewBox绘制的${normalizedValue}是一个变量,在我的例子中,它包含一个介于1和100之间的数字,没有“px”或“%”,只是一个数字,因此我不必考虑大小


也许这种方法可以帮助您,您只需使用css和viewbox创建许多大小相同的svg,就可以轻松保持相同的比例。

我不确定它是否会回答您的问题,但我的替代解决方案是使用svg标记的viewbox属性,而不是为剪辑路径指定百分比

这里有一个简单的例子:

<svg viewBox='0 0 100 8' style="width: 100%;">
    <defs>
        <clipPath id="clippy">
            <rect x="${normalizedValue}" y="0" width="2" height="8" />
        </clipPath>
    </defs>
    <rect x="0" y="0" width="100" height="8" fill="red" clip-path="url(#clippy)" />
</svg>
使用css宽度:100%我定义了一个svg,它有一个与主容器一样宽的条,同时使用viewBox我将它定义为一个内部大小为100x8的矩形

您可以注意到,在svg中,所有内容都是相对于viewBox绘制的${normalizedValue}是一个变量,在我的例子中,它包含一个介于1和100之间的数字,没有“px”或“%”,只是一个数字,因此我不必考虑大小


也许这种方法可以帮助您,您只需使用css和viewbox创建许多大小相同的SVG,就可以轻松保持相同的比例。

其他人注意到,尽管这种小提琴效果很好,但如果您尝试在一个页面中放置两个剪辑图像,在webkit浏览器中会失败吗?有人注意到,虽然这个提琴效果很好,但如果你试图在一个页面中放置两个剪辑过的图像,它在webkit浏览器中会失败吗?一张图片被剪掉了,其余的就消失了。
<svg viewBox='0 0 100 8' style="width: 100%;">
    <defs>
        <clipPath id="clippy">
            <rect x="${normalizedValue}" y="0" width="2" height="8" />
        </clipPath>
    </defs>
    <rect x="0" y="0" width="100" height="8" fill="red" clip-path="url(#clippy)" />
</svg>