JavaScript основанный на манипуляциях с градиентом SVG в IE9 - PullRequest
2 голосов
/ 10 ноября 2011

У меня есть файл SVG, в котором указан градиент и круг, как показано ниже. Встроенный скрипт переключает ориентацию градиента onClick (), который работает во всех текущих браузерах, кроме IE9. Я подозреваю, что IE не перерисовывает градиент. Я попытался сделать несколько вещей, например, сначала установить заливку в сплошной цвет, а затем переназначить (измененный) градиент, чтобы вызвать перерисовку, но пока без кубиков. Мой вопрос: кто-нибудь знает, как я могу обойти эту проблему или, что еще лучше, решить ее? Спасибо.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="70" width="190">
<script type="text/javascript">
  <![CDATA[
    function flipGrad(evt) {
      var g=document.getElementById('grad1');
      var y1 = g.getAttribute('y1');
      var y2 = g.getAttribute('y2');
      g.setAttribute('y2', y1);
      g.setAttribute('y1', y2);
    }
   ]]>
  </script>
  <defs>
    <linearGradient id="grad1" x1="0%" y1="0%" x2="0%" y2="100%">
      <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>
  </defs>
  <circle cx="30" cy="30" r="20" stroke="black" stroke-width="2" fill="url(#grad1)" onclick="flipGrad(evt)" />
</svg>

EDIT:

Редактирование остановок помогает, так что это может стать работоспособным. Правда, мой фактический файл больше похож на следующий, который представляет собой вывод Inkscape svg, где градиенты разбиты на цветовые секции и геометрические секции, и только геометрия связана с объектом и объектом, но цвет повторно используется во многих других градиентах. Подход к обмену остановок будет влиять на все объекты, связанные с этим градиентом цвета:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="70" width="190">
<script type="text/javascript">
  <![CDATA[
    function flipGrad(evt) {
      // var g=document.getElementById('gradGeometry');
      // var y1 = g.getAttribute('y1');
      // var y2 = g.getAttribute('y2');
      // g.setAttribute('y2', y1);
      // g.setAttribute('y1', y2);\
      var s1=document.getElementById('stop1');
      var s2=document.getElementById('stop2');
      var s1s = s1.getAttribute('style');
      var s2s = s2.getAttribute('style');
      s1.setAttribute('style', s2s);
      s2.setAttribute('style', s1s);
    }
   ]]>
  </script>
  <defs>
    <linearGradient id="gradColour">
      <stop id="stop1" offset="0%" style="stop-color:rgb(255,255,0);stop-opacity:1" />
      <stop id="stop2" offset="100%" style="stop-color:rgb(255,0,0);stop-opacity:1" />
    </linearGradient>
    <linearGradient id="gradGeometry1" x1="0%" y1="0%" x2="0%" y2="100%" xlink:href="#gradColour" />
    <linearGradient id="gradGeometry2" x1="0%" y1="0%" x2="100%" y2="0%" xlink:href="#gradColour" />
  </defs>
  <circle cx="30" cy="30" r="20" stroke="black" stroke-width="2" fill="url(#gradGeometry1)" onclick="flipGrad(evt)" />
  <circle cx="90" cy="30" r="20" stroke="black" stroke-width="2" fill="url(#gradGeometry2)" onclick="flipGrad(evt)" />
</svg>

1 Ответ

0 голосов
/ 11 ноября 2011

После небольшого тестирования IE9 кажется, что вектор градиента неизменен после определения в IE. Ваш единственный выбор - использовать id'd градиентные остановки, которые являются изменяемыми.

<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="70" width="190">
<script type="text/javascript">
  <![CDATA[
    function flipGrad(evt) { 
      var s1=document.getElementById('stop1');
      var s2=document.getElementById('stop2');
      var s1s = s1.getAttribute('style');
      var s2s = s2.getAttribute('style');
      s1.setAttribute('style', s2s);
      s2.setAttribute('style', s1s);
    }
   ]]>
  </script>
  <defs>
      <linearGradient id="grad1" x1="0%" y1="0%" x2="0%" y2="100%">
        <stop id="stop1" offset="0%" style="stop-color:rgb(255,255,0);stop-opacity:1" />
        <stop id="stop2" offset="100%" style="stop-color:rgb(255,0,0);stop-opacity:1" />
    </linearGradient>
  </defs>

  <circle id="bubble" cx="30" cy="30" r="20" stroke="black" stroke-width="2" fill="url(#grad1)" onclick="flipGrad(evt)" />
</svg>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...