2017-05-28 8 views
0

雲:たsetInterval、x位置の相対性理論

<g id="clouds" > 
     <ellipse x="0" y="0" cx="100" cy="100" rx="30" ry="20" fill="white"/> 
     <ellipse x="0" y="0" cx="120" cy="80" rx="30" ry="20" fill="white"/> 
     <ellipse x="0" y="0" cx="130" cy="110" rx="30" ry="20" fill="white"/> 
     <ellipse x="0" y="0" cx="160" cy="100" rx="30" ry="20" fill="white"/> 
     <animateTransform attributeName="transform" 
         attributeType="XML" 
         type="translate" 
         from="0,0" 
         to="6000,0" 
         dur="30s" 
         repeatCount="indefinite"/> 
    </g> 

そして、以下では、JavaScriptです:

私はそれを呼んでいる方法
var svg = document.getElementsByTagName('svg')[0]; 
    var xlinkns = "http://www.w3.org/1999/xlink"; 
     function loadClouds(){ 
     setInterval(function(){ 
      var y = (Math.random()*1000)+200; 
      var use = document.createElementNS("http://www.w3.org/2000/svg", 'use'); 
      use.setAttributeNS(xlinkns, "href", "#clouds"); 
      use.setAttribute("transform", "scale(0.2,0.2)"); 
      use.setAttribute("x", 0); 
      use.setAttribute("y", y); 
      svg.appendChild(use); 
     }, 1000); 
    } 

//Clouds 
<script type="text/javascript"><![CDATA[ 
    loadClouds(); 
]]></script> 

毎回Aクラウドが作成されたときは、0から始まるのではなく、以前に作成したクラウドのxを開始点として使用しています。

+0

暗闇の中でちょうど一発ですが、svgではxとyの大文字と小文字は区別されませんか? xの代わりにXを設定してみてください。 – Zenoo

+0

g要素は現在の変換状況に相対的に配置されています。 –

答えて

1

時々少しトリッキーなことが、何あなたが必要とすることは、おそらく

anim.beginElement(); 

あるかもしれない「使用」。ここで働いている例:

var svg = document.getElementsByTagName('svg')[0]; 
 
    var xlinkns = "http://www.w3.org/1999/xlink"; 
 
     function loadClouds(){ 
 
      var t0 = Date.now() 
 
     setInterval(function(){ 
 
      var t = Date.now()-t0; 
 
      var y = Math.floor((Math.random()*1000))-100; 
 
      var use = document.createElementNS("http://www.w3.org/2000/svg", 'use'); 
 
      use.setAttributeNS(xlinkns, "href", "#clouds"); 
 
      //use.setAttribute("transform", ""); 
 
      use.setAttribute("transform", "scale(0.2,0.2)"); 
 
      
 
      use.setAttribute("x",0); 
 
      //use.setAttribute("x", t*-0.2); 
 
      use.setAttribute("y", y); 
 
      //use.transform.animVal[0].matrix.a = Math.random() 
 
      
 
      var anim = svg.ownerDocument.createElementNS("http://www.w3.org/2000/svg", 'animateTransform'); 
 
      anim.setAttributeNS(null,'attributeName','transform') 
 
      anim.setAttributeNS(null,'attributeType','XML') 
 
      anim.setAttributeNS(null,'type','translate') 
 
      anim.setAttributeNS(null,'from',"0 0") 
 
      anim.setAttributeNS(null,'to',"6000 0") 
 
      anim.setAttributeNS(null,'dur',"30s") 
 
      anim.setAttributeNS(null,'additive','sum') 
 
      anim.setAttributeNS(null,'repeatCount',"indefinite") 
 
      use.appendChild(anim); 
 
      svg.appendChild(use); 
 
      anim.beginElement(); 
 

 
     }, 1000); 
 
    } 
 

 
loadClouds();
body { 
 
    background: blue 
 
}
<svg> 
 
    <g id="clouds"> 
 
     <ellipse x="0" y="0" cx="100" cy="100" rx="30" ry="20" fill="white"/> 
 
     <ellipse x="0" y="0" cx="120" cy="80" rx="30" ry="20" fill="white"/> 
 
     <ellipse x="0" y="0" cx="130" cy="110" rx="30" ry="20" fill="white"/> 
 
     <ellipse x="0" y="0" cx="160" cy="100" rx="30" ry="20" fill="white"/> 
 
     
 
    </g> 
 
</svg>

確かに、そこに行うには多くのだが、それはあなたが前進に役立つはずです。

+0

ありがとうございました!それは今、そのような小さな詳細..働いている – PampaZiya

関連する問題