Разница между тегами <object> и <use> выявляет ошибку chrome/safari

В chrome есть известная ошибка, которая не поддерживает внешнюю ссылку url() должным образом, она может ссылаться только на идентификаторы в одном и том же файле: ошибка chrome. Это известная проблема в Chrome с начала 2012 года. Есть некоторые признаки недавнего интереса, чтобы исправить это.

Safari демонстрирует такое же поведение, поэтому, вероятно, имеет ту же ошибку. Firefox не имеет ошибки.

Я столкнулся с этой проблемой по более тонкому пути, поэтому я документирую это здесь на случай, если другие столкнутся с этим, или, может быть, я неправильно понял, что происходит, и в этом случае, пожалуйста, прокомментируйте.

Вы можете увидеть код, запущенный здесь: plnkr (для демонстрации проблемы нужен внешний файл, который я не знаю, как это сделать в инструменте stackru). Запустите его в Chrome, чтобы увидеть проблему (красный круг обводки имеет градиентную заливку, синий обводка - нет). Запустите его в Firefox, и оба круга будут заполнены градиентом.

Два файла воспроизводятся ниже. Они должны быть отдельными файлами, чтобы раскрыть ошибку.

Index.html:

<body>

  <object width="200" height="200" data="test.svg"></object>

  <svg width="200" height="200" viewBox="0 0 200 200">
    <use stroke="blue" stroke-width="4"  xlink:href="test.svg#my-circle"/>
  </svg>


</body>

Test.svg:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 
  <defs>
    <linearGradient id="SVGID_1_" x1="0%" y1="0%" x2="100%" y2="0%">
      <stop offset="0%" style="stop-color:rgb(255,255,0);stop-opacity:1" />
      <stop offset="100%" style="stop-color:rgb(255,0,0);stop-opacity:1" />
    </linearGradient> 

   <g id='my-circle'>
   <circle cx="50" cy="50" r="40" fill="url(#SVGID_1_)" />
   </g>
  </defs>

  <use stroke="red" stroke-width="2"  xlink:href="#my-circle"/>
<!--
  -->
</svg>

Два круга созданы с градиентной заливкой. Оба экземпляра создаются из index.html. Круги определены в test.svg. Внутри test.svg есть внутренняя ссылка fill: url(#gradient). Который, на первый взгляд, должен работать на хром. Действительно, он работает, когда создается экземпляр круга с помощью тега "object", но не работает, когда создается экземпляр с помощью тега "use". Я полагаю, что причина этой разницы заключается в разнице между тем, как эти двое создают свой контент. Я думаю, что "объект" создает свой отдельный мир, в котором работает test.svg. Однако "use" клонирует кружок в родительский html-файл. Таким образом, при использовании 'use' последующая ссылка на градиент с помощью метода url() фактически является из index.html в test.svg, т.е. является внешней ссылкой, которая является известной проблемой.

0 ответов

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