Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не присваиваются правильные значения атрибутов. (https://javascript.ru/forum/misc/50858-ne-prisvaivayutsya-pravilnye-znacheniya-atributov.html)

max0n 14.10.2014 18:55

Не присваиваются правильные значения атрибутов.
 
Вот код:

<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>


проблема такова… я меняю анимацией параметр, круга (радиус).
Объект увеличивается…. после чего мне нужно получить его текущее значение и делать другие манипуляции… но почему-то выводится значение изначальное.

danik.js 14.10.2014 18:57

Цитата:

Сообщение от max0n
но почему-то выводится значение изначальное.

Почему-то? Ты серьезно?? Ты выводишь значение из roundM, которое никем и ничем не меняется! Меняется только значение атрибута r у элемента.

kostyanet 14.10.2014 21:16

В алерт надо засунуть вот это

var roundM = Math.round(div.getAttribute('r'));

Кстати, а точно SVG надо анимировать вот таким колхозным способом? По-моему там недостижимые для колхозов индустриальные методы встроены. Я как-то почитал немного и хватило - везде стоит amimate, animate, animate - похоже там нет ничего что не анимате.

danik.js 14.10.2014 22:21

Цитата:

Сообщение от kostyanet
Кстати, а точно SVG надо анимировать вот таким колхозным способом?

Ты прав.

Слева колхоз, справа по-научному:

<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>


Запарился подбирать параметры. Я не разбираюсь в этих кубиках безье. И с математикой туго (забыл все, аж страшно смотреть на нее)

danik.js 14.10.2014 22:25

kostyanet, поставил бы плюс, да система не дает. Не нравишься ты ей..

danik.js 14.10.2014 22:26

Короче, из-за этой портянки кода ниче не видно. Вот:
<!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>

max0n 14.10.2014 22:43

Цитата:

Сообщение от danik.js (Сообщение 335557)
Короче, из-за этой портянки кода ниче не видно. Вот:
<!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>

Всё это конечно хорошо.... но мне нужно будет больше манипуляций проводить с анимацией... так что там по любому надо JS.

А для единовременной анимации, Вы правы... так лучше.

danik.js 15.10.2014 15:34

Цитата:

Сообщение от max0n
мне нужно будет больше манипуляций проводить с анимацией

Какого рода манипуляций? Ты можешь манипулировать атрибутами элемента <animate> управляя анимацией динамически.

kostyanet 15.10.2014 16:57

Цитата:

Сообщение от max0n
Всё это конечно хорошо.... но мне нужно будет больше манипуляций проводить с анимацией.

И там либы есть готовые, например http://snapsvg.io/demos/

kostyanet 15.10.2014 17:01

Цитата:

Сообщение от danik.js
Короче, из-за этой портянки кода ниче не видно. Вот:

Это да, пощщупать проперти. Делается, конечно, все не так. Поэтому как обычно, и, кстати, как и с канвасом SVG демонстрирует блеск и нищету. Либо крутейшие вещи с опупеннными либами, либо простейшие вещи чисто пощщупать проперти. Массового спроса пока не наблюдается, ибо уровень абстракции SVG слишком высок. Постигнет ее, боюсь, судьба XML.

Ну то есть это нужно просто брать редактор, они есть, и рисовать и оживлять в нем. Но как обычно из редакторов выходят как бы кривенькие по оптимизации вещи, придется допиливать, короче гемор.

Я тут из Люстры кучерявое лого в SVG сохранил, 46 килобайт, мелочь, но все равно ломанулся половину узлов убил, вроде ровно 22 кб, все равно больше PNG, но зато можно детали логотипа разукрашивать по-отдельности просто меняя циферки в тексте.

kostyanet 15.10.2014 17:08

Цитата:

Сообщение от danik.js
Я не разбираюсь в этих кубиках безье

Есть сайты, типа http://cubic-bezier.com/#.17,.67,.83,.67

Безиер был человеком Pierre Étienne Bézier

danik.js 15.10.2014 17:15

Цитата:

Сообщение от kostyanet
Есть сайты, типа http://cubic-bezier.com/#.17,.67,.83,.67

Не поверишь, я на этом сайте и подбирал значения )
Я все равно не втыкаю че эти циферки значат. Пока не до них.


Часовой пояс GMT +3, время: 18:30.