Как использовать feComposite, когда вход не является частью объекта фильтра?
<svg>
<style>
#ani{
stroke-dasharray: var(--len);
stroke-dashoffset: var(--len);
}
#shadow{
filter:url(#Blur);/*omit*/
}
<style>
<script>
document.onclick=()=>{
document.getElementById("ani").atyle="stroke-dashoffset: 0;"
}
</script>
<path id="ani" d="..." />
<line id="shadow" x1y1... /><!--overlapped-->
</svg>
Упрощенная версия кода показана выше. Я хочу, чтобы тень появлялась только тогда, когда элемент #ani перекрывает ее, но если я использую feComposite на #shadow, я не могу указать другой его ввод.
Свободный перевод вопроса How to use feComposite when an input is not a part of the object of the filter? от участника @凌世雍.
Ответы (1 шт):
Автор решения: Alexandr_TT
→ Ссылка
Вам нужно будет импортировать "ani" path в ваш фильтр, используя feImage и идентификатор фрагмента. (Если вы хотите, чтобы это работало и в Firefox, вам придется преобразовать путь в полный встроенный SVG внутри feImage. Вы можете узнать, как это сделать отдельно.)
<svg width="800px" height="600px">
<defs>
<filter id="overlap-shadow" filterUnits="userSpaceOnUse" >
<feImage xlink:href="#ani-path" x="0" y="0" result="imported-ani"/>
<feComposite operator="in" in="SourceGraphic" in2="imported-ani" result="overlap"/>
<feGaussianBlur stdDeviation="4" in="overlap" result="blurred-overlap"/>
<feComposite operator="over" in="blurred-overlap" in2="SourceGraphic"/>
</filter>
</defs>
<line filter="url(#overlap-shadow)" x1="50" x2="400" y1="50" y2="50" stroke="red" stroke-width="5"/>
<path id="ani-path" d="M 0 0 L 100 50 h 100 L 300 150" stroke="black" stroke-width="5" fill="none"/>
</svg>
Свободный перевод ответа от участника @Michael Mullany.