Utilitaires✨ Premium

Dashed Border March

Cadre en tirets SVG qui défilent en continu autour d'une boîte de n'importe quelle taille ; le trait s'éclaircit et s'épaissit au survol, au focus et au toucher.

SVGAnimationDash

Mis à jour le

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

3 exemples d'usage

Rectangle de sélection dans un éditeur photo — Dashed Border March exemple 1

① Rectangle de sélection dans un éditeur photo

QuandDans l'éditeur Clairvane, l'outil Sélection est actif : un rectangle en tirets qui défilent délimite une zone de la photo d'une falaise au couchant, et le panneau de droite affiche sa largeur et sa hauteur en pixels de l'image.
PourquoiLes « fourmis qui marchent » sont le code visuel connu de toutes les retouches photo : on comprend tout de suite qu'il s'agit d'une zone choisie, pas d'un objet. Le tracé qui suit la taille de la boîte permet de redimensionner la sélection sans recalculer le SVG.
RéglagesBoîte vide en position: absolute sur l'image, largeur et hauteur changées par la scène toutes les 650 ms avec une transition CSS de 0,45 s (le tracé suit à chaque image) ; coins presque droits avec rx="2" ry="2" sur le <rect>. --dsm-fill: transparent pour laisser voir la photo ; couleurs et vitesse par défaut.
Places encore libres sur un plan de table de mariage — Dashed Border March exemple 2

② Places encore libres sur un plan de table de mariage

QuandSur le plan de table de Lise et Aurèle au Domaine de Sarvillac, les places occupées portent un prénom ; les quatre places libres sont des boutons « + Place libre » cerclés de tirets, qui s'allument quand on les survole ou qu'on y arrive au clavier.
PourquoiLe pointillé dit « à remplir » sans un mot de plus, et le mouvement attire l'œil vers ce qui reste à faire parmi des cases toutes semblables. Comme chaque place est un vrai <button>, l'organisatrice peut les parcourir avec Tab.
Réglagesdsm-box posée sur un <button> de 36 px de haut dans une grille, une racine par place, --dsm-fill: transparent ; --dsm-color: #8b85f0, --dsm-color-active: #4f46e5, trait réduit à 2 px par la scène. La capture donne le focus à une place après l'autre, comme le ferait Tab.
Coupon de bienvenue d'une épicerie livrée à vélo — Dashed Border March exemple 3

③ Coupon de bienvenue d'une épicerie livrée à vélo

QuandEn haut de la page d'accueil de Pommeraude, à côté de la promesse « Votre premier panier, chez vous demain matin », un grand coupon -20 % avec son code BIENVENUE20 et un bouton « Copier le code » est entouré de tirets qui défilent.
PourquoiLe bord en pointillés rappelle le bon à découper du journal, et son mouvement lent suffit à faire du coupon l'élément le plus visible de la page, sans clignotement ni couleur criarde.
RéglagesBoîte de 250 px de large, contenu en colonne, fond blanc ; --dsm-color: #2f5d2a (vert de la marque) et --dsm-color-active: #b45f2b (terracotta) quand la souris passe dessus ou que le bouton reçoit le focus.

Comment ça marche

Un <svg> posé en absolu dans .dsm-box contient un seul <rect> de 100 % × 100 % aux coins arrondis de 12 px. Le SVG est décalé de 1,5 px vers l'intérieur et réduit de 3 px dans chaque sens (la moitié du trait de 3 px), avec overflow: visible : le contour tombe pile sur le bord de la boîte, quelle que soit sa largeur ou sa hauteur. Agrandissez la boîte, ajoutez-y du texte, le tracé suit sans une ligne de script.

Le trait violet #6366f1 est découpé par stroke-dasharray: 12, 8 (12 px de tiret, 8 px de vide). L'animation dsm-march fait glisser stroke-dashoffset de 0 à -40 en 1,5 s, en boucle linéaire : comme -40 vaut deux motifs complets, la reprise est invisible et les tirets semblent marcher autour du cadre.

Quand la boîte est survolée, qu'elle reçoit le focus (elle-même ou un lien, un bouton, un champ qu'elle contient : :focus-within) ou qu'on la touche du doigt, le trait passe en #a78bfa, monte à 4 px et prend une lueur drop-shadow de 6 px. Le toucher est géré par un petit script (0,8 Ko) qui pose la classe dsm-on au pointerdown d'un doigt ou d'un stylet et la retire au toucher suivant ailleurs dans la page.

Accessibilité

  • Décor muet : le SVG porte aria-hidden="true" et focusable="false" ; seul le contenu de la boîte est lu.
  • Clavier : la boîte de la démo est une <div>, elle ne reçoit donc pas le focus. Donnez la classe dsm-box à un <a href> ou à un <button>, ou placez-en un dedans : Tab allume alors le trait, et un contour de 2 px à 6 px de distance s'ajoute au :focus-visible de la boîte elle-même. Sur Safari macOS, Tab saute les liens tant que le réglage du système ne l'autorise pas (Option+Tab les atteint).
  • Toucher : un appui du doigt allume le cadre (classe dsm-on) jusqu'au prochain appui ailleurs, y compris dans WebKit où le survol n'existe pas.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, les tirets s'arrêtent net ; le cadre reste visible et change toujours de couleur à l'état actif.
  • Limite : hors de ce réglage, le défilement ne s'arrête jamais et n'a pas de bouton pause. Réservez-le à un ou deux éléments par écran.

Compatibilité navigateur

SVG et CSS (pointillés, animation de stroke-dashoffset, variables CSS), plus 0,8 Ko de JavaScript pour le toucher (Pointer Events : Chrome 55, Firefox 59, Safari 13). prefers-reduced-motion : Chrome 74, Firefox 63, Safari 10.1. Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 (Playwright) : deux copies dont la 2e survolée seule, boîte passée à 320×160 avec un tracé de 317×157, focus clavier par un lien, toucher, 390 px sans débordement, mouvement réduit sans aucune animation en cours, 0 erreur.

Chrome 74+✓ Complet (mesuré)
Firefox 63+✓ Complet (mesuré)
Safari 13+✓ Complet (mesuré dans WebKit)
Edge 79+✓ Complet (moteur Chromium)
Mobile iOS 13+✓ Moteur WebKit, non vérifié sur appareil
Android Chrome 74+✓ Complet (moteur Chromium)

Sans JavaScript : tout fonctionne sauf l'état actif au doigt sur une boîte qui n'est ni un lien ni un bouton. Sans prefers-reduced-motion (navigateurs anciens), les tirets défilent toujours.

Le code

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

index.html — structure
<div class="fx-0766-root">
  <div class="dsm-box">
    <svg class="dsm-svg" aria-hidden="true" focusable="false">
      <rect class="dsm-rect" width="100%" height="100%" rx="12" ry="12"></rect>
    </svg>
    …
  </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
Couleur des tirets (CSS — --dsm-color) #6366f1 Teinte du cadre au repos, réglée sur .fx-0766-root ou sur un parent.
Couleur active (CSS — --dsm-color-active et --dsm-glow) #a78bfa et rgba(99, 102, 241, .6) Couleur du trait et de sa lueur au survol, au focus et au toucher.
Vitesse (CSS — --dsm-speed) 1.5s Durée d'un cycle de 40 px. Plus la valeur est grande, plus la marche est lente.
Fond de la boîte (CSS — --dsm-fill) #0a0a0f Remplit l'intérieur du cadre, sous le texte blanc. Mettez transparent pour encadrer une image ou une zone de la page (comme le rectangle de sélection de l'exemple), et donnez alors au texte une couleur lisible sur ce fond.
Motif (CSS — stroke-dasharray de .dsm-rect et @keyframes dsm-march) 12, 8 et -40 Longueur du tiret et du vide. Gardez dans l'animation un multiple de leur somme (ex. 6, 6 et -24) pour une boucle sans saut.
Taille de la boîte (CSS — width / height de .dsm-box) 200 px de large, 120 px de haut au moins Toute taille fonctionne : le rectangle à 100 % suit la boîte.
Arrondi (HTML — rx / ry du <rect>, CSS — border-radius) 12 px Changez les deux ensemble ; rx="0" donne des angles droits.
État actif forcé (HTML — classe dsm-on sur .dsm-box) absente Allume le cadre en permanence, par exemple pour l'élément sélectionné. Le script ne retire que la classe qu'il a posée lui-même au toucher.

FAQ

Oui, sans JavaScript : le <rect> mesure 100 % d'un SVG calé en CSS sur la boîte, en retrait de la moitié du trait. Une boîte qui s'allonge avec son texte, passe en pleine largeur sur mobile ou s'anime en taille garde un contour exact. Si vous changez l'épaisseur du trait, ajustez le retrait (top, left et les deux calc() de .dsm-svg) à la moitié de la nouvelle valeur.
C'est là que commence le contour du rectangle. Le motif de 20 px ne tombe pas juste sur tous les périmètres : le dernier tiret est coupé à cet endroit. Il passe inaperçu en mouvement ; pour le faire disparaître, ajoutez pathLength="400" au <rect> (Chrome 57, Firefox 61, Safari 14) : le motif se répartit alors en 20 pas égaux, quelle que soit la taille (les tirets s'allongent sur une grande boîte).
Donnez la classe dsm-box directement au <a> de la carte (ou à un <button>), gardez le SVG en premier enfant et mettez votre contenu après. Le survol, le focus clavier et l'appui du doigt allument alors le même état, et la carte reste un vrai lien pour les lecteurs d'écran. Une racine .fx-0766-root par carte : le script du toucher ne prend que la première boîte de chaque racine.