私はAJAX WebアプリケーションのチャートにSVGを使用しています。最初のデータが受信されると、デフォルトの0値から新しいデータ値にチャート要素(バーなど)をアニメートしたいと思います。ユーザーが新しいデータセットを選択すると、サーバーから新しいデータを要求し、バーを以前の値から新しい値にアニメートしたいと思います。fill = "freeze"を使用してSVGアニメーションの値を動的に変更
<rect x="0" y="0" width="1px" height="20px" fill="red">
<animate id="anim" attributeName="width" attributeType="XML"
begin="indefinite" from="0" to="100px" dur="0.8s" fill="remove"/>
</rect>
データが受信されるたびに、私はfrom
とto
属性を設定し、beginElement()
を呼び出します。
SVGアニメーションでfill="remove"
を設定すると、新しいデータセットがロードされるたびにバーが正しくアニメーションされますが、アニメーションの間はバーがデフォルトの幅に戻ります。
beginElement()
を呼び出した後、ORの前に新しい値を設定するようにwidth.baseVal.value
を設定すると、非常に厄介なちらつきが発生します。
私はfill="freeze"
を使って、各アニメーションの最後にバーの幅を保たせてみました。問題は、最初のアニメーションが機能しますが、その後にbeginElement()
を呼び出すたびにバーがデフォルトの幅に戻り、アニメーションが停止します。
私はChrome 12.0でテストしています。フリーズ使用時にアニメーションがどのように壊れているかを見てみましょう。
<!DOCTYPE html>
<html>
<head><title>Test SVG animation</title></head>
<body>
<svg width="200px" height="20px" xmlns="http://www.w3.org/2000/svg" version="1.1">
<rect x="0" y="10px" width="200px" height="2px"/>
<rect x="0" y="0" width="1px" height="20px" fill="red">
<animate id="anim" attributeName="width" attributeType="XML" begin="indefinite" from="0" to="100px" dur="1.3s" fill="freeze"/>
</rect>
parent.anim = document.getElementById('anim');
</svg>
<br/>
<a href="javascript:anim.beginElement();">anim.beginElement();</a>
<br/>
<a href="javascript:anim.endElement();">anim.endElement();</a>
<br/>
<br/>
<a href="javascript:anim.setAttribute('to', '50px');">anim.setAttribute('to', '50px');</a>
<br/>
<a href="javascript:anim.setAttribute('to', '150px');">anim.setAttribute('to', '150px');</a>
<br/>
<br/>
<a href="javascript:anim.setAttribute('fill', 'remove');">anim.setAttribute('fill', 'remove');</a>
<br/>
<a href="javascript:anim.setAttribute('fill', 'freeze');">anim.setAttribute('fill', 'freeze');</a>
<br/>
</body>
</html>
どのように私はそれが新しい幅を維持した後、繰り返し、彼らが到着すると、新しい値にそれをアニメーション化する必要があり、バーの幅をアニメーション化することができますか?
解決方法をお探しですか?私はfill = freezeを使用して色の変化をアニメートするのと同様の問題を抱えています。 – ssawchenko