Ответ больше не действителен
Похоже, что описанное здесь поведение (запись тега img
со ссылкой на анимированный GIF на холст приводит к тому, что различные кадры записываемого GIF, если img
является частью DOM или видимым), изменились как минимум в хроме. Там может быть или не быть документация о том, что является правильным поведением для этого. :)
Кроме того, webkitRequestAnimationFrame
больше не имеет поведения принятия одного дополнительного аргумента, элемента X, такого, что, когда X не виден, запрошенная функция не будет работать. Из соображений производительности и срока службы батареи вам может потребоваться, чтобы многие функции, которые вы передаете requestAnimationFrame
, проверяли на предмет видимости, прежде чем выполнять какие-либо действия, требующие рисования.
До:
Проверьте исправленную версию:
http://jsfiddle.net/eGjak/96/
Если вы добавите console.log()
к функции, которая рисует изображение, вы увидите, что оно вызывается. Кажется, проблема в том, что само изображение не анимируется, возможно, потому, что браузер не пытается обновить анимированное изображение, которое не является частью DOM.
Мое решение состояло в том, чтобы сделать анимированный GIF-файл частью DOM и размером 0, и он работает просто отлично.
Вы можете убедиться, что анимация отображается на холсте, а не в теге изображения, загрузив http://jsfiddle.net/eGjak/96/show/ и проверив элементы с помощью ctrl-shift-I в Windows или Linux / alt-cmd-I .
РЕДАКТИРОВАТЬ : Вот бонус!
webkitRequestAnimationFrame
принимает еще один аргумент, чем эквивалент Mozilla, чтобы ваша анимация могла запускаться только тогда, когда видимый анимируемый элемент. Проверить
http://jsfiddle.net/kmKZa/8/
и откройте консоль. Вы увидите, что когда вы прячете холст, функция анимации перестает вызываться. При повторном переключении видимого холста снова будет вызвана функция анимации.