Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.10.2014, 18:55
Аватар для max0n
Аспирант
Отправить личное сообщение для max0n Посмотреть профиль Найти все сообщения от max0n
 
Регистрация: 23.05.2012
Сообщений: 44

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

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


проблема такова… я меняю анимацией параметр, круга (радиус).
Объект увеличивается…. после чего мне нужно получить его текущее значение и делать другие манипуляции… но почему-то выводится значение изначальное.
Ответить с цитированием
  #2 (permalink)  
Старый 14.10.2014, 18:57
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от max0n
но почему-то выводится значение изначальное.
Почему-то? Ты серьезно?? Ты выводишь значение из roundM, которое никем и ничем не меняется! Меняется только значение атрибута r у элемента.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 14.10.2014, 21:16
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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

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

Кстати, а точно SVG надо анимировать вот таким колхозным способом? По-моему там недостижимые для колхозов индустриальные методы встроены. Я как-то почитал немного и хватило - везде стоит amimate, animate, animate - похоже там нет ничего что не анимате.
Ответить с цитированием
  #4 (permalink)  
Старый 14.10.2014, 22:21
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от 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>


Запарился подбирать параметры. Я не разбираюсь в этих кубиках безье. И с математикой туго (забыл все, аж страшно смотреть на нее)
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 14.10.2014, 22:25
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

kostyanet, поставил бы плюс, да система не дает. Не нравишься ты ей..
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 14.10.2014, 22:26
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Короче, из-за этой портянки кода ниче не видно. Вот:
<!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>
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 14.10.2014, 22:43
Аватар для max0n
Аспирант
Отправить личное сообщение для max0n Посмотреть профиль Найти все сообщения от max0n
 
Регистрация: 23.05.2012
Сообщений: 44

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

А для единовременной анимации, Вы правы... так лучше.
Ответить с цитированием
  #8 (permalink)  
Старый 15.10.2014, 15:34
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от max0n
мне нужно будет больше манипуляций проводить с анимацией
Какого рода манипуляций? Ты можешь манипулировать атрибутами элемента <animate> управляя анимацией динамически.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #9 (permalink)  
Старый 15.10.2014, 16:57
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от max0n
Всё это конечно хорошо.... но мне нужно будет больше манипуляций проводить с анимацией.
И там либы есть готовые, например http://snapsvg.io/demos/
Ответить с цитированием
  #10 (permalink)  
Старый 15.10.2014, 17:01
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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

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

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

Последний раз редактировалось kostyanet, 15.10.2014 в 17:04.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
изменение значения input при смене значения select galart jQuery 4 30.01.2015 19:39
Присвоение значения тегу value GreenJo Javascript под браузер 3 28.04.2014 10:43
Десятичные значения в он-лайн калькуляторе. Natali_SPb Общие вопросы Javascript 3 03.11.2013 21:46
получение значения из классов karmis Events/DOM/Window 1 14.10.2011 19:09
Вытащить со страницы все значения name и value из тегов <input> qwr938 Общие вопросы Javascript 8 13.02.2011 15:16