TL; DR:我需要根據另一個現有矩形的大小和位置屏蔽掉SVG中的一個矩形的一部分,該矩形將動態更改。一個Chrome瀏覽器問題阻止了我試過的mask
+ use
方法。 如何根據現有形狀製作遮罩或倒轉剪輯路徑?如果存在媒體查詢,則SVG掩碼不起作用
全面概述: 我使用D3.js,我現在用的是brush
控制毛筆嵌入SVG添加到一個矩形。默認情況下,這會爲SVG添加一些額外的元素,其中包括一個rect
類別extent
,它顯示刷新區域的大小。
而不是像在大多數D3的例子中那樣將畫筆範圍渲染爲矩形頂部的半透明疊加層,我試圖從半透明疊加層中「切出」範圍,以便畫筆區域顯示下面的真實顏色。根據this question,我正在嘗試使用mask
元素來執行此操作,其中子元素引用了該區域的use
元素。隨着一些D3的魔術,我現在有這樣的結構:
<svg width="100" height="100">
<g class="brush-layer inverted">
<defs>
<mask id="mask835">
<rect fill="#fff" width="100%" height="100%"></rect>
<use fill="#000" xlink:href="#extent848"></use>
</mask>
</defs>
<g class="brush" style="pointer-events: none;">
<rect class="overlay" mask="url(#mask835)" width="100%" height="17"></rect>
<rect class="extent" x="30" width="52" height="17" id="extent848"></rect>
</g>
</g>
</svg>
這很好...有點。事實證明,似乎有一個棘手的Chrome bug,其中I've filed here,如果在CSS中有@media
查詢,將阻止應用掩碼。您可以看到working version here和failing version here(在Chrome中失敗,在FF中工作)。
我需要這個在Chrome中工作,並且不能刪除@media
查詢。我還需要使use
元素工作,因爲D3會自動調整extent
矩形的大小,這就是我需要掩蓋的形狀。
那麼,我怎麼能屏蔽掉一個rect
的一部分,基於另一個rect
,而無需使用上面的mask
+ use
策略?
這裏的問題是,在混合的某個地方,我幾乎必須有一個'