2014-07-23 11 views
5

Mamy po prostu kod, który działa cross-browser:SVG defs używać relacji pomiędzy różnymi postaciami Firefox

<html> 
<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<svg xmlns="http://www.w3.org/2000/svg" 
xmlns:xlink="http://www.w3.org/1999/xlink" 
width="200" height="100"> 

    <circle id="circ" cx="120" cy="40" 
    r="30" fill="green"/> 

    <rect id="rect" x="10" y="10" 
    width="60" height="60" fill="blue"> 
     <set attributeName="fill-opacity" to="0.5" 
     begin="circ.mouseover" end="circ.mouseout"/> 
    </rect> 
</svg> 

Kiedy próbuję użyć elementów w DEFS zablokować Tracę relacja między dwoma prostokołami w przeglądarce Firefox.

<html> 
<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<svg xmlns="http://www.w3.org/2000/svg" 
xmlns:xlink="http://www.w3.org/1999/xlink" 
width="200" height="100"> 
    <defs> 
     <circle id="circ" cx="120" cy="40" 
     r="30" fill="green"/> 

     <rect id="rect" x="10" y="10" 
     width="60" height="60" fill="blue"> 
      <set attributeName="fill-opacity" to="0.5" 
      begin="circ.mouseover" end="circ.mouseout"/> 
     </rect> 
    </defs> 

    <use id="use_circ.rectangles" xlink:href="#circ" /> 
    <use id="use_rect.rectangles" xlink:href="#rect" /> 
</svg> 

Czytałem coś o stosunku tutaj http://www.petercollingridge.co.uk/data-visualisation/mouseover-effects-svgs? - właściwie to słowa

„Należy pamiętać, że efekt ten nie działa w Firefox Firefox 6 i wcześniej (chyba), który jest chyba największą wadą tej metody.”

muszę nacisnąć przycisk, aby przesunąć (zmienić) inny element. Próbowałem też zrobić coś takiego, aby ustawić efekt zależnością:

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Button</title> 

    <script type="text/javascript" language="javascript"> 
     function turn_right(button, miliSec) 
     { 
      document.getElementById("circ_left_position").setAttribute('visibility','hidden'); 

      setTimeout(function() { 
       button.parentNode.setAttribute('xlink:href','#rect.right_position'); 
      }, miliSec); 

      document.getElementById("circ_right_position").setAttribute('visibility','visible '); 
     } 
     function turn_left(button, miliSec) 
     { 
      document.getElementById("circ_right_position").setAttribute('visibility','hidden '); 

      setTimeout(function() { 
       button.parentNode.setAttribute('xlink:href','#rect.left_position'); 
      }, miliSec); 

      document.getElementById("circ_left_position").setAttribute('visibility','visible '); 
     } 
    </script> 
</head> 

<body style="margin:0; border:0"> 
    <?xml version="1.0" encoding="UTF-8" standalone="no"?> 
    <svg xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    width="200" height="100"> 

     <defs> 
      <g id="rect.left_position" onclick="turn_right(this,500)"> 
       <rect x="10" y="10" width="60" height="60" fill="blue"/> 

       <circle id="circ_left_position" cx="120" cy="40" r="30" fill="green"/> 

       <animateTransform id="trigger1" begin="click" 
       attributeName="transform" type="rotate" additive="replace" 
       from="0 70 70" to="10 70 70" dur="0.5s" fill="freeze" /> 
      </g> 

      <g id="rect.right_position" onclick="turn_left(this,500)"> 
       <rect x="10" y="10" width="60" height="60" fill="blue" transform="rotate(10 70 70)"/> 
       <circle id="circ_right_position" cx="120" cy="40" r="30" fill="green"/> 

       <animateTransform id="trigger1" begin="click" 
       attributeName="transform" type="rotate" additive="replace" 
       from="0 70 70" to="-10 70 70" dur="0.5s" fill="freeze" /> 
      </g> 
     </defs> 

     <use id="positions.rectangles" xlink:href="#rect.left_position" /> 

    </svg> 
</body> 

W Chrome i FF możemy uzyskać różne rezultaty. Dalej, nie rozumiem różnicy w przeglądarkach. Jestem pewien, że istnieje proste rozwiązanie.

+2

SMIL nie działa zbyt dobrze z '' elementami Firefoksa Obawiam się. –

+0

Czy próbowałeś użyć biblioteki takiej jak Snap.svg do animacji zamiast animacji SMIL? Obsługa animacji SMIL nie jest tak dobra, jak powinna być teraz. – arrow

Odpowiedz

0

Zastosowanie nie kopiuje animacji nie jest to oczekiwane zachowanie w SVG 1.1 (nie jest to kwestia firefox)

Smil w SVG 2 zajmie to.

Możesz użyć skryptów do sklonowania każdej animacji i dołączenia ich do znacznika use. Być może w przypadku zdarzenia onload. Wierzę jednak, że to nie zadziała dla twojego określonego zestawu kodów, ponieważ podaj identyfikator.