Blog / CSS

Creer un marquee infini moderne en CSS pur

Apprenez a creer des defilements horizontaux fluides et infinis pour vos logos clients, news tickers et textes decoratifs. Technique moderne sans JavaScript, avec boucle seamless parfaite.

Introduction au marquee moderne

L'element <marquee> HTML est deprecie depuis des annees, mais le besoin de creer des defilements infinis reste tres present dans le web design moderne. Que ce soit pour afficher des logos de clients, un bandeau d'actualites ou un texte decoratif, le marquee reste un pattern UI populaire.

Dans ce tutoriel complet, nous allons explorer plusieurs techniques CSS modernes pour creer des marquees fluides, performants et accessibles. Aucun JavaScript n'est requis pour les animations de base, et nous verrons comment ajouter des interactions avancees.

💡
Bon a savoir

Le secret d'un marquee infini parfait reside dans la duplication du contenu. En doublant les elements, on cree une boucle seamless ou la fin rejoint le debut sans aucun saut visible.

Technique CSS animation infinite

La base de tout marquee moderne repose sur @keyframes et la propriete animation. L'idee est simple : deplacer un conteneur de 0% a -50% de sa largeur totale, puis recommencer instantanement.

Structure HTML de base

La structure se compose de trois niveaux : un conteneur avec overflow: hidden, une piste animee, et les elements a afficher. Voici la structure minimale :

marquee-structure.html
<!-- Conteneur avec overflow hidden -->
<div class="marquee-container">
  <!-- Piste animee -->
  <div class="marquee">
    <!-- Groupe 1 : contenu original -->
    <div class="marquee-track">
      <div class="marquee-item">Item 1</div>
      <div class="marquee-item">Item 2</div>
      <div class="marquee-item">Item 3</div>
    </div>
    <!-- Groupe 2 : copie pour la boucle -->
    <div class="marquee-track" aria-hidden="true">
      <div class="marquee-item">Item 1</div>
      <div class="marquee-item">Item 2</div>
      <div class="marquee-item">Item 3</div>
    </div>
  </div>
</div>

CSS de base pour l'animation

Le CSS qui fait fonctionner la magie est etonnamment simple. L'animation deplace le conteneur de sa position initiale jusqu'a -50% (la moitie de sa largeur totale, soit exactement la taille du contenu duplique) :

marquee-base.css
.marquee-container {
  overflow: hidden;
  width: 100%;
}

.marquee {
  display: flex;
  width: max-content;
  animation: marquee-scroll 25s linear infinite;
}

.marquee-track {
  display: flex;
  gap: 24px;
  padding: 0 12px;
}

@keyframes marquee-scroll {
  0% {
    transform: translateX(0);
  }
  100% {
    transform: translateX(-50%);
  }
}

Duplication du contenu pour boucle seamless

Le principe de la duplication est essentiel pour creer une boucle parfaite. Quand l'animation atteint -50%, le contenu duplique est exactement a la position ou etait le contenu original au debut. Le reset a 0% est donc invisible.

🔄
Pourquoi -50% ?

Si vous avez 6 items et que vous les dupliquez, vous avez 12 items au total. En deplacant de -50%, vous parcourez exactement les 6 premiers items, et au moment du reset, les 6 suivants (identiques) prennent leur place. La transition est invisible car le contenu est identique.

Pour l'accessibilite, ajoutez aria-hidden="true" sur le groupe duplique. Les lecteurs d'ecran ne liront ainsi le contenu qu'une seule fois.

Marquee de logos (clients, partenaires)

Le cas d'usage le plus frequent : afficher une liste de logos de clients, partenaires ou technologies. Voici une implementation complete avec style moderne :

Stripe
Vercel
Prisma
Notion
Figma
Linear
logo-marquee.css
.logo-item {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 16px 32px;
  background: rgba(255, 255, 255, 0.05);
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: 12px;
  font-weight: 600;
  white-space: nowrap;
  transition: all 0.3s ease;
}

.logo-item:hover {
  background: rgba(99, 102, 241, 0.1);
  border-color: rgba(99, 102, 241, 0.3);
}

/* Effet de fondu sur les bords */
.marquee-fade {
  position: relative;
}

.marquee-fade::before,
.marquee-fade::after {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  width: 100px;
  z-index: 2;
  pointer-events: none;
}

.marquee-fade::before {
  left: 0;
  background: linear-gradient(90deg, var(--bg-card), transparent);
}

.marquee-fade::after {
  right: 0;
  background: linear-gradient(-90deg, var(--bg-card), transparent);
}

Marquee de texte (news ticker)

Le marquee de texte est ideal pour les bandeaux d'actualites, les annonces ou les elements decoratifs. On peut jouer avec la typographie pour creer des effets visuels impressionnants.

Texte decoratif grand format

Un texte XXL avec effet gradient qui defile en arriere-plan, parfait pour les hero sections ou les separateurs de page :

Effects.lab * CSS Magic * Web Design * Creative Dev *
text-marquee.css
.text-marquee {
  display: flex;
  gap: 48px;
}

.text-marquee-item {
  font-size: 4rem;
  font-weight: 900;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  white-space: nowrap;

  /* Gradient text */
  background: linear-gradient(135deg, #6366f1, #8b5cf6, #d946ef);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
}

.text-marquee-separator {
  font-size: 4rem;
  color: #6366f1;
  opacity: 0.5;
}

News ticker avec badges

Un bandeau d'actualites professionnel avec des badges colores pour categoriser les informations :

Nouveau CSS Container Queries maintenant supporte par tous les navigateurs
Hot View Transitions API revolutionne les SPAs
Update Tailwind CSS 4.0 annonce pour Q1 2026
Info Nouvelle spec CSS Anchor Positioning en cours
ticker-marquee.css
.ticker-marquee {
  background: rgba(99, 102, 241, 0.1);
  border-top: 1px solid rgba(99, 102, 241, 0.2);
  border-bottom: 1px solid rgba(99, 102, 241, 0.2);
  padding: 12px 0;
}

.ticker-item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 0 24px;
  white-space: nowrap;
}

.ticker-badge {
  padding: 4px 10px;
  background: #6366f1;
  border-radius: 4px;
  font-size: 0.75rem;
  font-weight: 700;
  text-transform: uppercase;
}

.ticker-badge.new { background: #10b981; }
.ticker-badge.hot { background: #ef4444; }
.ticker-badge.update { background: #f59e0b; }

Pause au hover

Une fonctionnalite essentielle pour l'UX : mettre en pause le defilement quand l'utilisateur survole le marquee. Cela permet de lire le contenu confortablement.

💡
Astuce UX

Ajoutez un leger changement visuel au hover (opacite, couleur de fond) pour indiquer a l'utilisateur que le marquee est interactif et qu'il peut le mettre en pause.

L'implementation est tres simple grace a animation-play-state :

pause-hover.css
/* Pause l'animation au survol du conteneur */
.marquee-container:hover .marquee {
  animation-play-state: paused;
}

/* Ou directement sur l'element anime */
.marquee:hover {
  animation-play-state: paused;
}

/* Feedback visuel optionnel */
.marquee-container:hover {
  background: rgba(99, 102, 241, 0.05);
}

Direction inverse et vitesses variables

Pour creer des compositions visuelles interessantes, combinez plusieurs marquees avec des directions et vitesses differentes. L'effet de parallaxe horizontal est tres efficace pour donner de la profondeur.

Direction inversee

Utilisez animation-direction: reverse pour inverser le sens du defilement :

React
Vue.js
Angular
Svelte
Next.js
Nuxt
TypeScript
Tailwind
Prisma
GraphQL
tRPC
Zod
direction-speed.css
/* Direction inversee */
.marquee-reverse {
  animation-direction: reverse;
}

/* Vitesses differentes */
.marquee-slow {
  animation-duration: 40s;
}

.marquee-fast {
  animation-duration: 15s;
}

/* Vitesse par defaut */
.marquee {
  animation-duration: 25s;
}

/* Combiner pour effet parallaxe */
.marquee-layer-1 { animation-duration: 30s; }
.marquee-layer-2 { animation-duration: 20s; animation-direction: reverse; }
.marquee-layer-3 { animation-duration: 25s; }

Vitesse adaptative au contenu

Pour une vitesse constante quelle que soit la quantite de contenu, calculez la duree en fonction de la largeur :

adaptive-speed.js
// Vitesse en pixels par seconde
const SPEED = 50; // px/s

function setMarqueeSpeed(marquee) {
  const track = marquee.querySelector('.marquee-track');
  const width = track.offsetWidth;
  const duration = width / SPEED;

  marquee.style.animationDuration = `${duration}s`;
}

// Appliquer a tous les marquees
document.querySelectorAll('.marquee').forEach(setMarqueeSpeed);

Responsive et accessibilite

Un bon marquee doit etre adaptatif et accessible. Voici les bonnes pratiques a suivre pour une experience optimale sur tous les appareils et pour tous les utilisateurs.

Responsive design

Adaptez la taille des elements et la vitesse selon la taille d'ecran :

responsive-marquee.css
/* Mobile : elements plus petits, vitesse reduite */
@media (max-width: 768px) {
  .marquee {
    animation-duration: 35s;
  }

  .logo-item {
    padding: 12px 20px;
    font-size: 0.9rem;
  }

  .text-marquee-item {
    font-size: 2.5rem;
  }

  .marquee-track {
    gap: 16px;
  }
}

/* Ecrans tres larges : vitesse augmentee */
@media (min-width: 1920px) {
  .marquee {
    animation-duration: 20s;
  }
}

Accessibilite

L'accessibilite est cruciale. Respectez les preferences utilisateur pour les animations :

accessibility.css
/* Respecter prefers-reduced-motion */
@media (prefers-reduced-motion: reduce) {
  .marquee {
    animation: none;
  }

  /* Afficher le contenu statiquement */
  .marquee-track[aria-hidden="true"] {
    display: none;
  }

  .marquee-container {
    overflow-x: auto;
  }
}

/* Masquer le contenu duplique pour les lecteurs d'ecran */
.marquee-track[aria-hidden="true"] {
  /* Deja gere par aria-hidden="true" */
}

/* Focus visible pour navigation clavier */
.logo-item:focus-visible {
  outline: 2px solid #6366f1;
  outline-offset: 2px;
}
⚠️
Attention aux animations automatiques

Les animations en mouvement continu peuvent causer des problemes pour les personnes souffrant de troubles vestibulaires. Toujours respecter prefers-reduced-motion et fournir un moyen de stopper l'animation.

Performance

Quelques conseils pour des marquees performants :

  • Utilisez transform plutot que left ou margin pour l'animation - cela declenche la composition GPU
  • Ajoutez will-change: transform pour preparer le navigateur a l'animation
  • Evitez trop d'elements dans un meme marquee - fusionnez les SVG si possible
  • Limitez le nombre de marquees simultanement animes sur la page
performance.css
.marquee {
  /* Optimisation performance */
  will-change: transform;
  backface-visibility: hidden;
  perspective: 1000px;
}

/* Desactiver will-change apres animation */
.marquee.loaded {
  will-change: auto;
}

Conclusion

Le marquee CSS moderne est un outil puissant pour ajouter du mouvement et de l'interet visuel a vos pages. En maitrisant la technique de duplication et les proprietes d'animation, vous pouvez creer des defilements fluides et professionnels.

Les points cles a retenir :

  • Dupliquez le contenu pour une boucle seamless parfaite
  • Utilisez translateX(-50%) pour l'animation
  • Ajoutez pause au hover pour une meilleure UX
  • Respectez prefers-reduced-motion pour l'accessibilite
  • Combinez directions et vitesses pour des effets creatifs
🎨
Allez plus loin

Retrouvez des marquees prets a l'emploi et personnalisables dans notre bibliotheque d'effets, avec code copiable en un clic.