Retour au catalogue

Banner Gradient

Banniere avec fond degrade anime et bouton de fermeture.

bannerssimple Both Responsive a11y
minimaluniversalstacked
Theme

Créer une bannière d'annonce avec dégradé animé en React

Une bannière React à dégradé animé déplace la background-position d'un dégradé linéaire à 200% de largeur via une animation CSS keyframe, tandis qu'un flag useState gère la fermeture. L'entrée en slide est une keyframe séparée qui translate la bannière de -100% à 0 au montage.

  • Stack : React 18 + Tailwind v4 + lucide-react, ~100 lignes, pas besoin de Framer Motion.
  • Deux keyframes CSS injectées gèrent toute l'animation : gradient-shift (boucle 6s) et banner-in (entrée 0.4s).
  • Accessible : le bouton de fermeture porte un aria-label ; la bannière utilise des tokens de couleur, pas de valeurs codées en dur.
  • Entièrement responsive, le texte passe de xs à sm, le bouton de fermeture est positionné en absolu pour ne jamais casser la mise en page.
  • Compatible thème clair et sombre via les tokens CSS (--color-accent, --color-background).

Banner Gradient est une barre d'annonce dismissable à placer en haut de page. Un dégradé CSS en boucle anime le fond, une courte keyframe d'entrée annonce sa présence au montage, et un bouton de fermeture le retire du DOM sans rechargement. Assez simple pour s'intégrer partout, assez soigné pour ne pas faire cheap.

Anatomie

La div racine est en position:relative avec overflow:hidden. Deux divs en position:absolute se superposent à l'intérieur : d'abord le fond de dégradé animé (linear-gradient à 200% de largeur, décalé par keyframe) ; ensuite une superposition radiale subtile qui ajoute de la profondeur lumineuse. Par-dessus les deux vient la rangée de contenu : une icône Sparkles, un court paragraphe avec lien inline optionnel, et un bouton de fermeture ancré au bord droit en position:absolute.

Comment ça marche

L'effet dégradé ne demande que deux keyframes CSS injectées via une balise `<style>` dans le composant. `banner-gradient-shift` déplace le background-position de `0% 50%` à `100% 50%` et retour en 6 secondes avec ease-in-out, créant un balayage de couleur fluide. `banner-gradient-in` translate toute la bannière de `translateY(-100%)` à `translateY(0)` avec ease-out sur 0.4s au montage. La fermeture repose sur un simple `useState(true)` : passé à false, le composant retourne null et React le démonte proprement.

Comment le coder en React

  1. Mettre en place la structure en couches

    Crée une div relative avec overflow:hidden comme racine. À l'intérieur, ajoute deux divs en position absolute : une pour le fond de dégradé, une pour la superposition radiale. Toutes deux couvrent la racine avec `inset-0`. La rangée de contenu vient en dernier, en position relative pour se placer au-dessus des couches de fond.

  2. Injecter les keyframes CSS

    Place une balise `<style>` à la fin du JSX pour définir les deux keyframes. L'animation de dégradé nécessite que backgroundSize soit à `200% 200%` sur l'élément cible pour que le décalage de position produise un mouvement visible. Garde l'animation d'entrée sur l'élément racine via la prop style `animation`.

    @keyframes banner-gradient-shift {
      0%, 100% { background-position: 0% 50%; }
      50%       { background-position: 100% 50%; }
    }
    @keyframes banner-gradient-in {
      from { opacity: 0; transform: translateY(-100%); }
      to   { opacity: 1; transform: translateY(0); }
    }
  3. Connecter la fermeture avec useState

    Garde un seul flag booléen. Quand il vaut false, retourne null en amont pour que React retire complètement l'élément du DOM. Le bouton de fermeture appelle setVisible(false) via onClick. Pas d'animation de sortie obligatoire, mais tu peux envelopper la racine dans un AnimatePresence Framer Motion si tu veux un fondu à la fermeture.

    const [visible, setVisible] = useState(true);
    if (!visible) return null;
  4. Utiliser les tokens CSS pour le thème

    Évite les valeurs hex codées en dur. Utilise `var(--color-accent)` pour le dégradé et `var(--color-background)` pour les couleurs de texte et d'icône. La bannière respecte ainsi automatiquement le preset de thème actif sans logique JavaScript supplémentaire.

Quand l'utiliser

À utiliser pour les annonces limitées dans le temps : une remise de lancement, une fenêtre de maintenance planifiée, le déploiement d'une nouvelle fonctionnalité. Elle fonctionne mieux comme opener en haut de page, placée avant la navbar ou le hero. À éviter sur les pages où le CTA principal doit être la première chose lue par le visiteur ; la bannière entre en compétition pour l'attention. Ne pas non plus empiler plusieurs bannières simultanément : un message, une bannière.

Utilisé par

  • GitHub, Utilise des bannières dégradées en haut pour les alertes de statut plateforme et les annonces de nouvelles fonctionnalités.
  • Vercel, Affiche des barres d'annonce à dégradé dismissables pour les lancements produit et les événements.
  • Stripe, Déploie des bannières hautes avec fond changeant pour Stripe Sessions et les mises à jour majeures.

FAQ

Comment persister l'état de fermeture entre les rechargements de page ?

Remplace useState par une valeur lue depuis localStorage. Au montage, vérifie si une clé comme `banner-dismissed` est définie ; si oui, initialise visible à false. Écris la clé dans le handler de fermeture. Entoure la lecture localStorage d'un try/catch pour la sécurité SSR.

Peut-on ajouter une animation de fondu à la fermeture ?

Oui. Enveloppe la div racine dans AnimatePresence de Framer Motion et ajoute une prop exit avec opacity:0 et y:-20. Change la div intérieure en motion.div et passe l'exit en plus de initial et animate. La bannière se fondera et glissera vers le haut avant que React ne la retire.

Pourquoi injecter les keyframes dans une balise <style> plutôt qu'une classe Tailwind ?

Tailwind v4 supporte les keyframes arbitraires via la config, mais pour un composant autonome livré en copy-paste la balise <style> inline concentre toute la logique d'animation dans un seul fichier. Pas de modification de config de build, et les keyframes sont isolées par leurs noms uniques.

La bannière fonctionne-t-elle sans JavaScript ?

Non. La directive 'use client' en fait un composant client ; sans JS la bannière ne s'affiche pas. Pour un fallback sans JS, déplace la bannière dans un Server Component et supprime le bouton de fermeture, ou rends-la dans une balise <noscript> comme barre HTML statique.

"use client";

import { useState } from "react";
import { X, ArrowRight, Sparkles } from "lucide-react";

interface BannerGradientProps {
  text?: string;
  linkLabel?: string;
  linkUrl?: string;
  dismissible?: boolean;
}

export default function BannerGradient({
  text = "Decouvrez notre nouvelle offre de lancement avec 30% de reduction.",
  linkLabel = "En profiter",
  linkUrl = "#",
  dismissible = true,
}: BannerGradientProps) {
  const [visible, setVisible] = useState(true);

  if (!visible) return null;

Code complet réservé à Pro

Code source intégral, export multi-framework et playground.

Passer en Pro, 9,99€/mois

Avis

Bannière React à dégradé animé, Code + Tutoriel