# Animations in React

December 30, 2025 Javascript Front-end React Typescript

Rich animations can breathe life into plain-looking user interfaces. Here is how we can implement animations in a React application.

Installation

$ npm i framer-motion

Animation accordion example

Method One

import { FC, useState } from "react";
import { Variants, motion } from "framer-motion"

const variants: Variants = {
  open: { opacity: 1, height: "100%" },
  closed: { opacity: 0, height: 0, overflow: "hidden" },
}

export const AnimatedToggle: FC = () => {
  const [open, setOpen] = useState(false)

  return (
    <div>
      <button className="text-xs bg-stone-200 hover:bg-stone-100 rounded px-3 py-2"
        onClick={() => setOpen(o => !o)}
      >Toggle</button>

      <motion.div variants={variants} initial="closed" exit="closed"
      animate={open ? "open" : "closed"}>
        <p className="text-xs leading-relaxed pt-6">Lorem ipsum dolor sit...</p>
      </motion.div>
    </div>
  )
}

Method Two

import { FC, useState } from "react";
import { Variants, motion, AnimatePresence } from "framer-motion"

const variants: Variants = {
  open: { opacity: 1, height: "100%" },
  closed: { opacity: 0, height: 0, overflow: "hidden" },
}

export const AnimatedToggle: FC = () => {
  const [open, setOpen] = useState(false)

  return (
    <div>
      <button className="text-xs bg-stone-200 hover:bg-stone-100 rounded px-3 py-2"
        onClick={() => setOpen(o => !o)}
      >Toggle</button>

      <AnimatePresence>
        {open && (
          <motion.div variants={variants} initial="closed" exit="closed" animate="open">
            <p className="text-xs leading-relaxed pt-6">Lorem ipsum dolor sit...</p>
          </motion.div>
        )}
      </AnimatePresence>
    </div>
  )
}

Note: Avoid adding classes directly on motion.* elements because it can cause janky animations.