我可以在不使用 id 的情况下向 svg 元素添加蒙版吗?

RMo*_*RMo 6 html javascript svg

我想将 svg-mask 分配给 svg-image。我可以使用面具上的 id 来完成这项工作,如下所示:

<svg id="svg1" width="5cm" height="5cm" viewBox="0 0 200 200"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
     <defs>
       <mask id="mask">
         <circle cx="100" cy="100" r="100" fill="white"></circle>
       </mask>   
     </defs>
     <rect x="0" y="0" width="200" height="200" fill="red" mask="url(#mask)"></rect>
</svg>
Run Code Online (Sandbox Code Playgroud)

但是我想多次加载这个 svg,并在 svg 标签中使用不同的 id。因此我将生成“#mask”-id 的重复项。使用多个 id 是无效代码。所以我想用一个类来引用合适的掩码。这意味着我无法使用mask=url()- 技术。

<svg id="svg2" width="5cm" height="5cm" viewBox="0 0 200 200"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
     <defs>
       <mask class="mask">
         <circle cx="100" cy="100" r="100" fill="white"></circle>
       </mask>   
     </defs>
     <rect x="0" y="0" width="200" height="200" fill="red" mask="url(can't use this)"></rect>
</svg>
Run Code Online (Sandbox Code Playgroud)

如果掩码具有类而不是 id,有没有办法将掩码应用于 rect 元素?也许使用 javaScript 或其他我没有想到的方式。

完整的故事/上下文: 我实际上正在使用 php 为 Joomla 制作一个 svg 图像滑块模块。该 php 生成一个包含 javascript、css 和 svg 的模块。我使用 javascript 为蒙版设置动画。我确实让它与唯一的 id 一起工作。我只是想知道是否有一种方法可以在不引用 id 的情况下将掩码分配给元素。我可能想这样做,因为我的代码读起来有点混乱,因为我必须在我的 javascript/svg 和 css 中为每个唯一的 id 使用一些 php。

Pau*_*eau 7

不可以。您只能通过 引用蒙版id。您不能以任何其他方式引用 SVG 蒙版。


ccp*_*rog 6

根据您的描述,我了解您有一个相同的图形实体,您想用不同的形式多次掩盖。把它写下来:

<!-- start with an invisible svg that only contains mask definitions -->
<svg width="0" height="0"
     xmlns="http://www.w3.org/2000/svg">
    <defs>
        <!-- first, you have a circular mask -->
       <mask id="circle-mask">
         <circle cx="100" cy="100" r="80" fill="white" />
       </mask>   
        <!-- then, you have a different mask, lets say a diamond -->
       <mask id="diamond-mask">
         <polygon points="100,20 180,100 100,180 20,100" fill="white" />
       </mask>   
     </defs>
</svg>

<!-- further into your document, you want to mask a rectangle -->
<svg id="svg1" width="5cm" height="5cm" viewBox="0 0 200 200"
     xmlns="http://www.w3.org/2000/svg">
     <!-- reference the circle mask -->
     <rect x="0" y="0" width="200" height="200" fill="red" mask="url(#circle-mask)" />
</svg>

<!-- with the circle again, as often as you want, nothing changes -->
<svg id="svg2" width="5cm" height="5cm" viewBox="0 0 200 200"
     xmlns="http://www.w3.org/2000/svg">
     <!-- the mask is the same, so no difference to above -->
     <rect x="0" y="0" width="200" height="200" fill="red" mask="url(#circle-mask)" />
</svg>

<!-- and now with the diamond; that one is different -->
<svg id="svg3" width="5cm" height="5cm" viewBox="0 0 200 200"
     xmlns="http://www.w3.org/2000/svg">
     <!-- if the mask changes, you need to change the reference -->
     <rect x="0" y="0" width="200" height="200" fill="red" mask="url(#diamond-mask)" />
</svg>
Run Code Online (Sandbox Code Playgroud)

您还可以在样式表中引用蒙版,并根据蒙版形状为引用元素指定一个类:

.masked.circular rect {
    mask: url(#circle-mask);
}
.masked.diamond rect {
    mask: url(#diamond-mask);
}
Run Code Online (Sandbox Code Playgroud)
<svg width="0" height="0"
     xmlns="http://www.w3.org/2000/svg">
    <defs>
       <mask id="circle-mask">
         <circle cx="100" cy="100" r="80" fill="white" />
       </mask>   
       <mask id="diamond-mask">
         <polygon points="100,20 180,100 100,180 20,100" fill="white" />
       </mask>   
     </defs>
</svg>

<svg id="svg1" class="masked circular" width="5cm" height="5cm" viewBox="0 0 200 200"
     xmlns="http://www.w3.org/2000/svg">
     <rect x="0" y="0" width="200" height="200" fill="red" />
</svg>

<svg id="svg2" class="masked circular" width="5cm" height="5cm" viewBox="0 0 200 200"
     xmlns="http://www.w3.org/2000/svg">
     <rect x="0" y="0" width="200" height="200" fill="red" />
</svg>

<svg id="svg1" class="masked diamond" width="5cm" height="5cm" viewBox="0 0 200 200"
     xmlns="http://www.w3.org/2000/svg">
     <rect x="0" y="0" width="200" height="200" fill="red" />
</svg>
Run Code Online (Sandbox Code Playgroud)