CSS剪辑路径定位问题

时间:2015-09-16 08:50:55

标签: css css3 svg css-shapes clip-path

我使用SVG元素创建了一个相当简单的形状,然后使用clip-path将其放入我的CSS中。它应该让我的角落圆润,但由于某种原因,只有一个角落能够完美地完成效果。

这是形状:

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

当我将其用作clip-path

时会发生这种情况

body {
  background: #555;
}
img {
  clip-path: url(#svgPath);
  -webkit-clip-path: url(#svgPath);
}
<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/" />

它似乎在FireFox中完美运行,但显示除了右下角之外,Chrome中的角落没有正确切割。

1 个答案:

答案 0 :(得分:3)

default units for the clip-path is userSpaceOnUse这似乎是根据根元素计算路径的坐标。这就是clip-path似乎产生错误输出的原因。在根元素上取消marginpadding或者绝对定位元素(如下面的代码段)应该可以解决问题。

body {
  background: #555;
}
img {
  position: absolute;
  top: 0px;
  left: 0px;
  clip-path: url(#svgPath);
  -webkit-clip-path: url(#svgPath);
}
<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/" />

然而,在现实生活场景中,必须被剪裁的实际元素可以存在于身体内的任何位置,因此我认为使用objectBoundingBox作为下面的单位是一种更好的方法片段:

body {
  background: #555;
}
img {
  clip-path: url(#svgPath);
  -webkit-clip-path: url(#svgPath);
}
<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/" />

正如问题本身所述,此行为仅在Chrome中可见,而不是Firefox,原因我不知道。 Firefox产生类似于预期的输出,即使(a)向主体添加额外的填充+边距和(b)当图像本身被包裹在另一个也具有填充+边距的容器内时。

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