Если вы внимательно посмотрите на код в этом примере, вы увидите, что видео создается путем рисования каждого кадра один за другим на canvas
, который подключен к MediaRecorder
.
Так что вам нужно сделать то же самое: приостановить анимацию для каждого кадра, нарисовать этот кадр на canvas
, немного переместить анимацию для следующего кадра и повторить.
Есть коддля рисования SVG на холсте в связанном примере, поэтому сложная часть состоит в том, чтобы приостановить анимацию в любой момент времени, чтобы создать кадр, так как ваша анимация полностью CSS.Вы можете сделать это, приостановив анимацию (animation-play-state: paused
) и настроив animation-delay
.Вот пример этого сам по себе:
https://codepen.io/Sphinxxxx/pen/zjXqej?editors=1010
Таким образом, вы можете сделать что-то похожее в своем коде:
//Loop through all animated elements, and update their animation-delay.
//Together with "animation-play-state: paused", this freezes the animation at the specified time.
function freeze(time) {
animed.forEach(x => {
const css = x.style;
if(!x.__originalDelay) {
const delay = css.animationDelay;
x.__originalDelay = delay.match(/\d/) ? delay : '0s';
}
css.animationPlayState = 'paused';
css.animationDelay = `calc(${x.__originalDelay} - ${time}ms)`;
});
}
Обновленная демоверсия:
https://jsfiddle.net/473btp7e/2/
Обновление: Улучшена поддержка Firefox и возможность управлять каждым кадром вручную с помощью requestFrame()
https://jsfiddle.net/473btp7e/82/