Transitions✨ Premium

List Item Slide

Chaque nouvelle ligne entre par la gauche avec un léger dépassement (0,4 s) ; à la suppression, elle glisse de 60 px vers la droite en s'effaçant pendant que sa hauteur, ses marges et sa bordure se replient à zéro (0,4 s) : les lignes suivantes remontent en douceur au lieu de sauter. CSS et 2,9 Ko de JavaScript, fondus de 150 ms si l'utilisateur réduit les animations.

CSSStaggerCollapse

Mis à jour le

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

3 exemples d'usage

Médicaments du matin — pilulier connecté pour une personne âgée — List Item Slide exemple 1

① Médicaments du matin — pilulier connecté pour une personne âgée

QuandÀ 8 h, la tablette affiche les prises du matin ; une fois le paracétamol avalé, la personne touche le rond de la ligne, qui sort par la droite.
PourquoiLe repli de la ligne montre ce qui est fait sans que les autres lignes sautent sous le doigt d'une personne qui lit lentement : l'aspirine remonte à la place du paracétamol, en douceur.
RéglagesLibellés en 16 px gras, lignes de 268 px dans un panneau bleu nuit sur fond crème ; la croix devient un rond vert de 28 px ; à droite, le compteur de la semaine « 19 / 21 » et quatre cases de pilulier.
Appel des enfants au départ du car — appli d'un moniteur de colonie de vacances — List Item Slide exemple 2

② Appel des enfants au départ du car — appli d'un moniteur de colonie de vacances

QuandAu pied du car pour le lac d'Annecy, le moniteur pointe chaque enfant qui monte : « Hugo B. · 10 ans » sort de la liste, les noms suivants remontent.
PourquoiLes noms restants remontent doucement : le moniteur ne perd pas sa ligne pendant qu'il compte les têtes, et la liste ne garde que ceux qui manquent.
RéglagesPanneau sombre de 280 px sur un décor de car jaune, lignes bleu ciel, ronds bleus pour pointer ; carte « Dans le car 21 / 24 » à droite.
Check-list avant décollage — appli d'un pilote d'ULM — List Item Slide exemple 3

③ Check-list avant décollage — appli d'un pilote d'ULM

QuandMoteur au ralenti en bout de piste 27, le pilote valide « Harnais attachés » : la ligne glisse à droite et se replie, « Commandes libres » prend sa place en haut.
PourquoiLe glissement à droite puis le repli rendent chaque validation visible d'un coup d'œil, sans à-coup dans la liste quand on lit entre deux regards dehors.
RéglagesLignes en police à chasse fixe de 13 px sur fond ambre, ronds ambre ; panneau à liseré gris de 310 px ; jauges « Carburant 52 L » et « Vent piste 27 » à droite.

Comment ça marche

Le bloc .list-slide-root déclare son fond (#0a0a0f) et empile la liste .list-slide-container (260 px de large au plus, 6 px entre les lignes) au-dessus de deux boutons, « Ajouter » et « Réinitialiser ». Chaque ligne .list-slide-item porte son libellé et une croix .list-slide-remove ; fond indigo à 15 %, liseré indigo à 20 %, coins de 8 px, 40 px de haut. Au chargement, trois lignes arrivent l'une après l'autre, à 150 ms d'écart ; au-delà de cinq, l'ajout fait sortir la plus ancienne.

L'entrée est l'animation listSlideIn : 0,4 s de translateX(-40px) et opacité 0 jusqu'à la place, sur cubic-bezier(.34, 1.56, .64, 1), qui dépasse légèrement vers la droite avant de se poser. Mesuré 90 ms après le clic : 9 px avant la place et opacité 0,78 dans Chromium 151, 11 px et 0,72 dans Firefox 153. L'animation ne remplit qu'en arrière (backwards) : l'état de repos de la ligne est son état final, opacité 1 et aucune transformation, ce qui laisse la sortie libre de les animer. Une animation terminée en forwards garderait la main sur opacity et transform, et la ligne ne pourrait que se tasser sur place.

La sortie pose .list-slide-removing, qui déclare l'état d'arrivée avec transition: all 0.4s ease : max-height de 50 px à 0, marges intérieures verticales et bordure à zéro, opacité 0, translateX(60px). Mesuré 150 ms après le clic sur la croix : 37 px vers la droite, opacité 0,39 et 19 px de haut sur 40 dans Chromium, 35 px, 0,42 et 21 px dans Firefox, 38 px, 0,37 et 21 px dans WebKit 26. La ligne est retirée du DOM à 400 ms ; sa hauteur est alors nulle et les suivantes ont presque fini de remonter : seul l'écart de 6 px entre deux lignes disparaît d'un coup au retrait, un dernier saut de 3 à 8 px selon le navigateur. Un seul écouteur sur la liste gère toutes les croix, y compris celles des lignes ajoutées plus tard ; le script parcourt chaque .list-slide-root de la page, et les libellés de démonstration suivent la langue du bloc (data-lang, sinon le lang de la page).

Accessibilité

  • Mouvement réduit : sous prefers-reduced-motion, l'entrée devient un fondu de 150 ms (listSlideFade) et la sortie un simple effacement de 150 ms, sans glissement ni repli ; la ligne est retirée à 150 ms et les suivantes remontent d'un coup — mesuré dans Chromium : aucune transformation, hauteur intacte pendant l'effacement.
  • Croix nommée : chaque croix est un button avec aria-label « Retirer » suivi du libellé de la ligne (« Remove … » en anglais), le signe × seul ne disant rien à un lecteur d'écran. Elle mesure 17 × 18 px : sous les 24 × 24 px conseillés pour le doigt, portez padding à 6px 8px sur mobile.
  • Focus après suppression : le bouton qui avait le focus disparaît avec sa ligne, et le focus retombe sur la page. Dans une vraie liste, déplacez-le sur la croix de la ligne suivante (ou sur le titre de la liste) juste avant le retrait, et annoncez « Paracétamol retiré » dans une zone aria-live.
  • Contraste : libellés blancs à 17,3:1 sur le fond des lignes ; la croix au repos (blanc à 40 %) donne 3,8:1, suffisant pour une icône, et passe au rouge #ef4444 au survol.

Compatibilité navigateur

Animations et transitions CSS (max-height, padding, border-width, transform, opacity) et une soixantaine de lignes de JavaScript, aucune dépendance. Mesuré dans Chromium 151, Firefox 153 et WebKit 26 : même entrée avec dépassement, même sortie à droite avec repli, lignes suivantes qui remontent en continu, puis d'un saut de quelques pixels au retrait, fondus de 150 ms sous mouvement réduit. Le script utilise Element.closest et NodeList.forEach, présents depuis Chrome 51, Firefox 50 et Safari 10.

Chrome 51+✓ Complet
Firefox 50+✓ Complet
Safari 10+✓ Complet
Edge 79+✓ Complet
Mobile iOS 10+✓ Complet
Android Chrome 51+✓ Complet

Sans JavaScript, la liste reste vide et les boutons ne font rien : générez les lignes côté serveur et gardez un lien ou un formulaire de suppression classique. Avec le mouvement réduit, les lignes apparaissent et disparaissent en fondu de 150 ms.

Le code

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

index.html — structure
<div class="list-slide-root">
  <div class="list-slide-container">
    <!-- lignes créées par le script : -->
    <div class="list-slide-item">
      <span>Tableau de bord</span>
      <button class="list-slide-remove" type="button" aria-label="Retirer Tableau de bord">×</button>
    </div>
  </div>
  <div style="display:flex;gap:8px;">
    <button class="list-slide-btn list-slide-add" type="button">Ajouter</button>
    <button class="list-slide-btn secondary list-slide-reset" type="button">Réinitialiser</button>
  </div>
</div>
Débloquer le code complet — 9,90 € TTC/mois

Le code complet HTML + CSS + JS de List Item Slide, prêt à coller — et les 840 effets. Ou 299 € TTC une fois, accès à vie.

Personnaliser

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

Option / propriétéDéfautEffet
Entrée (CSS — listSlideIn, translateX(-40px)) 0,4 s depuis 40 px à gauche, dépassement translateY(-12px) fait tomber la ligne d'en haut ; ease-out à la place de la courbe supprime le dépassement. Gardez backwards, sinon la sortie ne glisse plus.
Sortie (CSS — .list-slide-removing) 0,4 s, 60 px vers la droite translateX(-60px) fait sortir à gauche, scale(.9) donne une ligne qui se rétracte. Si vous changez la durée, alignez le 400 du setTimeout de removeListItem.
Hauteur maximale d'une ligne (CSS — max-height: 50px) 50 px (une ligne fait 40 px) C'est la hauteur de départ du repli. Pour des lignes sur deux lignes de texte, passez à 80px ; trop haut (300 px), le repli paraît retardé, car il passe d'abord par des hauteurs qui ne coupent rien.
Nombre de lignes (JS — items.length >= 5) 5 au plus Au-delà, l'ajout fait sortir la plus ancienne. Supprimez ce bloc pour une liste sans limite.
Libellés (JS — objet NAMES) 8 libellés en français et en anglais Ils ne servent qu'à la démonstration : dans votre page, créez les lignes avec vos données, en gardant la structure <span> + button.list-slide-remove.
Cascade au chargement (JS — idx * 150) 3 lignes, 150 ms d'écart, départ à 400 ms idx * 80 donne une cascade plus serrée ; retirez le dernier setTimeout pour une liste vide au départ.

FAQ

Retirer une ligne du DOM fait remonter les suivantes de toute sa hauteur en une image : l'œil perd sa place. Ici la ligne s'efface d'abord en glissant, et sa hauteur, ses marges et sa bordure passent à zéro pendant ces 0,4 s ; quand le script la retire à 400 ms, elle ne prend presque plus de place : seul reste l'écart de 6 px entre deux lignes, rattrapé d'un petit saut. La transition passe par max-height et non height, car height: auto ne s'anime pas.
Stagger List fait sortir puis revenir toute une liste existante, élément par élément, avec 80 ms de retard de plus à chaque ligne : c'est un mouvement de tout le bloc. List Item Slide anime la vie de la liste ensuite : une ligne qu'on ajoute, une ligne qu'on supprime, et le resserrement des voisines. Les deux se combinent : Stagger List au premier affichage, List Item Slide pour chaque modification.
Dans l'écouteur de la liste, appelez votre API avant removeListItem : fetch('/api/items/' + id, { method: 'DELETE' }).then(function (r) { if (r.ok) removeListItem(item); });, avec l'identifiant posé en data-id sur la ligne. La ligne ne sort qu'une fois la suppression confirmée ; en cas d'échec, elle reste en place et vous pouvez afficher un message.