Na atualização, melhoro a implementação do filtro.
Primeira abordagem
Na primeira implementação, criei dois elementos filter
com os seguintes id
s:
distorion-filter
, que usava os elementosfeTurbulence
efeDisplacementMap
para criar o efeito de desenho irregularblur-filter
, que usava o elementofeGaussianBlur
para adicionar um pouco de desfoque
Com os elementos filter
definidos, os apliquei em dois elementos g
aninhados para aplicar um filtro em cima do outro:
Omiti alguns elementos e atributos para manter o código conciso.
<svg> <defs> <filter id="distortion-filter"> <feTurbulence /> <feDisplacementMap /> </filter> <filter id="blur-filter"> <feGaussianBlur /> </filter> <!-- elementos `path` --> </defs> <!-- elemento `rect` --> <g filter="url(#blur-filter)"> <g filter="url(#distortion-filter)"> <!-- elementos `use` --> </g> </g></svg>
Esta abordagem funcionou, mas existe uma forma mais correta e que apresenta um desempenho melhor.
Atributos result
, in
e in2
Utilizei os atributos result
, in
e in2
na abordagem anterior, passando o resultado do elemento feTurbulence
para a entrada do elemento feDisplacementMap
.
Da mesma forma, desta vez usei o resultado do elemento feDisplacementMap
como entrada do elemento feGaussianBlur
, usando os atributos result
e in
, respectivamente.
Assim, eliminei a necessidade de dois elementos filter
, e de dois elementos g
aninhados:
Omiti alguns elementos e atributos para manter o código conciso.
<svg> <defs> <filter id="distortion-filter"> <feTurbulence type="turbulence" baseFrequency="1" numOctaves="2" seed="0" result="turbulence" > <!-- elemento `animate` --> </feTurbulence> <feDisplacementMap in="SourceGraphic" in2="turbulence" scale="0.3" result="displacement-map" /> <feGaussianBlur in="displacement-map" stdDeviation="0.06" /> </filter> <!-- elementos `path` --> </defs> <!-- elemento `rect` --> <g filter="url(#distortion-filter)"> <!-- elementos `use` --> </g></svg>
Resultado
Com essa pequena mudança, melhorei a fluidez da animação no Safari:
Primeira abordagem
Segunda abordagem