我如何“裁剪” svg 以适应父母的形状?

Posted

技术标签:

【中文标题】我如何“裁剪” svg 以适应父母的形状?【英文标题】:How can i "crop" the svg to fit the shape of the parent? 【发布时间】:2021-12-17 07:34:06 【问题描述】:

如何“裁剪” svg 过滤器以适应父级的形状?

现在我有一个 div 作为一个圆圈,里面有一个 svg。但是 svg 过滤器会创建一个矩形。

编辑:我尝试按照下面的建议实现一个带有border-radius:100% 的包装div,但随后它消除了模糊。

original codepen

updated codepen with wrapping div

svg
  width:100%; 
  height: 100%;  


.custom-cursor 
  border-radius: 50%;
  overflow: hidden; 
  width: 20px;
  height: 20px;
    background-image: conic-gradient( cyan, magenta, yellow, cyan); 
  filter: blur(5px) url("#blur-plus-grain");
<div class="custom-cursor">
  <svg preserveAspectRatio="none">
    <filter id="blur-plus-grain">
      <feGaussianBlur stdDeviation="0.8" result="blur" />
      <feTurbulence type="fractalNoise" numOctaves="26" baseFrequency="40" stitchTiles="stitch" result="grain" />
      <feComposite operator="in" in="blur" in2="grain" />
    </filter>
    <circle fill="transparent" r="10" cx="50%" cy="50%" filter="url(#blur-plus-grain)" />
  </svg>

</div>

【问题讨论】:

您好,我查看了您的代码笔并将 div 尺寸设置为 200px,看看发生了什么更好。整个事情是圆形的。然后我删除了似乎没有任何区别的 SVG。你能描述更多问题是什么吗?可能是在 20 像素的尺寸下,您会获得边缘效果 - 没有多少像素可以使物体看起来很圆。 【参考方案1】:

您将 svg 噪声模糊过滤器应用于圆形渐变填充的 div。 但是仍然有一个 css 框上下文。

您实际上需要一些填充来提供足够的“画布”区域。 否则任何类型的模糊都可能超出 div 元素的边界:

* 
  box-sizing: border-box;


svg 
  width: 100%;
  height: 100%;


.custom-cursor-clip 
  width: 50px;
  height: 50px;
  padding:2%;
  filter: url("#blur-plus-grain");

.custom-cursor 
  width: 100%;
  height: 100%;
  border-radius: 100%;
  background-image: conic-gradient(from 20deg, #003399, #74b4da, #e0bbd9);
<div class="custom-cursor-clip">
  <div class="custom-cursor">
    <svg preserveAspectRatio="none">
      <filter id="blur-plus-grain">
        <feGaussianBlur stdDeviation="4" result="blur" />
        <feTurbulence type="fractalNoise" numOctaves="26" baseFrequency="40" stitchTiles="stitch" result="grain" />
        <feComposite operator="in" in="blur" in2="grain" />
      </filter>
    </svg>
  </div>
</div>

编辑: 本质上,您将圆锥渐变应用于内部 div。 wrapping/outer div 提供了一些填充以及 svg-filter。

编辑 2:

您还可以使用 &lt;foreignObject&gt; 元素来获得更独立的 svg img 资产:

    <svg    viewBox="0 0 100 100">
      <style>
        .conicGradient
          width: 100%;
          height: 100%;
          border-radius: 100%;
          background-image: conic-gradient(from 20deg, #003399, #74b4da, #e0bbd9);
        
      </style>
      <filter id="blur-plus-grain" filterUnits="userSpaceOnUse" >
        <feGaussianBlur stdDeviation="4" result="blur" />
        <feTurbulence type="fractalNoise" numOctaves="26" baseFrequency="40" stitchTiles="stitch" result="grain" />
        <feComposite operator="in" in="blur" in2="grain" />
      </filter>  
      <foreignObject filter="url(#blur-plus-grain)" 
      x="10" y="10"  >
        <div class="conicGradient" xmlns="http://www.w3.org/1999/xhtml" ></div>
      </foreignObject>
    </svg>

但是,您仍然需要某种填充/内部偏移来防止意外裁剪。

【讨论】:

非常感谢您对我的帮助。更新了代码笔。但是,使用此解决方案,边缘上的模糊消失了。 =( 在我的浏览器(Chrome/Win10)中看起来不错。 @Emma Andersson:我添加了另一个示例代码,可能更适合。

以上是关于我如何“裁剪” svg 以适应父母的形状?的主要内容,如果未能解决你的问题,请参考以下文章

根据父母的边界半径裁剪孩子

如何将 SVG 剪辑到笔划内部?

自定义图像裁剪器android

如何裁剪任意形状的纹理?

如何将 SVG 转换为 SHP(形状文件)格式? [关闭]

在android中以不规则形状裁剪图像无法正常工作