Не присваиваются правильные значения атрибутов.
Вот код:
<html>
<head>
<script>
//--------------------------- ANIMATION ----------------------------//
function animate(opts) {
var el = opts.el || false;
var start = new Date;
var delta = opts.delta || linear;
var from = opts.from || 0;
var to = opts.to || 0;
if(el){ clearInterval(opts.el.timer);
opts.el.timer = setInterval(function() {
var progress = (new Date - start) / opts.duration;
if (progress > 1) progress = 1;
opts.step( delta(progress),from,to );
if (progress == 1) {
clearInterval(opts.el.timer);
opts.complete && opts.complete();
}
}, opts.delay || 20);}
}
function back(progress) {
var x = 2.9;
return Math.pow(progress, 2) * ((x + 1) * progress - x)
}
function makeEaseOut(delta) {
return function(progress) {
return 1 - delta(1 - progress)
}
}
//--------------------------- ANIMATION ----------------------------//
</script>
</head>
<body>
<div style="height:400px; background:#ccc;">
<svg height="400" width="800" style="background:#fff;">
<circle id="white" cx="400" cy="200" r="1" fill="#66bad6" />
</svg>
<script>
var div = document.getElementById("white");
var roundM = Math.round(div.getAttribute('r'));
setTimeout(function(){
animate({
el : div,
duration: 1400,
delta: makeEaseOut(back),
step: function(delta) {
//анимированная смена радиуса
div.setAttribute('r',delta*(90-(Math.round(roundM*100)/100))+(Math.round(roundM*100)/100));
}
});
}, 100);
setTimeout(function(){alert("roundM="+roundM);}, 1500); //вывод изначального значения, вместо текущего
</script>
</div>
</body>
</html>
проблема такова… я меняю анимацией параметр, круга (радиус). Объект увеличивается…. после чего мне нужно получить его текущее значение и делать другие манипуляции… но почему-то выводится значение изначальное. |
Цитата:
|
В алерт надо засунуть вот это
var roundM = Math.round(div.getAttribute('r')); Кстати, а точно SVG надо анимировать вот таким колхозным способом? По-моему там недостижимые для колхозов индустриальные методы встроены. Я как-то почитал немного и хватило - везде стоит amimate, animate, animate - похоже там нет ничего что не анимате. |
Цитата:
Слева колхоз, справа по-научному:
<html>
<head>
<script>
//--------------------------- ANIMATION ----------------------------//
function animate(opts) {
var el = opts.el || false;
var start = new Date;
var delta = opts.delta || linear;
var from = opts.from || 0;
var to = opts.to || 0;
if(el){ clearInterval(opts.el.timer);
opts.el.timer = setInterval(function() {
var progress = (new Date - start) / opts.duration;
if (progress > 1) progress = 1;
opts.step( delta(progress),from,to );
if (progress == 1) {
clearInterval(opts.el.timer);
opts.complete && opts.complete();
}
}, opts.delay || 20);}
}
function back(progress) {
var x = 2.9;
return Math.pow(progress, 2) * ((x + 1) * progress - x)
}
function makeEaseOut(delta) {
return function(progress) {
return 1 - delta(1 - progress)
}
}
//--------------------------- ANIMATION ----------------------------//
</script>
</head>
<body>
<div style="height:400px; background:#ccc;">
<svg height="400" width="300" style="background:#fff;">
<circle id="white" cx="150" cy="200" r="1" fill="#66bad6" />
</svg>
<svg height="400" width="300" style="background:#fff;">
<circle cx="150" cy="200" r="1" fill="#66bad6">
<animate
attributeName="r"
from="1"
to="90"
begin="0.1s"
dur="1.4s"
values="1;110;90"
keyTimes="0;0.5;1"
keySplines="
0 0 0.58 1;
0 0 0.58 1"
calcMode="spline"
fill="freeze"
/>
</circle>
</svg>
<script>
var div = document.getElementById("white");
var roundM = Math.round(div.getAttribute('r'));
setTimeout(function(){
animate({
el : div,
duration: 1400,
delta: makeEaseOut(back),
step: function(delta) {
//анимированная смена радиуса
div.setAttribute('r',delta*(90-(Math.round(roundM*100)/100))+(Math.round(roundM*100)/100));
}
});
}, 100);
</script>
</div>
</body>
</html>
Запарился подбирать параметры. Я не разбираюсь в этих кубиках безье. И с математикой туго (забыл все, аж страшно смотреть на нее) |
kostyanet, поставил бы плюс, да система не дает. Не нравишься ты ей..
|
Короче, из-за этой портянки кода ниче не видно. Вот:
<!DOCTYPE html>
<svg height="400" width="800" style="background:#fff;">
<circle cx="400" cy="200" r="1" fill="#66bad6">
<animate
attributeName="r"
from="1"
to="90"
begin="0.1s"
dur="1.4s"
values="1;110;90"
keyTimes="0;0.5;1"
keySplines="
0 0 0.58 1;
0 0 0.58 1"
calcMode="spline"
fill="freeze"
/>
</circle>
</svg>
|
Цитата:
А для единовременной анимации, Вы правы... так лучше. |
Цитата:
|
Цитата:
|
Цитата:
Ну то есть это нужно просто брать редактор, они есть, и рисовать и оживлять в нем. Но как обычно из редакторов выходят как бы кривенькие по оптимизации вещи, придется допиливать, короче гемор. Я тут из Люстры кучерявое лого в SVG сохранил, 46 килобайт, мелочь, но все равно ломанулся половину узлов убил, вроде ровно 22 кб, все равно больше PNG, но зато можно детали логотипа разукрашивать по-отдельности просто меняя циферки в тексте. |
| Часовой пояс GMT +3, время: 23:49. |