Я использую SVG для диаграмм в веб-приложении AJAX.Когда начальные данные получены, я хотел бы анимировать элементы диаграммы (такие как столбцы) от значений по умолчанию 0 до нового значения данных.Если пользователь выбирает новый набор данных, я запрашиваю новые данные с сервера, а затем хотел бы анимировать полосу от предыдущего значения к новому значению.
<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>
Каждый раз, когда данные получены, я устанавливаю *Атрибуты 1004 * и to
и вызов beginElement()
.
Если я установил fill="remove"
в анимации SVG, то панель корректно анимируется каждый раз при загрузке нового набора данных, но, конечно, между анимациямиbar возвращается к ширине по умолчанию.
Установка width.baseVal.value
для установки нового базового значения до или после вызова beginElement()
вызывает очень неприятное мерцание.
Поэтому я попытался использовать fill="freeze"
длясделайте так, чтобы полоса сохраняла свою ширину в конце каждой анимации.Проблема в том, что первая анимация работает, но каждый последующий вызов beginElement()
немедленно возвращает полосу к ширине по умолчанию, и анимация перестает работать.
Я тестирую в Chrome 12.0.Вот пример, чтобы увидеть, как анимация прерывается при использовании стоп-кадра.
http://jsfiddle.net/4ws9W/
<!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>
Как я могу анимировать ширину бара, сделать так, чтобы он сохранял новую ширину, а затем многократно анимироватьэто к новым значениям по мере их поступления?