За последние 24 часа нас посетили 17814 программистов и 1678 роботов. Сейчас ищут 842 программиста ...

Плеер gif's

Тема в разделе "JavaScript и AJAX", создана пользователем vpalex, 26 дек 2013.

  1. vpalex

    vpalex Активный пользователь

    С нами с:
    15 ноя 2012
    Сообщения:
    21
    Симпатии:
    0
    Есть несколько анимаций в формате gif, каждое, скажем, по 2 сек., надо, чтобы они показывались в цикле.
    Пытаюсь решить следующим образом: в верстке использую список ul и скрипт на javascript, который каждые 2 сек переключает видимость между элементами списка li. В начале все работает хорошо. Через некоторое время происходит рассинхронизация, т.е. следующая анимация gif может начинаться не сначала, а с промежуточной позиции. Через минуту работы ошибки накапливаются настолько, что уже становятся очень заметными.
    Каким образом можно решить такую задачу?
     
  2. semnt

    semnt Новичок

    С нами с:
    25 дек 2013
    Сообщения:
    93
    Симпатии:
    0
    Оставьте одну картинку и попробуйте в том же цикле (через setTimeout) последовательно менять у неё свойство src.
    Анимация начинается с начала если присвоить свойству src новый адрес. Вот у вас и будет последовательность роликов.

    Добавлено спустя 50 секунд:
    Только нужно грамотно организовать прелоад этих роликов)
     
  3. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Через setTimeout, анимация отработает только 1 раз.
    Используйте setInterval и clearInterval - когда посчитаете нужным его завершить, если - это вообще потребуется.
     
  4. vpalex

    vpalex Активный пользователь

    С нами с:
    15 ноя 2012
    Сообщения:
    21
    Симпатии:
    0
    Господа, я извиняюсь, но вы меня не совсем поняли. Суть проблемы чуть в ином, возможно я ее изложил неверно, поэтому постараюсь перефразировать.
    Есть несколько анимаций в формате gif, которые одновременно грузятся в браузер пользователя. Стоит задача последовательного воспроизведения каждого gif в одном месте в верстке. В принципе, решение простое - gif делаются видимыми через определенные промежутки времени. Проблема возникает с синхронизацией. Допустим, переключатель видимости имеет период 2 сек, анимация каждого gif тоже длится 2 сек. По идее, при срабатывании переключателя видимости, каждый следующий gif должен начинаться с нулевой отметки. На практике, длительность каждого gif может отличаться на десятки микросекунд. Плюс переключатель на скрипте javascript тоже не гарантировано сработает через 2000 мс. Поэтому со временем накапливается ошибка и gif начинают быть видимыми не с нулевого кадра, а, например, со второго или третьего.
    Поэтому очень интересует решение вопроса по синхронизации. Нигде найти не смог аналог.
    P.S. Анимация на чистом CSS работает отлично, но отсутствие поддержки анимации CSS в IE9 и ниже заставляет использовать js.
     
  5. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Периодически скриптом перезагружать картинку с другим параметром в адресе
    например, первый раз адрес
    src=site.ru/img/img1.gif?rand=123
    через 2 минуты
    src=site.ru/img/img1.gif?rand=456
    но, нужно
    Также анимацию можно делать на JS, просто меняя картинки. Тогда точно синхронно будет.
     
  6. vpalex

    vpalex Активный пользователь

    С нами с:
    15 ноя 2012
    Сообщения:
    21
    Симпатии:
    0
    Тут возникает другая проблема - непредсказуемость времени загрузки через Интернет. Исходные gif достаточно тяжелые и иногда вместо gif требуется воспроизводить swf. Поэтому и хотелось всю анимацию сразу загружать на комп пользователя.
     
  7. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Третий раз
    роликов = gif картинок
     
  8. vpalex

    vpalex Активный пользователь

    С нами с:
    15 ноя 2012
    Сообщения:
    21
    Симпатии:
    0
    Дык я и об этом же. Подзагрузка в момент воспроизведения тоже работает плохо. Паузы возникают
     
  9. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Просто пример, как загружать одну картинку, но много раз
    Код (Text):
    1. <script>
    2. var i;
    3. var imgArr = new Array();
    4. for(i=0; i<10; i++){
    5.     imgArr[i] = new Image();
    6.     imgArr[i].src = "/test/img/6.jpg?r="+(i+1);
    7. }
    8. </script>
    Сразу и загружайте много всего.
    Кстати, можно вместо gif анимации другим способом переключать картинки. Создаётся полотно, в котором в ряд нарисованы все стадии анимации. Скриптом только меняется стиль контейнера, в котором бэкграундом стоит картинка. Изображение в бэкграунде смещается.
     
  10. vpalex

    vpalex Активный пользователь

    С нами с:
    15 ноя 2012
    Сообщения:
    21
    Симпатии:
    0
    Спасибо! Буду экспериментировать
     
  11. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Пример смещения картинки
    Код (PHP):
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <title>anim css</title>
    5. <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
    6. <script>
    7. var posX = 0;
    8. function animStep(){
    9.     posX += 2;
    10.     $("#out").text("pos X: "+posX);
    11.     $("#pic").css("background-position", posX+"px 0");
    12. }
    13.  
    14. $(document).ready(function(){
    15.     var tm = setInterval(animStep, 1000);
    16. });
    17. </script>
    18. <style>
    19. #pic{
    20.     width:50px;
    21.     height:50px;
    22.     background:url("/test/img/6.jpg") 0 0;
    23. }
    24. </style>
    25. </head>
    26. <body>
    27. <div id="pic"></div>
    28. <div id="out"></div>
    29. </body>
    30. </html>
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Еще можно бойкотировать IE.
     
  13. vpalex

    vpalex Активный пользователь

    С нами с:
    15 ноя 2012
    Сообщения:
    21
    Симпатии:
    0
    Бойкот дело неразумное, в моем случае, у потенциальной аудитории очень много браузеров IE и еще к тому же старых версия.
    Проблему решил. Спасибо за дельные советы.
    Алгоритм решения был следующий. Как советовали синхронизировал ролики путем загрузки в src и установки интервала. Но в начале загрузки страницы сразу загружал все ролики в соответствующие li, а при инициализации делал очистку всех src. Ролики уже в кэше, поэтому при вызове в цикле задержек не было.
    Сейчас пытаюсь скрестить ежа и ужа :), т.е. схожим образом обрабатывать совместно ролики gif и swf.
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
  15. vpalex

    vpalex Активный пользователь

    С нами с:
    15 ноя 2012
    Сообщения:
    21
    Симпатии:
    0
    флуд это тоже религия :)
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а еще потому что он в корпоративном секторе обеспечивает обратную совместимость в обратную сторону до любой версии.
     
  17. vpalex

    vpalex Активный пользователь

    С нами с:
    15 ноя 2012
    Сообщения:
    21
    Симпатии:
    0
    Всем добрый вечер!
    Продолжаю отлаживать свой скрипт. Он работает почти правильно по сравнению с первоначальном вариантом. НО! Если раньше рассинхронизация происходила буквально через 1 минуту работы плеера, то сейчас рассинхронизация начинается минут через 10-12.
    Пока нахожу одно объяснение - несмотря на то, что очищаю содержимое li, анимационный gif или ролик swf все равно продолжает крутиться в памяти. И поэтому рассинхронизация остается.
    Думаю сделать следующим образом - не просто очищать li, но и удалять gif и swf из кэша, но сохранить из перед этом в каком-то другом месте на компе пользователя, а потом вновь загрузить в браузер. Я не очень точно знаю как это сделать на практике. Как понимаю, доступа из браузера к диску у меня нет, могу только работать в области памяти, выделенной для браузера.
    Подскажите, как это можно сделать?
     
  18. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Если уж у тебя флеш присутствует на странице, то можно данные хранить во флеш ролике и брать оттуда JS скриптом, когда нужно, через ExternalInterface. Картинки можно закодировать в строковый вид с помощью base64_encode, и так передавать. Но это как-то сложновато получается, не правда ли?
    Думаю, самый "синхронный" способ - это сдвигать бэкграунд, как писал выше.