如何通过 CSS clip-path 属性 将 SVG clipPath 与 Pattern 一起使用?

How to use SVG clipPath with Pattern via CSS clip-path property?

初始SVG图同pattern

<svg width="200" height="200" viewBox="0 0 100 100">
  <defs>
    <pattern id="img-dotted-dots" x="0" y="0" height=".08" width="7.69%">
      <circle cx="2" cy="2" fill="white" r="0.8"></circle>
    </pattern>
    <mask id="img-dotted-mask">
      <rect width="100" height="100" fill="url(#img-dotted-dots)"></rect>
    </mask>
  </defs>
  <path d="M0 0 H 100 V 100 H 0 Z" mask="url(#img-dotted-mask)" fill="#1063B1"></path>
</svg>

需要达到:

SVG 图的一个实例,其中 pattern 用于引用 CSS 作为 clip-path

我尝试创建 SVG clipPath 元素并绑定到 CSS clip-path这样

.figure {
  width: 300px;
  height: 300px;
  clip-path: url(#img-dotted-clip-path);
  background-color: #1063B1;
}
<div class="figure"></div>

<svg width="0" height="0" viewBox="0 0 100 100">
  <defs>
    <clipPath
      clipPathUnits="objectBoundingBox"
      id="img-dotted-clip-path"> 
        <pattern
        patternUnits="objectBoundingBox"
        patternContentUnits="objectBoundingBox"
        x="0" y="0" height="0.1" width="0.1">
        <circle cx="0" cy="0" fill="white" r="0.5"></circle>
      </pattern>
    </clipPath>
  </defs>
</svg>

没有任何反应。 预期结果 - 与前面的代码片段相同。

比较:

如果我使用 SVG rect - CSS clip-path 有效。 如果 pattern - 没有

.figure {
  width: 300px;
  height: 300px;
  clip-path: url(#img-dotted-clip-path);
  background-color: #1063B1;
}
<div class="figure"></div>

<svg width="0" height="0" viewBox="0 0 100 100">
  <defs>
    <clipPath
      clipPathUnits="objectBoundingBox"
      id="img-dotted-clip-path"> 
        <rect width="1" height="1"></rect>
    </clipPath>
  </defs>
</svg>

您可以使用遮罩结合径向渐变重新创建相同的东西

.figure {
  width: 300px;
  height: 300px;
  background:linear-gradient(to right,red,#1063B1);  
                          /*radius here                           size here*/
  -webkit-mask:radial-gradient(3px, #fff 97%,transparent 100%) 0 0/20px 20px;
          mask:radial-gradient(3px, #fff 97%,transparent 100%) 0 0/20px 20px;
}


body {
  background:#f2f2f2;
}
<div class="figure"></div>

或者考虑掩码内的 SVG 属性。确保转义 # 并正确设置视图框和 width/height 以获得完美的重复

.figure {
  width: 300px;
  height: 300px;
  background:linear-gradient(to right,red,#1063B1);  
  -webkit-mask:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="200" height="192" viewBox="0 0 100 90"><defs><pattern id="img-dotted-dots" x="0" y="0" height=".08" width="7.69%"><circle cx="2" cy="2" fill="white" r="0.8"></circle></pattern><mask id="img-dotted-mask"><rect width="100" height="100" fill="url(%23img-dotted-dots)"></rect></mask></defs><path d="M0 0 H 100 V 100 H 0 Z" mask="url(%23img-dotted-mask)" fill="%231063B1"></path></svg>');
          mask:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="200" height="192" viewBox="0 0 100 90"><defs><pattern id="img-dotted-dots" x="0" y="0" height=".08" width="7.69%"><circle cx="2" cy="2" fill="white" r="0.8"></circle></pattern><mask id="img-dotted-mask"><rect width="100" height="100" fill="url(%23img-dotted-dots)"></rect></mask></defs><path d="M0 0 H 100 V 100 H 0 Z" mask="url(%23img-dotted-mask)" fill="%231063B1"></path></svg>');
}


body {
  background:#f2f2f2;
}
<div class="figure"></div>

剪辑路径中唯一有效的是:

  • 形状元素(‘圆’、‘椭圆’、‘线’、‘路径’、‘多边形’、‘折线’、‘矩形’)
  • ‘文字’
  • ‘使用’

此外,您还可以使用动画元素等为剪辑路径设置动画。但是,仅使用了这些元素的形状。图案、过滤器等效果将被忽略。

获得想要的剪切路径效果的唯一方法是向 <clipPath>.

添加大量 <circle> 元素
<clipPath>
   <circle>
   <circle>
   <circle>
   <circle>
   ... etc ...
</clipPath>

但你可以改用面具。面具允许模式。

.figure {
  width: 300px;
  height: 300px;
  -webkit-mask: url(#img-dotted-mask);
          mask: url(#img-dotted-mask);
  background-color: #1063B1;
}
<p>This only works in Firefox</p>

<div class="figure"></div>

<svg width="0" height="0">
  <defs>
    <pattern id="img-dotted-pattern"
      viewBox="0 0 1 1"
      patternUnits="userSpaceOnUse" x="0" y="0" width="20" height="20">
      <rect width="1" height="1" fill="black"/>
      <circle cx="0.5" cy="0.5" fill="white" r="0.15"></circle>
    </pattern>

    <mask id="img-dotted-mask">
      <rect width="2000" height="2000" fill="url(#img-dotted-pattern)"/>
    </mask>
  </defs>
</svg>

但是 inline 应用于 HTML 元素的 SVG 掩码,如我上面的示例,仅适用于 Firefox。要使 SVG 掩码在 Chrome 中工作,您需要将 maskmask-image 与外部或数据 URL 一起使用(正如 Temani 在他们的回答中所做的那样)。