【问题标题】:Can I add a mask to an svg-element without using an id?我可以在不使用 id 的情况下向 svg 元素添加掩码吗?
【发布时间】:2017-12-03 22:53:26
【问题描述】:

我想将 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>

但是我想多次加载这个 svg,在 svg-tag 中使用不同的 id。因此,我将生成“#mask”-id 的副本。使用多个 id 是无效代码。所以我想用一个类来引用适当的掩码。这意味着我不能使用mask=url()-technique。

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

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

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

【问题讨论】:

  • 掩码总是一样的吗?如果是这样,请单独加载一次。或者为每个生成并使用不同的 id(例如,从 svg 元素派生)
  • @jcaron 不,掩码并不总是相同的。它们有时可能相同,但并非总是如此。目前我正在使用不同的 id-approach。但我想我可能更愿意将它称为只更改整个 svg 中的一个 id。

标签: javascript html svg


【解决方案1】:

没有。您只能通过id 引用掩码。您不能以任何其他方式引用 SVG 掩码。

【讨论】:

  • 我担心会是这样。我会等一个星期左右接受答案,以防有人突然出现一个奇迹解决方案:p。如果我忘记了 xD,请随时提醒我。
  • 不会有奇迹般的解决方案。您可以通过阅读SVG spec 自行验证这一点。 :)
【解决方案2】:

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

<!-- 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>

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

.masked.circular rect {
    mask: url(#circle-mask);
}
.masked.diamond rect {
    mask: url(#diamond-mask);
}
<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>

【讨论】:

  • 这对我不起作用。我想我应该在问题中提供更多上下文(我试图让问题尽可能简单)。我将情况添加到问题中。谢谢你试图回答强硬;)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 2020-04-22
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多