3D✨ Premium

Perspective Tilt

Une carte indigo de 200 × 140 px s'incline vers le pointeur jusqu'à 12° sur ses bords, une tache de lumière glisse exactement sous la souris et le texte flotte 40 px en avant : elle répond aussi au doigt et aux flèches, chaque copie de la page a sa propre carte, et quand le système demande moins d'animation elle ne penche plus mais garde son reflet.

JS3DMouse

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

Plaque émaillée de rue sous la lumière — boutique d'un fabricant de plaques émaillées — Perspective Tilt exemple 1

① Plaque émaillée de rue sous la lumière — boutique d'un fabricant de plaques émaillées

QuandLa fiche produit montre la plaque bleue « Rue des Tanneurs » posée sur un mur de pierre ; quand la souris passe dessus, la plaque s'oriente vers elle et un reflet blanc glisse sur l'émail, puis elle revient à plat quand on la quitte.
PourquoiLe reflet qui suit exactement le pointeur rend la brillance de l'émail cuit, ce qu'une photo fixe ne montre pas. Une seule plaque, une seule matière : la grille de Parallax Tilt Gallery disperserait l'attention.
RéglagesCarte agrandie à 400 × 200 px, dégradé #2457b5 → #14336f, bord blanc de 7 px ; dégradé du ::before passé au blanc (rgba(255, 255, 255, .55), transparent à 46 %) ; racine sans fond posée sur le décor ; texte en Georgia 36 px. Inclinaison laissée à 12°.
Carte à collectionner d'une joueuse de volley — boutique d'un club de volley — Perspective Tilt exemple 2

② Carte à collectionner d'une joueuse de volley — boutique d'un club de volley

QuandLa boutique du club présente la carte n° 7, « Inès, passeuse, saison 2027 », au format carte à jouer ; la carte s'incline sous la souris et la lumière balaie sa surface brillante, le prix et le bouton d'ajout à côté.
PourquoiFaire miroiter une carte dans la lumière est exactement le geste du collectionneur. L'angle calculé en fraction de la carte garde la même inclinaison sur ce format portrait que sur la carte d'origine.
RéglagesCarte de 240 × 330 px en portrait, dégradé jaune → orange → rose → violet, bord crème de 6 px ; lumière blanche bleutée (rgba(255, 255, 255, .6) puis rgba(190, 240, 255, .18)) ; numéro en 96 px dans le contenu avancé de 40 px.
Plaque gravée d'un mécène — mur des donateurs en ligne d'un théâtre — Perspective Tilt exemple 3

③ Plaque gravée d'un mécène — mur des donateurs en ligne d'un théâtre

QuandSur la page des mécènes, la plaque laiton « Famille Martin — fauteuil 112 » est entourée des plaques des autres donateurs ; la souris fait jouer la lumière sur la gravure et incline la plaque.
PourquoiLe reflet localisé donne la sensation du métal gravé : le remerciement se regarde, il ne se lit pas comme un nom dans une liste. Le texte en relief, avancé de 40 px, accentue l'effet de gravure quand la plaque s'incline.
RéglagesCarte de 380 × 186 px, dégradé laiton #b48a35 → #e9cf83 → #9c7429, coins de 6 px ; lumière blanc chaud (rgba(255, 250, 225, .7)) ; texte brun #4d3708 avec deux ombres de 1 px pour l'effet gravé ; plaques voisines en décor, aria-hidden="true".

Comment ça marche

Sur le fond noir bleuté de .fx-0003-root (au moins 300 px de haut), un cadre .demo-3d de 280 × 200 px porte la carte .perspective-tilt : 200 × 140 px, dégradé #1e1b4b → #312e81, bord indigo translucide, coins de 1rem. Chaque racine reçoit sa propre instance du script, qui ne s'occupe que de sa carte. Quand le pointeur glisse sur la carte, sa position est ramenée de 0 à 1 en largeur et en hauteur, puis le script écrit transform: perspective(1000px) rotateX(…) rotateY(…) : le côté sous le pointeur vient vers vous, le côté opposé s'enfonce, jusqu'à 12° sur les bords. Relevé près du coin haut gauche (5 % du bord) : 11,0° et 10,6°, identiques sous Chromium 151 et Firefox 153. Les à-coups sont gommés par 0,1 s de transition ; quand le pointeur sort, la carte revient à plat.

La lumière est un pseudo-élément ::before étendu à toute la carte : un dégradé radial indigo (rgba(99, 102, 241, .3), transparent à 50 %) centré sur deux variables CSS, --mouse-x et --mouse-y, que le script met à jour en pourcentage. La tache suit donc le pointeur au pixel près, quelle que soit la taille de la carte, et elle reste au dernier point touché quand la carte se remet à plat. Le texte .perspective-tilt-content est avancé de 40 px (translateZ) dans une carte en transform-style: preserve-3d : il garde ce relief quand elle s'incline et glisse par rapport au fond, de 9,6 px avec le pointeur au bord droit (mesuré dans Chromium et Firefox).

Trois choix rendent la carte utilisable partout. Ce sont les événements pointer qui pilotent la carte, si bien qu'un stylet ou un doigt la font pencher comme la souris, et touch-action: none évite que la page défile quand le doigt glisse sur la carte ; elle revient à plat quand le doigt se lève. Grâce à tabindex="0", la carte prend le focus ; un role="group" et un aria-label la nomment. Au clavier, chaque flèche promène le reflet d'un dixième de carte, et Échap ou la sortie du focus la remettent à plat. Enfin l'angle est calculé en fraction de la carte, pas en pixels : agrandie à 400 × 200 px comme dans les scènes, elle ne dépasse toujours pas 12°, alors qu'un calcul en pixels doublerait l'angle à chaque doublement de largeur.

Accessibilité

  • Mouvement réduit : avec prefers-reduced-motion: reduce, la règle @media écrite sous .fx-0003-root bloque la carte à plat (transform: none, sans transition). La tache de lumière continue de suivre le pointeur, on garde l'indication de l'endroit visé sans mouvement dans l'espace. Vérifié sous les trois moteurs (Chromium, Firefox, WebKit) : 0° sous la souris, contre 11° sans ce réglage.
  • Clavier : la carte est un arrêt de tabulation ; au focus, un liseré lavande #a5b4fc de 2 px l'entoure (:focus-visible, 9,9:1 contre le fond). Quatre pressions sur → puis deux sur ↑ la penchent de 9,6° et 4,9° ; quitter le focus ou presser Échap la redresse.
  • Lecteurs d'écran : la carte est annoncée par son nom, aria-label="Tilt card: the arrow keys tilt it" posé sur un role="group", puis « Move Mouse » est lu. Sur un site français, écrivez ce nom en français. Si la carte mène quelque part, mettez un vrai lien dans son contenu.
  • Contraste : texte blanc sur #312e81 à 11,4:1 et sur #1e1b4b à 16:1. La tache indigo ne fait que l'éclaircir légèrement : gardez un texte clair si vous recolorez la carte en sombre.
  • Toucher : touch-action: none bloque le défilement de la page quand le doigt démarre sur la carte. À 200 × 140 px, c'est sans gêne ; pour une carte qui occupe toute la largeur d'un téléphone, passez à touch-action: pan-y : le défilement vertical revient, seul un glissé de côté incline la carte.

Compatibilité navigateur

CSS (transform avec perspective(), rotateX et rotateY, transform-style: preserve-3d pour le relief du texte, variables CSS dans un dégradé, touch-action, :focus-visible) + JS d'événements pointer, aucune dépendance. Mesuré dans Chromium 151 et Firefox 153 : même inclinaison, même tache de lumière, deux copies indépendantes sur une page, carte à plat sous mouvement réduit, inclinaison au doigt (Chromium en mode tactile). Le WebKit de Playwright (26.5) affiche bien l'inclinaison de la carte, mais il aplatit toute 3D imbriquée, même sur un cube de référence : le relief du texte n'a pas été vérifié sur un vrai Safari.

Chrome 55+✓ Complet
Firefox 59+✓ Complet
Safari 13+✓ Inclinaison mesurée sur WebKit ; relief du texte non vérifié sur un vrai Safari
Edge 79+✓ Complet
Mobile iOS 13+✓ Non vérifié sur un vrai iPhone
Android Chrome✓ Complet, au doigt

Sans transformations 3D, la carte reste à plat et seule la tache de lumière suit le pointeur. Sans :focus-visible (navigateur ancien), c'est le contour de focus par défaut du navigateur qui s'affiche.

Le code

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

index.html — structure
<div class="fx-0003-root">
  <div class="demo-3d">
    <div class="perspective-tilt" tabindex="0" role="group" aria-label="…">
      <span class="perspective-tilt-content">Move Mouse</span>
    </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
Inclinaison maximale (JS — MAX_TILT = 12) 12° Angle atteint sur les bords de la carte, quelle que soit sa taille. 6 donne un effet discret pour un bouton ou un visuel de produit ; au-delà de 20, le texte devient difficile à lire pendant le mouvement.
Perspective (JS — perspective(1000px) dans le transform) 1000px Plus la valeur est petite, plus la déformation est forte au même angle : 500px donne un côté proche nettement plus grand que le côté lointain. Changez-la aux deux endroits du script (inclinaison et remise à plat).
Relief du texte (CSS — translateZ(40px) de .perspective-tilt-content) 40 px Distance du texte devant la carte : 9,6 px de glissement mesuré au bord à 40 px. À 0, le texte reste collé à la carte ; au-delà de 60, il semble se détacher.
Lumière (CSS — radial-gradient du ::before) rgba(99, 102, 241, .3), transparent 50% Couleur et taille de la tache. Du blanc à .5 donne un reflet de matière brillante (émail, carte, métal) ; baissez le second pourcentage (30 %) pour une tache plus petite et plus nette.
Taille de la carte (CSS — .perspective-tilt, .demo-3d) 200 × 140 px dans un cadre de 280 × 200 px L'angle ne dépend pas de la taille. Agrandissez aussi .demo-3d ou retirez ses dimensions, sinon la carte déborde du cadre.
Réactivité (CSS — transition: transform .1s ease-out) 0,1 s 0,3 s donne une carte plus lourde qui rattrape le pointeur avec un temps de retard ; 0 la colle au pointeur sans aucun lissage.
Pas du clavier (JS — 0.1 dans l'écouteur keydown) 10 % de la carte par appui 0.25 atteint le bord en deux appuis ; gardez une valeur qui laisse voir le mouvement à chaque appui.

FAQ

La sortie remet seulement l'inclinaison à zéro : le reflet reste au dernier point touché, comme sur un objet qu'on vient de reposer. Pour le recentrer, ajoutez dans la fonction reset() du script card.style.setProperty('--mouse-x', '50%') et la même ligne pour --mouse-y.
Perspective Tilt est une seule carte qui suit le pointeur sur sa propre surface, avec un reflet et un texte en relief. Parallax Tilt Gallery fait réagir six tuiles d'une grille selon leur distance au pointeur : les proches basculent fort, les lointaines à peine. Une pièce à mettre en valeur : Perspective Tilt ; une collection à parcourir du regard : Parallax Tilt Gallery.
Oui. Chaque copie a sa racine .fx-0003-root, et le script en lance une par racine, sans aucun id. Essai avec deux copies sur la même page, dans les trois moteurs : seule la carte survolée bouge. Pour une rangée de cartes, mettez une racine par carte et collez le script une seule fois.