Galerie✨ Premium

Vertical Marquee

Une colonne de lignes qui monte doucement dans une fenêtre de hauteur fixe, en boucle continue, avec arrêt au survol et bouton Pause.

CSSVertical

Mis à jour le

Cet effet fait partie d'Effect.Labs — 840 effets vanilla, une partie gratuite, une partie premium. Galerie comprend 44 effets, dont 6 gratuits. Découvrir la catégorie →

3 exemples d'usage

Derniers inscrits d'une course nature — un encart à droite de la page d'inscription — Vertical Marquee exemple 1

① Derniers inscrits d'une course nature — un encart à droite de la page d'inscription

QuandSur la page du trail de la crête de Saunevre, la colonne de droite (108 px de large) fait monter les derniers inscrits avec leur ville et l'heure d'inscription, à côté de la distance, du dénivelé, de la jauge des dossards et du bouton « S'inscrire ».
PourquoiVoir d'autres coureurs s'inscrire rassure et pousse à le faire, sans pop-up ni compteur agressif. La colonne étroite ne prend presque rien à la page, et le bouton Pause, placé dans le titre de l'encart, ne mange pas la largeur des noms.
Réglagesdata-speed="16", --vtmq-window: 238px, --vtmq-align: left, --vtmq-size: 11.5px, --vtmq-space: 12px, --vtmq-height: auto, --vtmq-bg: transparent ; bouton placé en haut à droite de l'encart par la feuille de la page.
Prompteur d'une appli de tournage vidéo — le texte à lire monte au milieu de l'écran — Vertical Marquee exemple 2

② Prompteur d'une appli de tournage vidéo — le texte à lire monte au milieu de l'écran

QuandDans l'atelier vidéo de Parlhève, pendant la prise 3 d'une présentation du budget participatif, le discours monte en lignes de 20 px au centre de l'écran, entre deux repères de lecture orange ; la barre du bas affiche la vitesse, la vignette de la caméra et le bouton « Arrêter la prise ».
PourquoiC'est l'usage le plus direct de l'effet : un défilement continu à vitesse fixe en pixels par seconde, réglé sur le débit de parole, et un bouton Pause pour reprendre son souffle. Arrivé à la fin, le texte recommence au début, ce qui sert pour répéter avant la prise.
Réglagesdata-speed="24", --vtmq-window: 232px, --vtmq-size: 20px, --vtmq-space: 14px, --vtmq-color: #f4f1ea, --vtmq-button-size: 30px, --vtmq-height: auto, --vtmq-bg: transparent ; arrêt au survol désactivé dans cette scène (pointer-events: none sur .vtmq-viewport) pour qu'une souris posée sur l'écran ne fige pas le texte : seul le bouton Pause l'arrête ; bouton placé dans la barre de commandes et fondus haut et bas ajoutés par la feuille de la page.
Sujets sans réponse d'un forum de jardiniers — un encart de liens à côté de la discussion — Vertical Marquee exemple 3

③ Sujets sans réponse d'un forum de jardiniers — un encart de liens à côté de la discussion

QuandSur le forum d'entraide des jardiniers de Fanerolle, à droite d'une discussion sur le goutte-à-goutte, l'encart « Sans réponse » fait monter six questions en attente (tomates qui noircissent, taille des framboisiers, purin d'ortie…), chacune avec sa rubrique et son ancienneté ; chaque question est un lien.
PourquoiL'encart invite à aider sans prendre la place de la discussion : on voit passer une question qu'on sait résoudre, la souris posée arrête la colonne et un clic ouvre le sujet. Au clavier, Tab passe par les six liens, colonne immobile.
Réglagesdata-speed="30", --vtmq-window: 206px, --vtmq-align: left, --vtmq-size: 11.5px, --vtmq-space: 8px, --vtmq-color: #23412b, --vtmq-button-size: 20px, --vtmq-height: auto, --vtmq-bg: transparent ; un <a href> en carte blanche dans chaque <li>, bouton placé dans le titre de l'encart par la feuille de la page.

Comment ça marche

La fenêtre .vtmq-viewport mesure 120 px de haut (--vtmq-window) et cache ce qui dépasse. Dedans, la liste .vtmq-group contient vos lignes, écrites une fois. Le script compare la hauteur de la liste à celle de la fenêtre et empile sous elle le nombre de doubles nécessaire pour que la fenêtre soit toujours pleine, même avec trois lignes seulement ou une fenêtre agrandie à 400 px.

La piste monte d'une hauteur de liste, puis l'animation vtmq-scroll recommence : la ligne qui réapparaît en bas est un double, à la même place que l'original, d'où une boucle sans à-coup. La vitesse se règle en pixels par seconde dans data-speed (20 par défaut, soit une ligne de 39 px toutes les 2 secondes) ; data-direction="down" fait descendre la colonne.

Les lignes sont centrées (--vtmq-align accepte aussi left et right) ; l'ancienne version les collait au bord gauche de la zone. Si la hauteur des lignes change (police chargée tard, texte qui passe sur deux lignes dans une colonne étroite), un ResizeObserver refait le calcul ; si un script modifie la liste, les doubles sont reconstruits.

Accessibilité

  • Arrêt : la colonne s'immobilise tant que la souris est dessus, et le bouton rond Pause (aria-pressed) la fige jusqu'au clic suivant. C'est ce que demande WCAG 2.2.2 pour un mouvement automatique de plus de 5 secondes.
  • Lecture vocale : les doubles sont marqués aria-hidden="true" ; un lecteur d'écran annonce la liste de lignes une seule fois, comme une liste ordinaire (avant réparation : deux fois).
  • Clavier : un lien placé dans une ligne reçoit le focus dans la liste d'origine uniquement ; la colonne revient alors à sa position de départ, s'arrête et fait monter ou descendre la fenêtre jusqu'au lien. Elle repart quand le focus en sort.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, la colonne ne bouge plus seule, ne montre que la liste d'origine et devient une petite zone que l'on fait défiler au doigt ou à la molette ; quand la liste dépasse, la fenêtre reçoit aussi le focus au clavier (Tab) et se fait défiler aux flèches.
  • Contraste : le cyan #22d3ee sur #0a0a0f atteint 10,9:1.

Compatibilité navigateur

Animation CSS verticale (translateY vers une variable), 4,5 Ko de JavaScript commenté, aucune dépendance. ResizeObserver : Chrome 64, Firefox 69, Safari 13.1 ; prefers-reduced-motion : Chrome 74, Firefox 63, Safari 10.1. Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 : fenêtre toujours pleine, survol et bouton qui arrêtent la colonne, deux colonnes indépendantes dans la même page, 0 erreur.

Chrome 74+✓ Complet (mesuré)
Firefox 69+✓ Complet (mesuré)
Safari 13.1+✓ Complet (moteur WebKit mesuré)
Edge 79+✓ Complet (moteur Chromium)
Mobile iOS 13.4+✓ Complet (moteur WebKit mesuré)
Android Chrome 74+✓ Complet (moteur Chromium)

Sans JavaScript, la fenêtre affiche la liste immobile et se fait défiler à la main. Dans Safari avant 13.1 (pas de ResizeObserver), le nombre de doubles n'est recalculé qu'au redimensionnement de la fenêtre du navigateur.

Le code

Structure HTML à coller dans votre page (le CSS + JS sont inclus avec votre achat) :

index.html — structure
<div class="fx-0189-root" data-speed="20" data-direction="up">
  <div class="vtmq-band">
    <div class="vtmq-viewport">
      <div class="vtmq-track">
        <ul class="vtmq-group" role="list">
          <li>Première ligne</li>
          <li>Deuxième ligne</li>
        </ul>
      </div>
    </div>
    <button type="button" class="vtmq-toggle" aria-pressed="false" aria-label="Pause"></button>
  </div>
</div>

Paiement unique, sans abonnement — le code est à toi pour toujours

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
Lignes (HTML — les <li> de .vtmq-group) 4 lignes Texte, liens, pastilles ou petites images, écrits une fois. Les doubles sont fabriqués par le script.
data-speed 20 Pixels par seconde. Entre 12 et 25 pour qu'une ligne se lise avant de sortir.
data-direction up down : la colonne descend.
--vtmq-window 120px Hauteur de la fenêtre visible.
--vtmq-align center Alignement des lignes : left, center ou right.
--vtmq-color / --vtmq-size / --vtmq-space #22d3ee / 1.25rem / 1rem Couleur, taille du texte et espace entre deux lignes (identique au raccord).
--vtmq-height / --vtmq-bg / --vtmq-padding 180px / #0a0a0f / 1rem 0 Cadre de démonstration ; auto, transparent et 0 pour l'intégrer à une carte.
--vtmq-button / --vtmq-button-size rgba(255, 255, 255, .8) / 2rem Couleur et taille du bouton Pause.

FAQ

Oui : le script mesure la hauteur totale de la liste, pas celle d'une ligne. Une ligne sur deux lignes de texte ou une pastille plus haute ne cassent pas la boucle.
Ce n'est pas ce que fait cet effet : la colonne monte en continu. Pour un défilement par paliers (une ligne, une pause, la suivante), il faut une autre animation, par exemple des @keyframes à étapes écrits pour un nombre de lignes fixe.
Non : elle reste arrêtée jusqu'à un nouveau clic sur le bouton (son état est annoncé par aria-pressed). Seul l'arrêt au survol cesse quand la souris s'en va.