Как объединить маски SVG?

Я пытаюсь «объединить» две маски в 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

Желаемый результат в приведенном выше случае будет таким: выход

Код вашего примера, вероятно, упрощен. Однако, если вам не нужна полупрозрачность или маскирование, связанное с обводкой, попробуйте <clipPath>, поскольку обычно это быстрее, чем маска (введение контекста рендеринга rgba — особенно в браузерах Webkit вы можете увидеть необычные результаты, такие как размытый рендеринг при масштабировании). webkit имеет тенденцию отображать замаскированные элементы только один раз с фиксированным разрешением). См. пример кода

herrstrietzel 08.05.2024 02:55

Вы не можете использовать ссылку на идентификатор снаружи фильтра непосредственно в качестве «входа» внутри фильтра SVG. Вы можете использовать только SourceGraphic, SourceAlpha или ссылку на предыдущий «result = " в том же фильтре. Если вы хотите использовать идентификатор, вам необходимо сначала импортировать его в фильтр, используя «feImage», и feImage не примет маску AFAIK.

Michael Mullany 23.05.2024 17:27
Создание фильтров для вашего сайта
Создание фильтров для вашего сайта
Фильтры - удобный инструмент в арсенале веб-дизайнера. Они позволяют изменять элементы на странице с помощью всего нескольких строк кода. Эти...
Анимация SVG-узоров без единой строки CSS
Анимация SVG-узоров без единой строки CSS
Недавно я работал над веб-проектом, который позволил мне поэкспериментировать с шаблонами SVG. С SVG очень приятно работать, как только вы получите...
Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
Как использовать d3.js для рисования 2D SVG-элементов в приложении Angular?
D3.js - это обширная библиотека, используемая для привязки произвольных данных к объектной модели документа (DOM). Мы разберем основные варианты...
0
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете объединить две маски в одну маску.

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

Другие вопросы по теме