Можете ли вы контролировать анимацию GIF с помощью Javascript? - PullRequest
56 голосов
/ 05 марта 2010

Можно ли использовать JavaScript для управления тем, какой кадр изображения GIF показывает, и / или остановить анимацию. Я хочу иметь возможность загружать GIF с несколькими кадрами и показывать только один из них.

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

Ответы [ 4 ]

53 голосов
/ 15 мая 2013

Вы можете использовать библиотеку libgif .

Позволяет запускать / останавливать изображение и контролировать, в каком кадре находится изображение.

<script type="text/javascript" src="./libgif.js"></script>
<img src="./example1_preview.gif" rel:animated_src="./example1.gif"
 width="360" height="360" rel:auto_play="1" rel:rubbable="1" />

<script type="text/javascript">
    $$('img').each(function (img_tag) {
        if (/.*\.gif/.test(img_tag.src)) {
            var rub = new SuperGif({ gif: img_tag } );
            rub.load(function(){
                console.log('oh hey, now the gif is loaded');
            });
        }
    });
</script>

(большая часть кода взята непосредственно из их примера)

21 голосов
/ 03 декабря 2014

Я использую x-gif это довольно круто и легко настроить.

С Github :

<x-gif src="probably_cats.gif"></x-gif>

Где вы можете добавить следующие атрибуты:

  • Режимы воспроизведения:
    • speed="1.0" (режим по умолчанию) умножает скорость на значение атрибута;
    • sync откладывает воспроизведение на внешний объект;
    • bpm="120" синхронизирует GIF-файлы с заданной частотой ударов в минуту;
  • Опции:

    • stopped предотвращает анимацию GIF;

    • fill заставляет GIF расширяться, чтобы покрыть его контейнер;

    • n-times="3.0" (только в скоростном режиме) останавливает воспроизведение (добавление атрибута прекращается) через установленное количество раз;
    • snap (только режимы синхронизации и ударов в минуту) вместо того, чтобы позволять более длинным GIF-файлам синхронизироваться с несколькими ударами, заставьте их вписываться только в один;
    • ping-pong воспроизводит GIF спереди назад, затем спереди назад;
  • Отладка:
    • debug включает отладочный вывод из Gif Exploder;
    • exploded останавливает воспроизведение и выводит каждый кадр рядом друг с другом.
9 голосов
/ 05 марта 2010

Вы можете сделать это с одним изображением, используя CSS-спрайты .

8 голосов
/ 11 июля 2017

Если вы в порядке с преобразованием вашего gif в спрайт лист, вы можете сделать это следующим образом (используя ImageMagick):

montage animation.gif -coalesce -tile x1 -geometry +0+0 -background None -quality 100 spritesheet.png

Возможно даже, что новое изображение будет меньшего размера.

Получив спрайт-лист, используйте CSS-анимацию. Здесь используется анимация с фиксированным временем кадра:

var el = document.getElementById('anim');
function play() {
  el.style.animationPlayState = 'running';
}
function pause() {
  el.style.animationPlayState = 'paused';
}
function reset() {
  el.style.animation = 'none';
  el.offsetHeight; /* trigger reflow to apply the change immediately */
  el.style.animation = null;
}
function stop() {
  reset();
  pause();
}
#anim {
  background-image: url('https://i.stack.imgur.com/J5drY.png');
  width: 250px;
  height: 188px;
  animation: anim 1.0s steps(10) infinite;
}
@keyframes anim {
  100% { background-position: -2500px; }
}
<div id="anim" title="Animated Bat by Calciumtrice"></div>
<button onclick="play()">Play</button>
<button onclick="pause()">Pause</button>
<button onclick="reset()">Reset</button>
<button onclick="stop()">Stop</button>

Если вы хотите, чтобы анимация не запускалась автоматически, добавьте paused в конец animation rule.

...