Galerie✨ Premium

Alternating Rows

Plusieurs rangées de mots superposées qui glissent en sens contraires, une sur deux vers la droite, avec un seul bouton Pause pour tout le bloc.

CSSMulti-row

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

Savoir-faire d'une agence — deux rangées géantes au pied du haut de page — Alternating Rows exemple 1

① Savoir-faire d'une agence — deux rangées géantes au pied du haut de page

QuandSur l'accueil de l'agence Plumerande, sous la phrase d'accroche et les chiffres (140 projets, 12 personnes), une bande noire fait croiser deux rangées de 31 px : identité visuelle, sites web, motion design d'un côté, accessibilité, design system, rédaction de l'autre.
PourquoiLes deux sens opposés donnent du rythme sans rien de tape-à-l'œil, et les six métiers tiennent dans la hauteur d'un bouton. Le blanc cassé et l'orange de la marque alternent d'une rangée à l'autre.
Réglagesdata-speed="45", deux rangées, --almq-size: 31px, --almq-space: 40px, --almq-color-1: #f2f0ea, --almq-color-2: #ff4d2e, --almq-bg: transparent ; point séparateur ajouté par la feuille de la page.
Mots-clés d'ateliers de céramique — trois mini-rangées au pied de chaque carte — Alternating Rows exemple 2

② Mots-clés d'ateliers de céramique — trois mini-rangées au pied de chaque carte

QuandDans l'agenda de l'atelier Grèsolie, chaque carte d'atelier (date, titre, places restantes, bouton « S'inscrire ») finit par trois rangées de 9,5 px en petites capitales : techniques, objets, pratique.
PourquoiUn détail de texture qui évoque les rayures d'un tour de potier, sans rien ajouter à lire d'urgent. Deux cartes côte à côte gardent chacune son bloc, son rythme et son bouton.
Réglagesdata-speed="22", trois rangées, --almq-size: 9.5px, --almq-space: 14px, couleurs terre (#9a6a4c, #b4532a, #6b7f5a), --almq-button-size: 18px, deux blocs dans la même page.
Arrêts d'une ligne de car — l'aller sur une rangée, le retour sur l'autre — Alternating Rows exemple 3

③ Arrêts d'une ligne de car — l'aller sur une rangée, le retour sur l'autre

QuandSur la fiche de la ligne 42 des cars Lunavère (Annecy ⇄ Thônes), sous le numéro de ligne et le bouton « Acheter un billet », la rangée bleue fait défiler les arrêts vers la droite et la rangée ambre les fait revenir vers la gauche.
PourquoiLe sens du mouvement dit le sens du trajet. Les étiquettes « Aller → » et « ← Retour » l'écrivent aussi en clair à gauche, pour qui ne voit pas le mouvement.
Réglagesdata-speed="30", data-direction="right" sur la rangée aller, "left" sur la rangée retour, --almq-size: 12.5px, --almq-space: 10px, --almq-color-1: #0b5cad, --almq-color-2: #b45309.

Comment ça marche

Chaque .almq-row est une bande complète : sa fenêtre, sa piste et sa liste, écrite une fois. Par défaut les rangées impaires partent vers la gauche et les paires vers la droite, à 50 px par seconde ; data-direction="left" ou "right" sur une rangée impose son sens, data-speed sur une rangée lui donne sa propre vitesse (une rangée lente, une rapide : c'était un autre effet du catalogue, c'est ici un simple attribut).

Le script traite les rangées une par une : il mesure la liste de chacune, ajoute ses doubles, puis règle sa durée pour que la vitesse en pixels par seconde soit tenue. Deux rangées de longueurs différentes avancent donc au même rythme, sans qu'aucune ne laisse de vide, même à 1 900 px de large où l'ancienne version se trouait au-delà de 600 px.

Le bloc .almq-rows réagit d'un seul tenant : la souris posée n'importe où arrête toutes les rangées, le bouton Pause aussi. Les couleurs viennent de --almq-color-1 à --almq-color-3 et se répètent toutes les trois rangées.

Accessibilité

  • Bouton Pause unique : un seul <button> à aria-pressed pour toutes les rangées, atteignable au Tab ; le survol du bloc arrête aussi tout (WCAG 2.2.2).
  • Une lecture par rangée : chaque rangée est une liste lue une fois ; ses doubles portent aria-hidden="true". Avant réparation, les trois rangées étaient lues deux fois chacune.
  • Sens des rangées : le sens est décoratif et n'est pas annoncé ; si le sens porte une information (aller et retour, par exemple), écrivez-la aussi en texte à côté des rangées.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, toutes les rangées s'immobilisent, sans doubles ni bouton, et chacune se fait défiler à la main ; une rangée qui dépasse reçoit aussi le focus au clavier (Tab) et se fait défiler aux flèches.
  • Liens : un lien de rangée qui reçoit le focus clavier immobilise tout le bloc, ramène les rangées à leur départ et fait glisser la sienne jusqu'à lui.

Compatibilité navigateur

Une animation CSS par rangée, sens inversé par animation-direction, 4,5 Ko de JavaScript commenté, aucune dépendance. ResizeObserver : Chrome 64, Firefox 69, Safari 13.1. Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 : trois rangées pleines à 390, 800 et 1 900 px, survol et bouton qui arrêtent les trois, deux blocs indépendants, 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, les rangées restent immobiles, chacune défilable à la main. Sans ResizeObserver, les doubles ne sont recomptés qu'au redimensionnement de la fenêtre.

Le code

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

index.html — structure
<div class="fx-0194-root" data-speed="50">
  <div class="almq-band">
    <div class="almq-rows">
      <div class="almq-row">
        <div class="almq-viewport">
          <div class="almq-track">
            <ul class="almq-group" role="list">
              <li>Premier mot</li>
              <li>Deuxième mot</li>
            </ul>
          </div>
        </div>
      </div>
      <div class="almq-row">
        <div class="almq-viewport">
          <div class="almq-track">
            <ul class="almq-group" role="list">
              <li>Autre rangée</li>
              <li>Sens inverse</li>
            </ul>
          </div>
        </div>
      </div>
    </div>
    <button type="button" class="almq-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
Rangées (HTML — les .almq-row) 3 rangées Autant de rangées que voulu ; chacune a sa propre liste, écrite une fois.
data-speed (racine ou rangée) 50 Pixels par seconde ; sur une rangée, il remplace celui de la racine.
data-direction (sur une rangée) alterné left ou right impose le sens de la rangée.
--almq-color-1, -2, -3 #6366f1, #d946ef, #22d3ee Couleur de chaque rangée, répétée toutes les trois rangées.
--almq-size / --almq-space 1.25rem / 4rem Taille du texte et écart entre deux éléments d'une rangée.
--almq-height / --almq-bg / --almq-padding 180px / #0a0a0f / 1rem 0 Cadre de démonstration ; auto, transparent, 0 pour le poser dans une carte.
--almq-button / --almq-button-size rgba(255, 255, 255, .8) / 2rem Couleur et taille du bouton qui arrête tout le bloc.

FAQ

Non : le survol et le bouton agissent sur le bloc entier, pour qu'on puisse lire n'importe quelle rangée. Pour des arrêts séparés, posez plusieurs racines .fx-0194-root d'une rangée chacune, l'une sous l'autre.
Ajoutez data-speed sur la rangée : <div class="almq-row" data-speed="120"> file à 120 px/s pendant que les autres gardent la vitesse de la racine.
Non. Chaque rangée est mesurée et complétée à part ; une rangée de deux mots et une de dix avancent à la même vitesse et restent pleines toutes les deux.