Я пытаюсь «объединить» две маски в SVG и применить их таким образом, чтобы белая часть обеих масок была видна в форме, к которой я ее применяю.
Я читал, что решение может быть feComposite, но не могу заставить его работать... Вот что у меня есть:
<svg width = "200" height = "200" xmlns = "http://www.w3.org/2000/svg">
<defs>
<mask id = "mask1" x = "0" y = "0" width = "200" height = "200">
<rect x = "0" y = "0" width = "200" height = "200" fill = "black"/>
<rect x = "0" y = "0" width = "100" height = "100" fill = "white"/>
</mask>
<mask id = "mask2" x = "0" y = "0" width = "200" height = "200">
<rect x = "0" y = "0" width = "200" height = "200" fill = "black"/>
<rect x = "100" y = "100" width = "100" height = "100" fill = "white"/>
</mask>
<filter id = "combinedMask">
<feComposite in = "mask1" in2 = "mask2" operator = "over"/>
</filter>
</defs>
<rect x = "0" y = "0" width = "200" height = "200" fill = "red" mask = "url(#combinedMask)"/>
</svg
Желаемый результат в приведенном выше случае будет таким: выход
Вы не можете использовать ссылку на идентификатор снаружи фильтра непосредственно в качестве «входа» внутри фильтра SVG. Вы можете использовать только SourceGraphic, SourceAlpha или ссылку на предыдущий «result = " в том же фильтре. Если вы хотите использовать идентификатор, вам необходимо сначала импортировать его в фильтр, используя «feImage», и feImage не примет маску AFAIK.



Вы можете объединить две маски в одну маску.
<svg width = "200" height = "200" xmlns = "http://www.w3.org/2000/svg">
<defs>
<mask id = "mask1" x = "0" y = "0" width = "200" height = "200">
<rect x = "0" y = "0" width = "100" height = "100" fill = "white"/>
</mask>
<mask id = "mask2" x = "0" y = "0" width = "200" height = "200">
<rect x = "100" y = "100" width = "100" height = "100" fill = "white"/>
</mask>
<mask id = "combinedMask" x = "0" y = "0" width = "200" height = "200">
<rect width = "200" height = "200" fill = "white" mask = "url(#mask1)"/>
<rect width = "200" height = "200" fill = "white" mask = "url(#mask2)"/>
</mask>
</defs>
<rect x = "0" y = "0" width = "200" height = "200" fill = "red" mask = "url(#combinedMask)"/>
</svg>
Код вашего примера, вероятно, упрощен. Однако, если вам не нужна полупрозрачность или маскирование, связанное с обводкой, попробуйте
<clipPath>, поскольку обычно это быстрее, чем маска (введение контекста рендеринга rgba — особенно в браузерах Webkit вы можете увидеть необычные результаты, такие как размытый рендеринг при масштабировании). webkit имеет тенденцию отображать замаскированные элементы только один раз с фиксированным разрешением). См. пример кода