Code Premix

Creating animations and transitions with JavaScript

📅February 18, 2023

Creating animations and transitions with JavaScript has become an essential part of modern web development. Animations and transitions can add a layer of visual interest and interactivity to web pages, making them more engaging and memorable for users. In this article, we’ll explore the basics of creating animations and transitions with JavaScript, and some best practices to keep in mind.

Why Use Animations and Transitions?

Animations and transitions can be used for a variety of purposes in web development, including:

  • Drawing attention to certain elements on the page
  • Creating a more interactive and engaging user experience
  • Guiding the user’s focus and flow through a process or workflow
  • Enhancing the overall visual appeal of the page

When done well, animations and transitions can create a sense of delight and satisfaction for users, and make them more likely to engage with your website or application.

The Basics of Animations and Transitions

Before we dive into the specifics of creating animations and transitions with JavaScript, let’s define some terms:

  • Animations are changes to an element’s style properties over time. For example, animating the opacity of an element to make it gradually fade in or out.
  • Transitions are changes to an element’s style properties that occur when an event happens, such as when the element is hovered over or clicked. For example, transitioning the background color of a button when it’s hovered over.

Animations and transitions are both accomplished with the help of CSS, which is used to define the styles that will be changed. However, JavaScript can be used to manipulate these styles and trigger animations and transitions programmatically.

Creating Animations with JavaScript

Let’s start by looking at how to create animations with JavaScript. There are a few different ways to accomplish this, but we’ll focus on using the requestAnimationFrame method. This method tells the browser that you want to animate something, and it will call a specified function each time a new frame is rendered.

Here’s a basic example that animates the opacity of an element from 0 to 1 over 1 second:

const element = document.querySelector('.my-element');
let start;

function animate(timestamp) {
  if (!start) start = timestamp;
  const elapsed = timestamp - start;
  const duration = 1000; // 1 second in milliseconds
  const opacity = Math.min(elapsed / duration, 1);
  element.style.opacity = opacity;
  if (elapsed < duration) {
    requestAnimationFrame(animate);
  }
}

requestAnimationFrame(animate);

In this example, we’re selecting an element with the class my-element, and defining a function called animate. The animate function takes a timestamp argument, which is automatically passed by the requestAnimationFrame method.

Inside the animate function, we’re calculating the elapsed time since the animation started, and using that to calculate the opacity of the element. We’re then setting the opacity style property of the element, and checking if the animation has finished. If the animation is not finished, we call requestAnimationFrame again to continue the animation.

Creating Transitions with JavaScript

Creating transitions with JavaScript is similar to creating animations, but instead of using the requestAnimationFrame method, we can use the setTimeout method to delay the application of a style change. Here’s an example that transitions the background color of an element when it’s clicked:

const element = document.querySelector('.my-element');
element.addEventListener('click', () => {
  element.style.backgroundColor = 'blue';
  setTimeout(() => {
    element.style.backgroundColor = 'red';
  }, 1000);
});

In this example, we’re selecting an element with the class my-element, and adding a click event listener to it.

Here are some more examples of creating animations and transitions with JavaScript:

Example 1: Animating the Position of an Element

const element = document.querySelector('.my-element');
let start;

function animate(timestamp) {
  if (!start) start = timestamp;
  const elapsed = timestamp - start;
  const duration = 1000; // 1 second in milliseconds
  const position = Math.min(elapsed / duration * 100, 100);
  element.style.transform = `translateX(${position}px)`;
  if (elapsed < duration) {
    requestAnimationFrame(animate);
  }
}

requestAnimationFrame(animate);

In this example, we’re animating the position of an element horizontally across the screen. We’re selecting an element with the class my-element, and defining a function called animate. Inside the animate function, we’re calculating the elapsed time since the animation started, and using that to calculate the position of the element using a linear function. We’re then setting the transform style property of the element to translate it horizontally, and checking if the animation has finished. If the animation is not finished, we call requestAnimationFrame again to continue the animation.

Example 2: Transitioning the Height of an Element

const element = document.querySelector('.my-element');
let height = element.offsetHeight;

element.addEventListener('mouseenter', () => {
  element.style.height = `${height * 2}px`;
});

element.addEventListener('mouseleave', () => {
  element.style.height = `${height}px`;
});

In this example, we’re transitioning the height of an element when the user hovers over it. We’re selecting an element with the class my-element, and storing its initial height in a variable called height. We’re then adding two event listeners to the element: one for the mouseenter event, and one for the mouseleave event. When the user hovers over the element, we’re setting the height style property of the element to twice its original height, and when the user leaves, we’re setting it back to its original height.

Example 3: Animating the Opacity of Multiple Elements

const elements = document.querySelectorAll('.my-element');
let start;

function animate(timestamp) {
  if (!start) start = timestamp;
  const elapsed = timestamp - start;
  const duration = 1000; // 1 second in milliseconds
  const opacity = Math.min(elapsed / duration, 1);
  elements.forEach((element) => {
    element.style.opacity = opacity;
  });
  if (elapsed < duration) {
    requestAnimationFrame(animate);
  }
}

requestAnimationFrame(animate);

In this example, we’re animating the opacity of multiple elements simultaneously. We’re selecting all elements with the class my-element, and defining a function called animate. Inside the animate function, we’re calculating the elapsed time since the animation started, and using that to calculate the opacity of the elements. We’re then setting the opacity style property of each element in a loop, and checking if the animation has finished. If the animation is not finished, we call requestAnimationFrame again to continue the animation.