Animations/Animated Accordion

Animated Accordion

Accordion anime avec expand/collapse smooth via grid-template-rows transition.

clickCSSaccordionFAQUI
Trigger: Click
CSS requis: Non
Difficulte: easy

Preview live

Code

"use client";
import { useState } from "react";

export default function Accordion({ items }: { items: { title: string; content: string }[] }) {
  const [openIdx, setOpenIdx] = useState<number | null>(0);

  return (
    <div>
      {items.map((item, i) => (
        <div key={i}>
          <button onClick={() => setOpenIdx(openIdx === i ? null : i)}>
            <span>{item.title}</span>
            <span style={{
              transform: openIdx === i ? "rotate(45deg)" : "rotate(0deg)",
              transition: "transform 0.3s",
            }}>+</span>
          </button>
          <div style={{
            display: "grid",
            gridTemplateRows: openIdx === i ? "1fr" : "0fr",
            transition: "grid-template-rows 0.3s ease-out",
          }}>
            <div style={{ overflow: "hidden" }}>
              <p>{item.content}</p>
            </div>
          </div>
        </div>
      ))}
    </div>
  );
}

Instructions

Technique grid-template-rows pour un expand/collapse fluide sans height fixe. L'icone + tourne a 45deg pour devenir un x. Un seul item ouvert a la fois — modifiez pour permettre plusieurs si besoin.