<!-- animation container -->
<h2 class="animation-title">Frame by Frame Animation (JavaScript)</h2>
<img class="eye-animation"
src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/Eye-1.svg"
alt="blinking eye animation"/>
// animation container
.animation-title {
font-family: sans-serif;
text-align: center;
}
.eye-animation {
width: 300px;
display: block;
// place in the middle of the screen
margin: auto;
}
View Compiled
const $element = $('.eye-animation');
const imagePath = 'https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941';
const totalFrames = 18;
const animationDuration = 1300;
const timePerFrame = animationDuration / totalFrames;
let timeWhenLastUpdate;
let timeFromLastUpdate;
let frameNumber = 1;
// 'step' function will be called each time browser rerender the content
// we achieve that by passing 'step' as a parameter to the 'requestAnimationFrame' function
function step(startTime) {
// 'startTime' is provided by requestAnimationName function, and we can consider it as current time
// first of all we calculate how much time has passed from the last time when frame was update
if (!timeWhenLastUpdate) timeWhenLastUpdate = startTime;
timeFromLastUpdate = startTime - timeWhenLastUpdate;
// then we check if it is time to update the frame
if (timeFromLastUpdate > timePerFrame) {
// and update it accordingly
$element.attr('src', imagePath + `/Eye-${frameNumber}.svg`);
// reset the last update time
timeWhenLastUpdate = startTime;
// then increase the frame number or reset it if it is the last frame
if (frameNumber >= totalFrames) {
frameNumber = 1;
} else {
frameNumber = frameNumber + 1;
}
}
requestAnimationFrame(step);
}
// create a set of hidden divs
// and set their background-image attribute to required images
// that will force browser to download the images
$(document).ready(() => {
for (var i = 1; i < totalFrames + 1; i++) {
$('body').append(`<div id="preload-image-${i}" style="background-image: url('${imagePath}/Eye-${i}.svg');"></div>`);
}
});
// wait for images to be downloaded and start the animation
$(window).on('load', () => {
requestAnimationFrame(step);
});
View Compiled
This Pen doesn't use any external CSS resources.