3D✨ Premium

Door Open Effect

Une porte de 150 × 180 px montée sur charnière à gauche pivote de 110° en 0,6 s et vient vers vous, dévoilant ce qu'elle cachait dans son cadre ; une fois ouverte, on voit son envers. Survol, Tab ou toucher l'ouvrent, sans JavaScript ; sous mouvement réduit, elle s'efface en fondu au lieu de pivoter.

CSS3DDoor

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 porte de la chambre « Glycine » s'ouvre sur la chambre — site d'une maison d'hôtes — Door Open Effect exemple 1

① La porte de la chambre « Glycine » s'ouvre sur la chambre — site d'une maison d'hôtes

QuandLa page des chambres de la Maison du Verger : trois portes peintes côte à côte, vert d'eau, rose et lavande, chacune avec sa plaque. En passant sur une porte, elle s'ouvre sur la chambre : « Glycine — lit 160, vue sur le jardin, 85 € la nuit ».
PourquoiOn entre dans la chambre comme dans la vraie maison : la charnière latérale est celle d'une porte, pas d'un rabat ni d'une carte.
RéglagesTrois copies de l'effet, portes de 140 × 212 px aux coins hauts arrondis, perspective de 1 200 px ; plaque de nom et poignée laiton dessinées en CSS, chambre crème derrière. La trajectoire de la capture passe sur chaque porte : elles s'ouvrent pour de vrai au passage du pointeur et débordent sur la voisine, comme dans un couloir.
Porte de placard d'un dressing sur mesure — configurateur d'un menuisier — Door Open Effect exemple 2

② Porte de placard d'un dressing sur mesure — configurateur d'un menuisier

QuandÉtape 3 du configurateur : la façade en chêne clair d'un dressing deux portes, dimensions et estimation à droite, bouton « Modifier l'intérieur » dessous. La porte de droite s'ouvre sur l'aménagement choisi : « 2 penderies · 4 tiroirs · 1 étagère à chaussures ».
PourquoiOuvrir la porte montre l'intérieur à sa place derrière la façade : le client comprend l'emplacement de chaque rangement.
RéglagesPorte de 148 × 174 px (perspective de 900 px) posée sur la moitié droite de la façade, la moitié gauche étant un panneau fixe dessiné : la porte s'ouvre par-dessus lui. Bois en repeating-linear-gradient, intérieur sombre #3a2f26 avec tringle, cintres et tiroirs. Hors de la trajectoire de la capture : la scène ouvre la porte d'elle-même en boucle (même transformation que le survol).
Le frigo de l'épicerie solidaire — ce qui reste aujourd'hui — Door Open Effect exemple 3

③ Le frigo de l'épicerie solidaire — ce qui reste aujourd'hui

QuandLa page d'accueil de l'épicerie : le frigo partagé dessiné au centre, un pense-bête « Ouvrez-moi ! » sur la porte. Elle s'ouvre sur l'inventaire du jour : « Yaourts (12) · Fromage râpé (4) · Soupes (6) — mis à jour à 11 h ».
PourquoiLa porte qu'on entrouvre reprend le geste qu'on fait devant le vrai frigo partagé ; l'inventaire reste caché tant qu'on ne regarde pas dedans.
RéglagesPorte de 150 × 172 px (perspective de 900 px), blanche avec poignée dessinée, intérieur bleu glacier #f2fbff → #dcecf3 ; bac à légumes et carrosserie du frigo en décor. Hors de la trajectoire de la capture : la scène ouvre la porte d'elle-même en boucle.

Comment ça marche

La racine .fx-0014-root (fond #0a0a0f, 300 px de haut au minimum) centre le cadre .door-container : 150 × 180 px, position: relative, perspective: 1000px et tabindex="0". Dedans, deux blocs se superposent : .door-content, le contenu derrière la porte (fond #1a1a2e, texte #6366f1), puis .door, la porte elle-même (dégradé #6366f1 → #4f46e5), placée au-dessus par z-index: 2. La porte tourne autour de son bord gauche (transform-origin: left center), comme sur ses gonds.

Au survol du cadre, ou quand il a le focus (:focus-within), la porte reçoit rotateY(-110deg) en 0,6 s : elle passe la perpendiculaire vers 0,3 s et s'arrête 20° plus loin, son bord libre venu vers vous. Comme elle s'approche, la perspective l'agrandit : mesurée dans Chromium 151, la porte ouverte occupe 72 px à gauche de la charnière et 210 px de haut, 15 px au-dessus et au-dessous du cadre. Elle n'a pas d'envers masqué : on voit son dos, avec son inscription à l'envers, comme celui d'une vraie porte.

Deux choix tiennent l'effet. Le survol est posé sur le cadre, qui ne bouge pas : sa zone de 150 × 180 px reste stable pendant que la porte tourne, et la porte ouverte, qui en est un enfant, garde le survol si le pointeur passe dessus. Et la porte s'ouvre hors de son cadre, sur la gauche : prévoyez environ 80 px libres de ce côté, sinon elle passe par-dessus l'élément voisin (c'est voulu dans la première scène ci-dessus, où trois portes se suivent dans un couloir).

Accessibilité

  • Clavier et toucher : le cadre a tabindex="0" et la règle :hover est doublée par :focus-within. Tab ouvre la porte, Tab suivant la referme ; un anneau de 2 px #a5b4fc (:focus-visible) marque le focus au clavier. Au doigt, un toucher l'ouvre, un toucher ailleurs la referme. Mesuré dans Chromium 151, Firefox 153 et WebKit 26. Un clic à la souris donne aussi le focus : la porte reste ouverte jusqu'au clic suivant ailleurs.
  • Mouvement réduit : sous prefers-reduced-motion: reduce, un bloc limité à .fx-0014-root retire la rotation (transform calculé : none) ; la porte s'efface en fondu de 0,3 s et laisse lire ce qu'elle cachait, sans rien qui sorte du cadre.
  • Ce que la porte cache : seulement à l'écran. Le contenu de .door-content est dans le HTML, avant la porte : les lecteurs d'écran le lisent en premier, porte ouverte ou fermée.
  • Contraste : texte de 16 px en demi-gras. Sur la porte, le blanc mesure 4,47:1 à 6,29:1 ; derrière, #6366f1 sur #1a1a2e ne fait que 3,82:1. Prenez #818cf8 (5,72:1) ou #a5b4fc (8,56:1) si le contenu caché porte une information.

Compatibilité navigateur

CSS seul (perspective, rotateY, transform-origin, :focus-within, :focus-visible), aucun JavaScript, aucune dépendance. Mesuré dans Chromium 151 et Firefox 153 : même ouverture, même débord à gauche, deux copies indépendantes sur une page, fondu sans rotation sous mouvement réduit. Le WebKit de Playwright (26.5) aplatit toute 3D CSS, même un cube de référence : focus et toucher y sont mesurés, le rendu 3D n'a pas été vérifié sur un vrai Safari.

Chrome 86+✓ Complet
Firefox 85+✓ Complet
Safari 15.4+✓ Focus et toucher mesurés sur WebKit ; rendu 3D non vérifié sur un vrai Safari
Edge 86+✓ Complet
Mobile iOS 15.4+✓ Non vérifié sur un vrai iPhone
Android Chrome✓ Complet, au toucher

Sans transformations 3D, la porte reste fermée et couvre son contenu. Sans :focus-visible, 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-0014-root">
  <div class="demo-3d">
    <div class="door-container" tabindex="0">
      <div class="door-content">… derrière la porte …</div>
      <div class="door">… façade …</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
Angle d'ouverture (CSS — rotateY(-110deg) de la règle de survol) −110° -90deg arrête la porte de profil : on ne voit plus que sa tranche. -70deg l'entrouvre. Au-delà de −130°, elle se rabat vers le mur et déborde davantage.
Côté de la charnière (CSS — transform-origin et signe de l'angle) left center, −110° Pour une porte qui s'ouvre à droite : transform-origin: right center et rotateY(110deg). Elle vient toujours vers vous et déborde alors du côté droit.
Sens d'ouverture (CSS — signe de l'angle) vers vous rotateY(110deg) avec la charnière à gauche fait partir la porte dans l'écran : elle rapetisse au lieu de grandir, son débord à gauche est plus court.
Perspective (CSS — perspective de .door-container) 1000px Plus petite, la porte grossit davantage en s'ouvrant et déborde plus. Pour une grande porte (300 px de large), passez à 1 800 px ou plus pour qu'elle reste dans la page.
Taille et durée (CSS — .door-container, transition de .door) 150 × 180 px, .6s La porte et le contenu suivent le cadre (100 %). .9s donne une lourde porte d'armoire, .4s un battant léger.
Couleurs et anneau de focus (CSS — .door, .door-content, :focus-visible) #6366f1 → #4f46e5, #1a1a2e / #6366f1, anneau #a5b4fc Donnez au contenu un fond nettement plus sombre que la porte : c'est l'ombre de l'intérieur. Sur une page blanche, prenez un anneau foncé.

FAQ

La porte n'a pas d'envers masqué : passé 90°, c'est son dos qu'on voit, avec le texte de la façade en miroir, comme on verrait le dos d'une vraie porte. Pour un dos uni, mettez le texte dans un enfant (<span>) avec backface-visibility: hidden et transform: translateZ(1px), et donnez transform-style: preserve-3d à la porte : le texte disparaît au passage de la perpendiculaire et le dos reste de la couleur de la porte. Mesuré dans Chromium et Firefox ; sans translateZ, Firefox garde le texte visible.
Elle vient vers vous et sort de son cadre par la gauche (72 px mesurés à la taille d'origine, plus si la porte est grande ou la perspective courte). Laissez cet espace libre, allongez la perspective, réduisez l'angle, ou faites-la partir dans l'écran avec rotateY(110deg).
Oui, avec deux copies côte à côte, chacune avec sa moitié du contenu. La copie de gauche reste telle quelle ; celle de droite reçoit transform-origin: right center et rotateY(110deg). Les deux battants s'ouvrent vers vous, chacun de son côté. Chaque copie a sa zone de survol : pour ouvrir les deux ensemble, mettez la règle de survol sur un parent commun.