image-animation и контроль над анимацией

• css

Проблема

Годами (десятилетиями?) в вебе можно было делать анимированные картинки. Сначала GIF, потом анимированные WebP и Avif. И если в случае видео мы можем контролировать воспроизведение (останавливать и продолжать), то в случае анимированных картинок у нас такой возможности нет.

Или пока не было. Через пару недель выходит Хром 156, в котором добавляется новое свойство – image-animation. Правда, добавляется ли?

image-animation

Свойство имеет значение по умолчанию normal, которое примерно соответствует текущему поведению браузеров (анимация воспроизводится), а также 3 других значения.

paused. При переключении в это состояние картинка перестаёт меняться, всё ожидаемо.

stopped. Анимация останавливается, как и в случае paused. Однако stopped также показывает кадр-обложку (такие бывают в анимированных картинках) или просто первый кадр анимации.

running. Включает воспроизведение анимации явно.

И тут есть второй слой, который не ожидаешь от простого свойства по остановке анимации. Новое дефолтное поведение обязывает браузер синхронизировать воспроизведение анимаций.

Например, если на странице есть две картинки с одинаковым урлом и image-animation: normal (ещё раз, это значение по умолчанию), их воспроизведение будет синхронизировано. А в случае running синхронизации нет.

Если же анимация была приостановлена, а затем вернулась в normal, то она “скакнёт” по шкале времени к остальным картинкам. А в случае running продолжит выполнение с момента, на котором остановилась.

img {
    image-animation: paused;
}
 
img:hover,
img:focused {
    image-animation: running;
}

Также создатели предложили псевдо-класс :animated-image. Он выбирает элементы, в которых есть анимированная картинка (именно картинка с анимацией, а не просто <img> или <img> с типом файла, который поддерживает анимацию).

img:animated-image {
    image-animation: paused;
    filter: grayscale(10%) contrast(50%) brightness(80%);
}

Выбор между видео и анимированной картинкой

В каких случаях видео показывает себя не очень хорошо, и почему может потребоваться анимированная картинка?

Прозрачный фон и пиксели по краям. Современные форматы видео поддерживают прозрачность, но на практике бывают нюансы. Точно также бывают нюансы и с полоской пикселей по краю (например, это может быть чёрная однопиксельная полоска). В этом плане анимированные картинки ведут себя предсказуемо и стабильно.

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

А наоборот, почему видео всё-таки может быть лучше?

Полный контроль воспроизведения. Пауза, перемотка, скорость воспроизведения – всего этого в анимированных картинках (пока) нет.

Более эффективный формат. Современные форматы видео могут быть существенно эффективнее анимированных WebP и GIF. Кроме того, часть инструментов по оптимизации картинок могут не поддерживать анимацию вообще, оставляя вас с раздутыми файлами.

Более эффективное воспроизведение. Браузеры значительно лучше отрисовывают видео на страницах, в то время как анимированные картинки могут уступать по потребляемым ресурсам (батарее, памяти, скорости начала воспроизведения и так далее).

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

controls для картинок?

Когда-то было обсуждение атрибута controls для картинок. Это позволило бы управлять воспроизведение картинок аналогично тегу <video>.

И в Хроме атрибута controls для картинок (пока) нет. Но кто бы мог подумать, этот атрибут завезли в Сафари 27! Правда, по совсем другой причине.

controls в Сафари нужен для visionOS. Другими словами, это не кнопки для паузы/воспроизведения анимации, это кнопки для перевода картинки в панорамный режим.

Будет ли релиз?

Недавно Хром перешёл на двухнедельный цикл разработки. Если раньше бета уходила на месяц вперёд, а canary на 2-3, то теперь разница между ветками уже не такая большая.

Что же с новым свойством? Оно заявлено к выходу в следующей 156й версии, но в самом свежем билде Хрома оно не работает. При этом canary версия и есть 156.

Инструменты разработчика частично поддерживают новое свойство (автокомплит есть, но про само свойство они говорят, что его нет). В трекере Хрома есть свежие ишью (про безопасность, например), но активного обсуждения я не нашёл.

Для меня всё это выглядит, как будто свойство выключили из-за каких-то проблем. Возможно, оно работает нестабильно, или не все вопросы были решены. Всё это наталкивает на мысль о переносе релиза?. Посмотрим.

Итого

Свойство image-animation звучит очень полезно. Возможность остановки анимации и продолжение воспроизведения по необходимости – очень крутая возможность, особенно для сайтов, в которых анимированных картинок много. Остаётся только добавить программное JS API и события.

Но вот что касается самого релиза, то тут выглядит не очень понятно. Что ж, подождём пару недель и увидим, осталось всего ничего.

Обсудить в Telegram

Почитать ещё посты

  • frame-sizing не решает проблемы размера ифреймов?
  • text-box-edge и text-box-trim: доступны во всех браузерах
  • CSS Link Parameters, что ты такое?
  • calc-mix() и progress() – что за функции и в чём разница?
  • Автоматические размеры полей с field-sizing