3D✨ Premium

Path Drawing

Une courbe violette se dessine de gauche à droite sous un point qui la parcourt, puis s'efface quand il revient, en 3 s dans chaque sens : le trait naît exactement sous le point, à tout instant — CSS pur (stroke-dashoffset + offset-path) calé par pathLength="1", tracé complet et immobile si l'utilisateur réduit les animations.

CSSSVGDraw

Mis à jour le

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

3 exemples d'usage

Le trajet du pigeon voyageur depuis le lâcher — site d'un club colombophile — Path Drawing exemple 1

① Le trajet du pigeon voyageur depuis le lâcher — site d'un club colombophile

QuandLe club publie le résultat du concours « Lâcher : Orléans — Arrivée : Rouen », vainqueur en 3 h 12 sur 118 km ; sur une carte simplifiée (Loire, Seine, Chartres), le trait du vol se dessine derrière le pigeon, d'Orléans vers Rouen.
PourquoiLe trait qui naît sous le point raconte un vol en train de se faire, pas un itinéraire déjà connu : on suit le pigeon.
RéglagesScène retournée et agrandie par transform: scale(-1.4, 1.4) pour que le trajet aille du sud-est au nord-ouest ; trait ardoise #475569 de 2,4 px ; point gris de 12 px cerclé de blanc ; villes et fleuves posés hors de la scène, en coordonnées de la page.
La trace de la sortie VTT qui se dessine — page « Sorties » d'un club de VTT — Path Drawing exemple 2

② La trace de la sortie VTT qui se dessine — page « Sorties » d'un club de VTT

QuandLa page « Sorties » rejoue la sortie de dimanche : sur un fond de courbes de niveau, la trace orange se dessine du départ à l'arrivée derrière un point orange (le groupe), avec « 34 km » et « 780 m D+ » en encadré.
PourquoiRévéler la trace progressivement fait suivre la sortie comme un replay ; une trace statique se lit comme une carte, pas comme une sortie.
RéglagesTrait orange #ea580c de 3 px ; point de 13 px cerclé de blanc ; courbes de niveau, cotes et repères de départ et d'arrivée en SVG dans le repère de la scène, agrandie de 1,45.
Le geste de la lettre « l » cursive — appli d'apprentissage de l'écriture pour le CP — Path Drawing exemple 3

③ Le geste de la lettre « l » cursive — appli d'apprentissage de l'écriture pour le CP

QuandSur une page de cahier à lignes Seyès, la lettre « l » s'écrit toute seule : le point (le crayon) part de la ligne, monte en boucle, redescend et file à droite, et le trait bleu apparaît derrière lui. À côté : « À toi : suis le modèle ».
PourquoiMontrer le trait qui naît sous la pointe est exactement la démonstration du geste d'écriture : l'ordre et le sens du tracé comptent autant que la forme.
RéglagesAutre tracé, celui du « l », écrit à l'identique dans l'attribut d et dans offset-path ; pathLength="1" n'a pas à changer. Trait bleu #1d4ed8 de 4,5 px ; point sombre cerclé de jaune ; scène agrandie de 1,15.

Comment ça marche

Le bloc .fx-0039-root fait au moins 300 px de haut, fond #0a0a0f, et centre .mp-drawing-scene (300 × 220 px). La scène contient un <svg> de même taille (viewBox="0 0 300 220", 1 unité = 1 px) avec un seul tracé, M30,180 Q80,30 150,110 Q220,190 270,60 : deux arcs qui montent, redescendent et remontent, en violet #8b5cf6, 2 px, bouts arrondis. Il mesure 358 px. Par-dessus, un point violet de 10 px avec un halo, en position: absolute dans le coin haut gauche.

Le trait est dessiné par la technique du tiret : stroke-dasharray: 1 découpe la ligne en un tiret plein et un vide de même longueur, et stroke-dashoffset fait glisser ce motif. À 1, on ne voit que le vide ; à 0, le tiret couvre toute la ligne. L'attribut pathLength="1" sur le <path> fixe la longueur du tracé à 1, quelle que soit sa taille réelle : le tiret mesure donc exactement la ligne, sans calcul ni JavaScript, et une valeur de stroke-dashoffset de 0,4 veut dire « 60 % dessinés ».

Le point suit le même tracé, recopié dans offset-path: path(…), avec offset-distance de 0 à 100 %. Les deux animations, mpDraw pour le trait et mpOrbit pour le point, ont la même durée (3 s), la même courbe (ease-in-out) et le même aller-retour (alternate) : à chaque image, la part dessinée vaut la part parcourue. Mesuré dans Chromium, Firefox et WebKit : le bout du trait et le point avancent du même pourcentage (écart inférieur à 0,1 %), et le centre du point reste sur la ligne (moins de 0,1 px). Au retour, le trait s'efface derrière le point qui revient. Sous prefers-reduced-motion: reduce, un bloc limité à .fx-0039-root affiche le tracé entier et pose le point à l'arrivée.

Accessibilité

  • Mouvement réduit : sous prefers-reduced-motion: reduce, la courbe est entière et le point posé au bout, comme à la fin d'un tracé. Mesuré dans Chromium, Firefox et WebKit : 0 animation en cours, 0 % des pixels changent en 800 ms.
  • Information du tracé : si la ligne représente un trajet ou un itinéraire, donnez son départ, son arrivée et ses chiffres en texte (comme « Orléans → Rouen, 3 h 12 » dans le premier exemple) et mettez aria-hidden="true" sur la racine : un lecteur d'écran ne lit pas un dessin.
  • Contraste : le trait violet de 2 px sur #0a0a0f se voit bien ; sur un fond clair ou une carte, épaississez-le (3 à 5 px) et choisissez une couleur franche, en CSS (stroke, stroke-width).
  • Aucune interaction : l'effet ne réagit ni à la souris, ni au doigt, ni au clavier.

Compatibilité navigateur

CSS pur : stroke-dasharray et stroke-dashoffset animés, attribut SVG pathLength, offset-path: path(). Aucune dépendance, aucun JavaScript. Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 : trait et point synchronisés (écart inférieur à 0,1 %), point centré sur la ligne, arrêt sous mouvement réduit, deux copies indépendantes sur la page.

Chrome 55+✓ Complet
Firefox 72+✓ Complet
Safari 16+✓ Complet (mesuré sur WebKit 26.5)
Edge 79+✓ Complet
Mobile iOS 16+✓ Complet
Android Chrome✓ Complet

Sans offset-path (Safari avant 16), la courbe se dessine et s'efface normalement, mais le point reste immobile dans le coin haut gauche de la scène (mesuré en retirant la propriété) ; @supports not (offset-path: path("M 0 0")) permet de le masquer pour ne garder que le trait.

Le code

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

index.html — structure
<div class="fx-0039-root">
  <div class="mp-drawing-scene">                   <!-- 300 × 220 px -->
    <svg viewBox="0 0 300 220" fill="none">
      <path class="mp-drawing-path" pathLength="1"
            d="M30,180 Q80,30 150,110 Q220,190 270,60" …></path>
    </svg>
    <div class="mp-drawing-dot"></div>     <!-- même tracé dans offset-path -->
  </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
Tracé (HTML + CSS — attribut d et offset-path) M30,180 Q80,30 150,110 Q220,190 270,60 Écrivez le même tracé aux deux endroits, en coordonnées de la scène de 300 × 220 px. Grâce à pathLength="1", le trait reste calé sur le point sans rien recalculer, quelle que soit la longueur du nouveau tracé.
Durée (CSS — 3s dans les deux animation) 3 s par sens Changez-la sur le trait ET sur le point, sinon ils se décalent. Même règle pour la courbe de vitesse (ease-in-out).
Dessin sans effacement (CSS — alternate dans les deux animation) aller-retour Sans alternate, le trait se dessine puis disparaît d'un coup au début de chaque tour. Pour qu'il reste dessiné, utilisez animation-iteration-count: 1 et animation-fill-mode: forwards sur les deux.
Couleur et épaisseur du trait (CSS — .mp-drawing-path { stroke: …; stroke-width: … }) violet #8b5cf6, 2 px La règle CSS l'emporte sur les attributs du SVG. N'ajoutez pas votre propre stroke-dasharray : c'est lui qui dessine le trait.
Agrandir ou retourner (CSS — transform sur .mp-drawing-scene) aucun scale(1.5) agrandit ligne et trajectoire ensemble ; scale(-1, 1) fait partir le tracé de la droite. Ne changez pas seulement la largeur : offset-path est en pixels.
Point (CSS — .mp-drawing-dot) 10 px violet avec halo Le point s'oriente selon la courbe (offset-rotate: auto) : une icône de crayon ou d'oiseau suivra les virages ; offset-rotate: 0deg la garde droite.

FAQ

Pour dessiner une ligne au tiret, il faut un tiret aussi long qu'elle. Avec la longueur réelle (ici 358 px), il faudrait la mesurer, la recopier dans le CSS, et tout refaire à chaque changement de tracé ; un tiret trop long fait apparaître le trait en avance sur le point. pathLength="1" demande au navigateur de compter la ligne comme valant 1 : stroke-dasharray: 1 la couvre exactement, et le trait avance du même pourcentage que offset-distance, pour n'importe quel tracé.
SVG Path Follow montre une courbe déjà tracée, en pointillés, sur laquelle un point fait la navette avec deux échos : un va-et-vient sur un trajet connu. Path Drawing fait naître la ligne sous le point puis l'efface : un tracé en train de se faire (un vol, une trace GPS, un geste d'écriture).
Pas dans ce code, qui tourne en boucle dès l'affichage. Mettez animation-play-state: paused sur le trait et le point, puis, avec un IntersectionObserver, passez-les à running quand le bloc entre à l'écran ; ajoutez animation-iteration-count: 1 et animation-fill-mode: forwards pour que le tracé reste dessiné.