Динамически добавлять фильтр в SVG

#javascript #html #svg

#javascript #HTML #svg

Вопрос:

У меня есть следующее встроенное изображение SVG на веб-странице:

 const svg = document.getElementById('svg');
const filter = document.createElementNS('http://www.w3.org/2000/svg', 'filter');
filter.setAttribute('id', 'image');
filter.setAttribute('x', '0%');
filter.setAttribute('y', '0%');
filter.setAttribute('width', '100%');
filter.setAttribute('height', '100%');
const feImage = document.createElementNS('http://www.w3.org/2000/svg', 'feImage');
feImage.setAttribute('xlink:href', 'http://lorempixel.com/100/100/');
filter.appendChild(feImage);
svg.querySelector('defs').appendChild(filter);
svg.querySelector('circle').setAttribute('filter', 'url(#image)');  
 <svg width="200" height="200" viewBox="0 0 200 200" id="svg">
<defs></defs>
<circle cx="100" cy="100" r="50" fill="none" stroke-width="2" stroke="gray"></circle>
</svg>  

Теперь я хотел бы динамически добавить фильтр изображения в этот svg, а затем применить фильтр к кругу. Но что происходит, так это то, что круг становится невидимым, фильтр не работает.

Когда я добавляю фильтр в жестко закодированный svg, все работает просто отлично:

 <svg width="200" height="200" viewBox="0 0 200 200" id="svg">
        <defs>
            <filter id="image" x="0%" y="0%" width="100%" height="100%">
                <feImage xlink:href="http://lorempixel.com/100/100/"></feImage>
            </filter>
        </defs>
        <circle cx="100" cy="100" r="50" fill="none" stroke-width="2" stroke="gray" filter="url(#image)"></circle>
</svg>  

Мой вопрос в том, почему это не работает?

Ответ №1:

Вам нужно использовать: document.createElementNS(…) для элементов svg и в данном случае setAttributeNS(…) также;

Например, изменить:

  const filter = document.createElement('filter');
  

Для

  const filter = document.createElementNS('http://www.w3.org/2000/svg', 'filter');
  

Дополнительно изменить:

 feImage.setAttribute('xlink:href', 'http://lorempixel.com/100/100/');
  

Для

 feImage.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', 'http://lorempixel.com/100/100/');
  

скрипка

Комментарии:

1. Спасибо, Филипп, ты прав насчет этого. Но я уже пробовал это, и это не решило возникшую у меня проблему.