Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Плавная анимация

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
DeepVarvar Супермодератор
Отправлено: 29 Ноября, 2014 - 23:28:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Написал на чистом обертку для анимации.
Вот она с каментами:
CODE (javascript):
скопировать код в буфер обмена
  1. function animate(elem, style, params) {
  2.  
  3.     // сколько "кадров" в секунду
  4.     var framesPerSec = 30;
  5.     // задержка между кадрами
  6.     var frameTimeout = Math.floor(1000 / framesPerSec);
  7.     // кол-во кадров для переданной длительности
  8.     var framesCount  = Math.floor(params.duration / frameTimeout);
  9.     // объект состояния
  10.     var animateData  = {};
  11.  
  12.     // единожды бежим по всем переданным к анимации значениям
  13.     // и забиваем данными объект состояния
  14.     for (var s in style) {
  15.  
  16.         // получаем текущее значение стиля в элементе
  17.         var currentStyleValue = parseFloat(getStyle(elem, s));
  18.         animateData[s] = {
  19.             current     : currentStyleValue, // текущее
  20.             complete    : style[s][0], // конечное
  21.             incremental : ( style[s][0] > currentStyleValue ), // (ин|де)кремент
  22.             step        : ( Math.abs(currentStyleValue - style[s][0]) / framesCount ), // шаг (ин|де)кремента
  23.             measures    : ( style[s].length > 1 ? style[s][1] : false ) // еденицы измерения
  24.         };
  25.  
  26.     }
  27.  
  28.     // сама анимация
  29.     var _animate = function() {
  30.  
  31.         // если еще не все фреймы отыграли
  32.         if (framesCount > 0) {
  33.  
  34.             // обновляем объект состояния
  35.             var x, current;
  36.             for (x in animateData) {
  37.  
  38.                 // если это последний фрейм, то сразу применяем конечное значение
  39.                 // ибо бывает что step не ровный и может либо недожать либо пережать
  40.                 if (framesCount == 1) {
  41.                     animateData[x].current = animateData[x].complete;
  42.                 // инкремент
  43.                 } else if (animateData[x].incremental) {
  44.                     animateData[x].current += animateData[x].step;
  45.                 // декремент
  46.                 } else {
  47.                     animateData[x].current -= animateData[x].step;
  48.                 }
  49.  
  50.                 // применяем состояние к стилям самого элемента
  51.                 current = animateData[x].current;
  52.                 if (animateData[x].measures) {
  53.                     current += animateData[x].measures;
  54.                 }
  55.                 elem.style[x] = current;
  56.  
  57.             }
  58.             // отнимаем кадр
  59.             framesCount -= 1;
  60.  
  61.             // запускаем таймаут для следующего кадра
  62.             setTimeout(function() {
  63.                 _animate();
  64.             }, frameTimeout);
  65.  
  66.         // комплит калбяк
  67.         } else if (params.complete) {
  68.             params.complete();
  69.         }
  70.  
  71.     };
  72.     _animate();
  73.  
  74. }

Пример вызова:
CODE (javascript):
скопировать код в буфер обмена
  1. animate(
  2.     elem, {
  3.         opacity : [1],
  4.         top     : [top,  '%'],
  5.         left    : [left, '%']
  6.     }, {
  7.         duration: 400
  8.     }
  9. );

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

И вроде все нормально. Но визуально это выглядит как говно.
А именно - пока не поставишь кадров эдак 60 в секунду, оно делает все это дергано.
Но на 60-ти кадрах уже браузер не успевает применить стили к элементу, если элемент большой и все такое.
В jquery есть несколько алгоритмов расчета шага (easing).
И дефолтный это - ленивая сюзанна.
И это не линейный алгоритм, линейный там тоже есть, и тоже как и у меня, его колбасит.

Так вот вопрос такой - чего бы такого плавного придумать?
 
 Top
esterio
Отправлено: 29 Ноября, 2014 - 23:39:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




а пробовал requestAnimationFrame? пишут что лучше его использовать и его полифил
 
 Top
Viper
Отправлено: 29 Ноября, 2014 - 23:45:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




DeepVarvar пишет:
чего бы такого плавного придумать
можно порыть http://jqueryui[dot]com/effect/ Вдруг что сгодится.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Ноября, 2014 - 02:43:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




esterio пишет:
requestAnimationFrame

Да, запилил:
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. if (window.requestAnimationFrame) {
  3.     requestAnimationFrame(_animate);
  4. } else {
  5.     setTimeout(function() {
  6.         _animate();
  7.     }, frameTimeout);
  8. }

Помогло! А те кто не умеет, пусть пыхтят на 60 фпс.
Плюсую.
 
 Top
esterio
Отправлено: 30 Ноября, 2014 - 15:26:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




если хочеш еще плавной анимации то лучше с помощью styleSheet создать класс CSS 3 transform и transform, потом добавить этот класс к елементу. потом можно оловить завершение анимации и удалить сгенерированый класс чтобы не висело напрасно. в таком случае подключиться GPU, что будет заметно быстрее

но здесь уже поддержа хромает от осла 10 кажись, плюс префиксы нужно делать

(Отредактировано автором: 30 Ноября, 2014 - 17:35:31)

 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Ноября, 2014 - 16:51:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




esterio пишет:
CSS 3 transform
Не, не, нужно именно без трансформов.
 
 Top
OrmaJever
Отправлено: 30 Ноября, 2014 - 17:02:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




DeepVarvar кроссбраузерность добавь http://habrahabr[dot]ru/post/114358/


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Ноября, 2014 - 17:13:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Не, щас не буду, просто сделаю пометку что тут у меня узкое место. Тестировать на зоопарке буду потом.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB