CSS剪切路径定位问题

Ste*_*ide 5 css svg css3 css-shapes clip-path

我使用SVG元素创建了一个相当简单的形状,然后使用将该元素放入CSS中clip-path。它应该使拐角对我来说是圆的,但是由于某些原因,只有一个拐角可以完美地实现效果。

这是形状:

<svg height="500" width="500">

  <path fill="#555555" d="M50,0 L450,0 Q500,0 500,50 L500,400 Q500,450 450,450 L200,450 L175,500 L150,450 L50,450 Q0,450 0,400 L0,50 Q0,0 50,0z" />

</svg>
Run Code Online (Sandbox Code Playgroud)

这是当我将其用作 clip-path

body {
  background: #555;
}
img {
  clip-path: url(#svgPath);
  -webkit-clip-path: url(#svgPath);
}
Run Code Online (Sandbox Code Playgroud)
<svg height="0" width="0">
  <defs>
    <clipPath id="svgPath">
      <path fill="#FFFFFF" d="M50,0 L450,0 Q500,0 500,50 L500,400 Q500,450 450,450 L200,450 L175,500 L150,450 L50,450 Q0,450 0,400 L0,50 Q0,0 50,0z" />
    </clipPath>
  </defs>
</svg>

<img src="http://lorempixel.com/500/500/" />
Run Code Online (Sandbox Code Playgroud)

在FireFox中,它似乎可以完美工作,但显示在Chrome中,除右下角外,角落未正确切割。

Har*_*rry 5

is默认单位clip-pathuserSpaceOnUse,这似乎是参考根元素计算路径的坐标。这就是为什么它clip-path似乎产生不正确的输出的原因。取消根元素上的marginpadding或绝对定位元素(如下面的代码段所示)应该可以解决问题。

body {
  background: #555;
}
img {
  position: absolute;
  top: 0px;
  left: 0px;
  clip-path: url(#svgPath);
  -webkit-clip-path: url(#svgPath);
}
Run Code Online (Sandbox Code Playgroud)
<svg height="0" width="0">
  <defs>
    <clipPath id="svgPath">
      <path fill="#FFFFFF" d="M50,0 L450,0 Q500,0 500,50 L500,400 Q500,450 450,450 L200,450 L175,500 L150,450 L50,450 Q0,450 0,400 L0,50 Q0,0 50,0z" />
    </clipPath>
  </defs>
</svg>

<img src="http://lorempixel.com/500/500/" />
Run Code Online (Sandbox Code Playgroud)


但是,在现实生活中,必须剪裁的实际元素可能会出现在身体内的任何地方,因此我认为使用objectBoundingBoxs 作为单位是一种更好的方法,如下面的代码片段所示:

body {
  background: #555;
}
img {
  clip-path: url(#svgPath);
  -webkit-clip-path: url(#svgPath);
}
Run Code Online (Sandbox Code Playgroud)
<svg height="0" width="0">
  <defs>
    <clipPath id="svgPath" clipPathUnits="objectBoundingBox">
      <path fill="#FFFFFF" d="M0.1,0 L0.9,0 Q1,0 1,0.1 L1,0.8 Q1,0.9 0.9,0.9 L0.4,0.9 L0.35,1 L0.3,0.9 L0.1,0.9 Q0,0.9 0,0.8 L0,0.1 Q0,0 0.1,0z" />
    </clipPath>
  </defs>
</svg>

<img src="http://lorempixel.com/500/500/" />
Run Code Online (Sandbox Code Playgroud)


正如问题本身所提到的,由于我不知道的原因,此行为仅在 Chrome 中可见,而在 Firefox 中不可见。即使 (a) 向正文添加了额外的 padding + margin 并且 (b) 当图像本身被包裹在另一个也有 padding + margin 的容器中时,Firefox 也会产生与预期类似的输出。

Firefox 的输出与 Chrome 匹配的唯一情况padding是将 a 直接添加到img标签本身。我相信这padding是因为它是元素的一部分,因此会影响坐标。