2015-01-03 3 views
0

내 코드 왼쪽으로 모양을 이동, 2 초 동안 페이드와 반복 모든 일초 이후업데이트 SVG 애니메이션

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="636px" height="155px" version="1.1"> 
 
\t <g id="canvas" transform="translate(0.5,0.5)"> \t \t 
 
\t </g> 
 
</svg> 
 

 
<script language="javascript"> 
 

 
\t var svgNS = "http://www.w3.org/2000/svg"; 
 
\t var canvas = document.querySelector('#canvas'); 
 
\t function svgElement(name, attributes) { 
 
\t \t var element = document.createElementNS(svgNS, name); //to create a circle, for rectangle use rectangle 
 
\t \t for (key in attributes) 
 
\t \t \t element.setAttribute(key, attributes[key]); 
 
\t \t return canvas.appendChild(element); 
 
\t } 
 
\t function render() { 
 
\t \t while (canvas.firstChild) canvas.removeChild(canvas.firstChild); 
 
\t \t svgElement('rect', {x:x, y:"20", width:"100",height:"100",style:"fill:blue"}) 
 
\t } 
 
\t var x = 100 
 
\t render() 
 
\t var wait = 0 
 
\t function clock() { 
 
\t \t if (wait > 0) { 
 
\t \t \t wait -= 1 
 
\t \t \t if (wait == 0) 
 
\t \t \t \t x = 100 
 
\t \t } else { 
 
\t \t \t x -= 10 
 
\t \t \t if (x < 1) { 
 
\t \t \t \t svgElement('animate', {attributeType:"CSS", attributeName:"opacity", from:1, to:0, dur:"2s", fill:"freeze"}) 
 
\t \t \t \t wait = 30 
 
\t \t \t } else 
 
\t \t \t \t render() 
 
\t \t } 
 
\t \t 
 
\t } 
 
\t 
 
\t setInterval(clock, 100) 
 
</script>

문제 페이딩 불투명도가 두 번째 즉각적인 때문이다 되풀이. 사각형이 즉시 사라집니다.

답변

0

첫 번째 애니메이션을 추가하고 계속할 때 실행을 시작하는 애니메이션 타임 라인이 있습니다. 따라서 첫 번째 애니메이션은 시간 0에서 실행됩니다.

이후 애니메이션의 경우 타임 라인이 0 시간 이후 (즉 시작이 지정되지 않음)부터 시작되므로 즉시 발생합니다.

  • 하나의 솔루션 (아래 참조)은 애니메이션 타임 라인을 재설정하는 것입니다.

  • 다른 하나는 애니메이션의 올바른 시작 값을 계산하는 것입니다. 예를 들어 canvas.parentNode.getCurrentTime을 호출하여 얻을 수 있습니다.

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="636px" height="155px" version="1.1"> 
 
\t <g id="canvas" transform="translate(0.5,0.5)"> \t \t 
 
\t </g> 
 
</svg> 
 

 
<script language="javascript"> 
 

 
\t var svgNS = "http://www.w3.org/2000/svg"; 
 
\t var canvas = document.querySelector('#canvas'); 
 
\t function svgElement(name, attributes) { 
 
\t \t var element = document.createElementNS(svgNS, name); //to create a circle, for rectangle use rectangle 
 
\t \t for (key in attributes) 
 
\t \t \t element.setAttribute(key, attributes[key]); 
 
\t \t return canvas.appendChild(element); 
 
\t } 
 
\t function render() { 
 
\t \t while (canvas.firstChild) canvas.removeChild(canvas.firstChild); 
 
\t \t svgElement('rect', {x:x, y:"20", width:"100",height:"100",style:"fill:blue"}) 
 
\t } 
 
\t var x = 100 
 
    var begin = 0 
 
\t render() 
 
\t var wait = 0 
 
\t function clock() { 
 
\t \t if (wait > 0) { 
 
\t \t \t wait -= 1 
 
\t \t \t if (wait == 0) 
 
\t \t \t \t x = 100 
 
\t \t } else { 
 
\t \t \t x -= 10 
 
\t \t \t if (x < 1) { 
 
\t \t \t \t svgElement('animate', {attributeType:"CSS", attributeName:"opacity", from:1, to:0, dur:"2s", fill:"freeze", begin:begin}) 
 
\t \t \t \t wait = 30 
 
\t \t \t \t canvas.parentNode.setCurrentTime(0); 
 
\t \t \t } else 
 
\t \t \t \t render() 
 
\t \t } 
 
\t \t 
 
\t } 
 
\t 
 
\t setInterval(clock, 100) 
 
</script>