CSS Clip-path定位问题

标签 css svg css-shapes clip-path

我使用 SVG 元素创建了一个相当简单的形状,然后使用 clip-path 将其放入我的 CSS 中。它应该使 Angular 变圆,但出于某种原因,只有一个 Angular 可以完美地达到效果。

这是形状:

<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="https://dummyimage.com/500" />

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

最佳答案

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


然而,在现实生活场景中,必须被剪裁的实际元素可能出现在 body 的任何地方,因此我认为使用 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="https://dummyimage.com/500" />


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

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

关于CSS Clip-path定位问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32603812/

相关文章:

css - 选择正文中的最后一个 iFrame

html - 如何使 float 页面 div 响应

javascript - Angular SVG 指令意外标记

javascript - d3.js强制布局增加linkDistance

css - 带尖边和阴影的按钮

javascript - 自定义material-ui弹出窗口

javascript - 什么是 CSS :before, 的最佳降级:在较旧的 IE 中伪造之后

javascript - 内存中的 HTML 元素和插入到 DOM 后的显示问题

javascript - 如何为柱形图赋予动态颜色

html - 将图像放置在具有响应宽度和高度的另一图像的中央