3D✨ Premium

Bezier Curve

Une balle orange de 22 px fait l'aller-retour sur un arc de Bézier cubique en 2,5 s, ralentie aux deux bouts, avec les deux poignées et leurs points de contrôle dessinés en pointillés : on voit la courbe et sa construction, et une ombre au sol suit la balle en rapetissant quand elle monte — CSS seul, zéro JavaScript, balle posée au sommet si l'utilisateur réduit les animations.

CSSBezierAnimation

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

La poignée de Bézier expliquée — cours en ligne de dessin vectoriel — Bezier Curve exemple 1

① La poignée de Bézier expliquée — cours en ligne de dessin vectoriel

QuandLeçon 4 d'un cours sur l'outil plume : la colonne de gauche explique les ancres et les poignées, à droite la balle parcourt la courbe entre les deux poignées légendées « Poignée 1 » et « Poignée 2 ».
PourquoiC'est le seul effet du catalogue qui montre les points de contrôle à côté de la courbe : la balle fait la démonstration de l'outil plume, et l'élève voit que la courbe est attirée par les poignées sans jamais les toucher.
RéglagesRacine sans fond posée sur une toile à pointillés ; tracé, poignées et points renforcés en jaune #fbbf24 (points de 5 px de rayon) ; ancres carrées blanches aux extrémités ; légendes « Poignée 1 », « Poignée 2 », « Départ », « Arrivée » posées dans la scène.
La balle qui passe d'une main à l'autre — page d'une école de cirque — Bezier Curve exemple 2

② La balle qui passe d'une main à l'autre — page d'une école de cirque

QuandAnnonce du stage de jonglage des vacances de printemps pour les 8-12 ans : le texte et le bouton d'inscription à gauche, à droite une balle rouge qui passe d'une main dessinée à l'autre.
PourquoiL'aller-retour sur un arc, ralenti au-dessus de chaque main, est le geste de la cascade à une balle : l'enfant et ses parents reconnaissent l'exercice du premier jour.
RéglagesBalle recolorée en rouge (radial-gradient du #fca5a5 au #991b1b) ; tracé rose pâle ; poignées et points de contrôle masqués (display: none) ; ombre masquée (elle tomberait sur les paumes) ; deux mains en CSS posées sous les extrémités de l'arc.
Le tir en plombée — tutoriel d'un club de pétanque — Bezier Curve exemple 3

③ Le tir en plombée — tutoriel d'un club de pétanque

QuandFiche n° 3 des tutos du club : la boule part du cercle de lancer, monte très haut et retombe à côté du cochonnet, sur un terrain de gravier.
PourquoiLa parabole et ses poignées montrent la hauteur de lancer recherchée mieux qu'une phrase, et l'ombre qui rétrécit sur le gravier rend la hauteur lisible même quand on ne regarde que le sol.
RéglagesBoule acier (radial-gradient blanc → #475569) ; ombre recolorée en brun sombre rgba(60,45,25,.8) pour un fond clair ; tracé et poignées vert olive ; bande de gravier alignée sur le bas de la balle aux extrémités ; cochonnet et cercle de lancer dessinés en CSS.

Comment ça marche

La racine .fx-0033-root (fond #0a0a0f, 300 px de haut au minimum) centre une scène .mp-bezier-scene de 300 × 220 px. Un <svg> de la même taille y dessine trois choses en traits discrets : l'arc M30,190 C30,30 270,30 270,190 en pointillés, les deux points de contrôle (30,30) et (270,30), et les deux poignées qui les relient aux extrémités de l'arc. Par-dessus, deux div : .mp-bezier-shadow, l'ombre, et .mp-bezier-ball, la balle (dégradé #f59e0b → #f97316 et halo orange).

La balle reçoit offset-path: path("M 30 190 C 30 30 270 30 270 190"), le même tracé que le svg, et une animation qui fait passer offset-distance de 0 à 100 % en 2,5 s, ease-in-out, alternate : elle va, ralentit, repart en sens inverse. Le navigateur pose le centre de la balle sur le point du tracé ; la balle n'a donc pas de marge négative, et son centre reste sur la courbe dessinée (écart mesuré : 0,2 px au plus dans Chromium 151, Firefox 153 et WebKit 26, avec des positions identiques dans les trois). Le tracé est le même partout parce que le svg n'est pas étiré : 300 × 220 px pour un viewBox de 300 × 220.

L'ombre est une ellipse orangée de 32 × 8 px posée sous les extrémités de l'arc. Elle ne peut pas suivre la balle avec un second offset-path : offset-distance mesure la distance parcourue le long de la courbe, pas la position horizontale, et la balle monte presque à la verticale au départ. Ses images clés fx0033Shadow donnent donc, tous les 5 % du temps, la position horizontale de la balle déjà calculée sur la courbe, avec le ralenti ease-in-out inclus ; l'animation de l'ombre est linéaire, de même durée et en alternate. Écart mesuré entre la balle et son ombre : 0,1 px. En même temps, l'ombre passe de l'échelle 1 et 90 % d'opacité au sol à 0,5 et 40 % au sommet : c'est elle qui donne la hauteur.

Accessibilité

  • Mouvement réduit : sous prefers-reduced-motion: reduce, un bloc limité à .fx-0033-root arrête la balle au sommet de la courbe (offset-distance: 50%), entre les deux poignées, et l'ombre juste en dessous. Mesuré : 0 % de pixels changés en 0,8 s dans Chromium, Firefox et WebKit, contre 1,2 % en mode normal.
  • Contenu décoratif : la scène ne porte aucun texte ; le svg et les div vides sont ignorés des lecteurs d'écran. Si la courbe explique quelque chose (un outil de dessin, un geste sportif), écrivez l'explication à côté, comme dans les exemples ci-dessus.
  • Contraste : la balle orange se lit bien sur le fond sombre ; le tracé et les poignées sont volontairement pâles (12 % et 30 % d'opacité). Pour un cours où la construction compte, renforcez-les (voir « Personnaliser »).
  • Rythme : un aller ou un retour en 2,5 s, sans clignotement ; le mouvement reste dans un cadre de 300 × 220 px.

Compatibilité navigateur

CSS seul : offset-path: path(), offset-distance animé et une animation de transform pour l'ombre, aucun JavaScript, aucune dépendance. Mesuré dans Chromium 151, Firefox 153 et WebKit 26 (le moteur de Safari) : mêmes positions de la balle au demi-pixel près, même ombre, même arrêt sous mouvement réduit. Non vérifié sur un vrai Safari.

Chrome 55+✓ Complet
Firefox 72+✓ Complet
Safari 16+✓ WebKit 26 mesuré, Safari non vérifié
Edge 79+✓ Complet
Mobile iOS 16+✓ Non vérifié sur un appareil
Android Chrome✓ Complet

Un navigateur sans offset-path laisse la balle immobile en haut à gauche de la scène ; le tracé, les poignées et l'ombre (qui, elle, continue de glisser au sol) restent visibles.

Le code

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

index.html — structure
<div class="fx-0033-root">
  <div class="mp-bezier-scene">
    <svg viewBox="0 0 300 220" fill="none">
      <path d="M30,190 C30,30 270,30 270,190" … />   <!-- la courbe -->
      <circle … /> <circle … />                    <!-- points de contrôle -->
      <line … /> <line … />                        <!-- poignées -->
    </svg>
    <div class="mp-bezier-shadow"></div>
    <div class="mp-bezier-ball"></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
Couleur de la balle (CSS — .mp-bezier-ball) Dégradé #f59e0b → #f97316, halo orange Changez le background et la couleur du box-shadow. Sur fond clair, remplacez le halo par une petite ombre portée.
Ombre au sol (CSS — .mp-bezier-shadow) Ellipse orangée de 32 × 8 px Sur fond clair, passez le dégradé en brun ou gris sombre (rgba(60,45,25,.8)) : une ombre noire disparaît sur fond noir, d'où l'orangé par défaut. Pour la retirer, supprimez la div et sa règle.
Vitesse (CSS — 2.5s dans les deux animation) 2,5 s par trajet Changez la durée de la balle ET de l'ombre ensemble, sinon l'ombre se décale. 1,5 s donne un lancer vif, 4 s une démonstration lente.
Poignées et points de contrôle (HTML — circle et line du svg) Points de 3 px à 30 %, poignées à 8 % d'opacité Pour un cours, montez l'opacité ou recolorez-les ; pour un simple décor, masquez-les en CSS (display: none) : seule la courbe en pointillés reste.
Forme de la courbe (HTML + CSS) M30,190 C30,30 270,30 270,190 Le tracé est écrit trois fois : d du chemin svg, offset-path de la balle, et les images clés de l'ombre, calculées pour cette courbe. Si vous changez la courbe, changez les deux premiers et recalculez les images clés (position horizontale de la balle tous les 5 % du temps), ou retirez l'ombre.
Fond (CSS — .fx-0033-root) #0a0a0f Changez ou retirez le fond de la racine pour poser la scène sur votre page ; pensez alors aux couleurs du tracé et de l'ombre.

FAQ

Parce que la balle avance le long de la courbe, pas à vitesse horizontale constante : au départ elle monte presque à la verticale. Une ombre qui glisserait sur une ligne droite avec le même offset-distance se décalerait de 27 px au pire moment. Les 21 images clés donnent la vraie position horizontale de la balle, ralenti compris ; mesuré, l'ombre reste à 0,1 px sous la balle. Le prix : si vous changez la courbe ou le ralenti, il faut les recalculer.
animation-direction: alternate : un trajet sur deux se joue à l'envers, et le ralenti ease-in-out fait que la balle s'arrête presque à chaque extrémité. C'est le va-et-vient d'une balle qu'on se renvoie. Avec normal, la balle sauterait de l'arrivée au départ à chaque tour : ajoutez alors un fondu, ou préférez un tracé fermé.
Bezier Curve est le seul des trois qui montre la construction de la courbe : deux poignées et leurs points de contrôle, plus une ombre qui donne la hauteur. Path Drawing dessine le trait au fur et à mesure avec stroke-dashoffset ; Bounce Path enchaîne cinq rebonds de plus en plus bas. Pour expliquer une courbe, un geste ou une hauteur de lancer, c'est Bezier Curve.