如何将 SVG 剪辑路径调整为与图像大小相同

How to resize SVG clip-path to be same size as image

我在调整我的 svg 剪辑路径大小以适应图像大小时遇到​​了一些问题。

我有这样的代码:

<svg id="image-svg" class="clip">
     <img class="main-img" src="http://25.media.tumblr.com/tumblr_m5nre6cxkQ1qbs7p5o1_r1_500.jpg" alt="" />
</svg>
<svg class="clip">
     <clipPath id="clipPolygon">
          <polygon points="52 0,100 45,50 100,0 50">
          </polygon>
     </clipPath>
</svg>

然后我像这样使用 css:

#image-svg {
  left:0;
  top:0;
}
.main-img {
  clip-path: url('#clipPolygon');
  width:90%;
}

一切正常,除了剪辑路径比图像本身小得多。如何解决这个问题?这是我的作品 fiddle:

https://jsfiddle.net/7egbccpw/

一种解决方案是直接使用 CSS 指定路径并使用 % 作为值

.main-img {
  clip-path: polygon(50% 0%, 100% 45%, 50% 100%, 0 50%);
}
<img class="main-img" src="https://lorempixel.com/200/200/" alt="" />
<img class="main-img" src="https://lorempixel.com/100/100/" alt="" />
<img class="main-img" src="https://lorempixel.com/50/50/" alt="" />

首先,您的示例已损坏,因为 SVG 中没有 <img> 元素。您需要 <image> 元素。

#image-svg {
  left:0;
  top:0;
}
.main-img {
  clip-path: url('#clipPolygon');
  width:90%;
}
<svg id="image-svg" class="clip">
  <image class="main-img" xlink:href="http://25.media.tumblr.com/tumblr_m5nre6cxkQ1qbs7p5o1_r1_500.jpg" alt="" />
</svg>

<svg class="clip">
  <clipPath id="clipPolygon">
    <polygon points="52 0,100 45,50 100,0 50"></polygon>
  </clipPath>
</svg>

现在我假设您的意思是您希望剪辑路径自动适合图像大小。否则我猜你会把剪辑路径坐标变大。

在 SVG 中执行此操作的方法是使用 objectBoundingBox 坐标。当 objectBoundingBox 坐标模式生效时,坐标会按比例缩放,以便 (0,0) 表示目标元素的左上角,(1,1) 表示目标元素的右下角。在这种情况下,目标元素是图像。

要将此模式用于剪辑路径,您需要设置clipPathUnits="objectBoundingBox"。然后你只需要缩放你所有的多边形坐标值,使它们在 0 和 1 之间。

#image-svg {
  width: 500px;
  height: 500px;
}
.main-img {
  clip-path: url('#clipPolygon');
  width:90%;
  height: 90%;
}
<svg id="image-svg" class="clip">
  <image class="main-img" xlink:href="http://25.media.tumblr.com/tumblr_m5nre6cxkQ1qbs7p5o1_r1_500.jpg" alt="" />
</svg>

<svg class="clip">
  <clipPath id="clipPolygon" clipPathUnits="objectBoundingBox">
    <polygon points="0.52 0 1 0.45 0.5 1 0 0.5"></polygon>
  </clipPath>
</svg>