Distorsion✨ Premium

Dot Matrix Printer

Un ticket de papier perforé dont les lignes s'impriment une à une, dans l'ordre, puis se réimpriment chaque fois que le ticket revient à l'écran.

CSSAnimationPrint

Mis à jour le

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

3 exemples d'usage

Ticket qui sort après « Payer » sur la borne d'un food-truck — Dot Matrix Printer exemple 1

① Ticket qui sort après « Payer » sur la borne d'un food-truck

QuandSur la borne d'un camion-cuisine, le client vérifie sa commande et touche « Payer 22,00 € » : le ticket apparaît sous la fente de l'imprimante et imprime son numéro de commande, les articles, le total puis « MERCI ».
PourquoiL'impression ligne par ligne confirme le paiement de façon concrète, comme une vraie borne ; le numéro de commande, imprimé en premier, est ce que le client doit retenir.
Réglages--dmp-w: 226px, --dmp-size: 11.5px, --dmp-start: .15s, --dmp-gap: .28s ; colonnes alignées par la scène (white-space: pre sur les lignes). Le clic ne fait qu'afficher la racine, masquée avant.
Relevé de la nuit d'une station météo, imprimé quand on descend jusqu'à lui — Dot Matrix Printer exemple 2

② Relevé de la nuit d'une station météo, imprimé quand on descend jusqu'à lui

QuandSur la page d'une station météo de montagne, la température actuelle et la courbe de la nuit occupent le haut. En descendant, le visiteur arrive au relevé imprimé : six lignes, heure par heure, qui s'impriment à son arrivée.
PourquoiLe rejeu à l'arrivée à l'écran donne vie à un tableau de mesures autrement austère ; l'allure de listing papier colle à l'idée d'un appareil qui enregistre toute la nuit.
Réglages--dmp-w: 100%, --dmp-size: 12.5px, --dmp-start: .1s, --dmp-gap: .3s, six lignes. Dans la scène, un clic fait défiler le panneau jusqu'au relevé ; c'est l'IntersectionObserver de l'effet qui relance l'impression.
Listing papier en fond de la section « Notre histoire » — Dot Matrix Printer exemple 3

③ Listing papier en fond de la section « Notre histoire »

QuandSur le site d'un éditeur de logiciels pour artisans, la section « Notre histoire » est posée sur un grand listing papier qui imprime un programme en BASIC de 1983 ; l'encart opaque à droite porte le titre, le récit et trois dates.
PourquoiLe listing raconte l'origine de l'entreprise sans photo : on voit naître le premier programme pendant qu'on lit l'histoire. L'encart opaque garde le texte lisible au-dessus du papier.
RéglagesRacine en position: absolute; inset: 0, papier en height: 100%, --dmp-w: 100%, --dmp-size: 13px, --dmp-gap: .24s, huit lignes (le maximum prévu sans réglage par ligne).

Comment ça marche

.dmp-paper dessine le papier : fond ivoire, bord gris, marge rouge à 20 px du bord gauche, et deux colonnes de 16 trous d'entraînement (.dmp-holes-l, .dmp-holes-r). Les lignes de texte, en Courier New 13 px, sont rangées dans .dmp-lines.

Chaque .dmp-line démarre invisible et suit l'animation dmpPrint (0,3 s) : elle apparaît en remontant de 4 px. Son départ vaut --dmp-start + rang × --dmp-gap, soit 0,5 s, 1,2 s, 1,9 s, 2,6 s, 3,3 s pour les cinq lignes fournies ; le rang est posé sur les huit premières lignes. L'ancienne version comptait les colonnes de trous parmi les lignes : les lignes 4 et 5 s'affichaient dès le chargement, avant les trois premières. C'est corrigé.

Un petit script observe chaque ticket avec un IntersectionObserver (seuil 30 %) : quand le ticket revient à l'écran, ses lignes sont remises à zéro et l'impression rejoue. Chaque copie de l'effet est suivie séparément ; le script n'ajoute rien à window et ne tourne pas en boucle.

Accessibilité

  • Texte réel : toutes les lignes sont dans le HTML dès le départ ; un lecteur d'écran les lit sans attendre l'impression. Les trous, décoratifs, portent aria-hidden="true".
  • Contraste : encre #333 sur papier ivoire, rapport d'environ 12:1.
  • Réduire les animations : sous prefers-reduced-motion: reduce, le ticket s'affiche complet d'un coup ; le rejeu au retour à l'écran n'a plus d'effet visible.
  • Rien à manipuler : l'effet ne crée aucun élément focalisable. Le rejeu dépend du défilement, jamais d'un survol.

Compatibilité navigateur

CSS + 0,7 Ko de JavaScript, sans dépendance. La fonction la plus récente est IntersectionObserver (Chrome 51, Firefox 55, Safari 12.1 d'après les données MDN) ; sans elle, l'impression joue une fois au chargement. Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 : à 1 s seule la ligne 1 est visible, à 3,8 s les cinq lignes, dans l'ordre ; avec deux tickets, faire revenir le second ne relance que le second.

Chrome 51+✓ Complet (mesuré)
Firefox 55+✓ Complet (mesuré)
Safari 12.1+✓ Complet (mesuré sous WebKit)
Edge 79+✓ Complet
Mobile iOS 12.2+✓ Complet
Android Chrome 51+✓ Complet

Sans JavaScript, l'impression joue une fois au chargement, même si le ticket est hors de l'écran. Sans animations CSS, les lignes resteraient invisibles : la règle de mouvement réduit les affiche ; pour un texte toujours visible, retirez l'animation de .dmp-line.

Le code

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

index.html — structure
<div class="fx-0278-root">
  <div class="dmp-paper">
    <div class="dmp-holes dmp-holes-l" aria-hidden="true">
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
    </div>
    <div class="dmp-holes dmp-holes-r" aria-hidden="true">
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
      <span></span>
    </div>
    <div class="dmp-lines">
      <div class="dmp-line">INVOICE #00142</div>
      <div class="dmp-line">Date: 1989-03-15</div>
      <div class="dmp-line">Item: Floppy Disk x10</div>
      <div class="dmp-line">Total: $24.99</div>
      <div class="dmp-line">*** THANK YOU ***</div>
    </div>
  </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 — <div class="dmp-line"> dans .dmp-lines) 5 lignes Jusqu'à 8 lignes s'enchaînent toutes seules ; au-delà, donnez le rang : style="--dmp-i: 8". Pour aligner des colonnes, ajoutez white-space: pre.
Rythme (CSS — --dmp-start, --dmp-gap) 0,5 s puis 0,7 s entre deux lignes 0,1 s et 0,25 s pour un ticket de caisse rapide ; 1 s d'écart pour une imprimante lente et bruyante.
Largeur (CSS — --dmp-w) 280 px 100% remplit le parent ; avec une hauteur fixée sur .dmp-paper, le papier couvre toute une zone.
Papier et encre (CSS — --dmp-paper, --dmp-ink) ivory, #333 Papier vert d'imprimante #e8f3e3, encre violette #4c1d95 pour un tampon de caisse.
Taille du texte (CSS — --dmp-size) 13 px 11 à 12 px dans un ticket étroit ; l'interligne reste au double de la taille.
Rejeu au retour à l'écran (JS — seuil threshold) 0.3 (30 % du ticket visible) 0.6 attend que le ticket soit bien visible ; supprimez le script pour une impression unique au chargement.
Cadre de démonstration (CSS — --dmp-page, --dmp-root-h) #0a0a0f, 300 px de haut au minimum transparent et 0 pour poser le ticket dans votre page.

FAQ

C'est voulu : à chaque retour du ticket à l'écran (30 % visible), le script remet ses lignes à zéro. Si vous voulez une seule impression, retirez le JavaScript ; l'animation CSS jouera une fois au chargement.
Oui : gardez le ticket en display: none et affichez-le au moment voulu. Un élément qui devient visible rejoue ses animations CSS : les lignes s'impriment alors depuis la première.
Non. Chaque racine .fx-0278-root a son propre observateur ; faire revenir un ticket à l'écran ne relance que lui. L'ancienne version ne suivait que le premier ticket de la page.