Chargement✨ Premium

Cube Flip

Carré de 40 px, dégradé indigo → violet, deux culbutes de 180° enchaînées (axe X puis axe Y) en 1,2 s, perspective inline de 120 px — un seul div, zéro JS.

CSS3D

Vous aurez accès à la démo interactive avec un compte gratuit.

Cet effet fait partie d'Effect.Labs — 811 effets vanilla, une partie gratuite, une partie premium. Chargement comprend 29 effets, dont 4 gratuits. Découvrir la catégorie →

3 exemples d'usage

Bouton d'envoi de formulaire — état « traitement en cours » — Cube Flip exemple 1

① Bouton d'envoi de formulaire — état « traitement en cours »

QuandUn bouton « Envoyer » ou « Confirmer » remplace son libellé par le cube pendant que la requête HTTP est en vol.
PourquoiL'élément de 40 px s'insère dans un bouton de taille standard. Sa culbute mécanique — sans queue ni fioritures — communique « travail en cours » sans distraire l'œil du reste de l'interface. Un seul div remplace le libellé.
Réglageswidth: 28px; height: 28px pour tenir dans un bouton de 40 px de haut ; linear-gradient(135deg, #fff, #ddd) sur fond de bouton sombre, ou conserver #6366f1 → #8b5cf6 sur fond clair.
Console de build CI — le paquet s'assemble à côté du journal — Cube Flip exemple 2

② Console de build CI — le paquet s'assemble à côté du journal

QuandUne console de développement (pipeline CI, bundler, publication sur un registre de paquets) montre le cube en grand pendant que le journal de build défile : tant que le paquet n'est pas empaqueté, il culbute.
PourquoiLe carré est le glyphe du paquet — npm, Docker et tous les registres dessinent une boîte. Le voir culbuter sur deux axes, c'est voir le paquet se retourner pendant qu'on l'assemble : le sens se lit sans étiquette. Ses deux demi-tours mécaniques, un axe puis l'autre, répondent aux étapes discrètes du build (transformer, puis empaqueter) que le journal égrène à côté. Un anneau ou trois points diraient seulement « ça travaille » ; ici la forme dit ce qui travaille. Et l'élément plat en perspective 3:1 reste net à 72 px, là où un spinner agrandi ne serait qu'un grand cercle vide.
Réglageswidth: 72px; height: 72px pour que la culbute se lise à côté du journal ; perspective(216px) recopiée dans les trois images-clés (rapport 3:1 conservé, cf. Personnaliser) ; durée 1.2s et dégradé #6366f1 → #8b5cf6 laissés par défaut — sur le fond sombre de la console, le contraste tient 4,7:1.
Génération de contenu IA — indicateur dans une zone de réponse — Cube Flip exemple 3

③ Génération de contenu IA — indicateur dans une zone de réponse

QuandUn champ de réponse textuelle ou une zone d'image générée affiche le cube pendant que le modèle calcule.
PourquoiBasculer sur deux axes évoque une transformation en cours — une entrée qui devient une sortie. La mécanique est plus expressive qu'un cercle rotatif sur un produit technique. L'absence de JavaScript ne gêne pas : l'affichage et le masquage sont gérés par la logique de l'application.
Réglagesanimation-duration: 0.9s pour un rythme légèrement plus nerveux, perspective réduite à 80px pour un rendu 3D plus marqué, couleur adaptée au thème de l'interface.

Comment ça marche

L'effet tient en un seul élément : .loader-cube, carré de 40 × 40 px, fond linear-gradient(135deg, #6366f1, #8b5cf6) (indigo → violet). Aucun enfant, aucun JavaScript, aucune variable CSS.

L'animation cubeFlip (1,2 s, ease-in-out, infinite) découpe le cycle en deux phases égales de 0,6 s. Phase 1 (0 % → 50 %) : rotateX passe de 0° à −180° — le carré bascule vers l'avant, son bord supérieur vient vers le spectateur. Phase 2 (50 % → 100 %) : rotateX reste à −180°, rotateY passe de 0° à −180° — l'élément déjà retourné pivote sur l'axe vertical. La valeur perspective(120px) est inscrite dans la propriété transform de chaque image-clé, pas sur un parent : chaque instance a son propre point de fuite indépendant. Sur un élément de 40 px, le rapport perspective/taille est de 3:1 — net sans être caricatural.

Sans backface-visibility: hidden ni transform-style: preserve-3d, le dos de l'élément est visible à 180° — c'est le même dégradé retourné horizontalement (le coin indigo passe du haut-gauche au haut-droit). Mesuré dans Chromium : au passage par l'axe (~77° de rotation autour de X), la hauteur rendue de l'élément de 40 px tombe à 9 px et la largeur monte à 48 px sous l'effet du grossissement du bord proche par la perspective.

Accessibilité

  • prefers-reduced-motion absent du code : l'animation cubeFlip tourne en continu quelles que soient les préférences du système — mesuré : animationPlayState: running sous prefers-reduced-motion: reduce. À ajouter : @media (prefers-reduced-motion: reduce) { .loader-cube { animation: none; } }.
  • Le cube est purement visuel : pas de role, pas de texte, pas de région aria-live. En tant qu'indicateur de chargement, il doit être accompagné d'un texte masqué visuellement portant role="status" ou aria-live="polite" (exemple : <span class="sr-only" role="status">Chargement en cours…</span>). Posez aria-hidden="true" sur .loader-cube pour que les lecteurs d'écran ne remontent pas l'élément décoratif.
  • Contraste : le dégradé indigo (#6366f1) sur blanc ne passe pas 3:1 (≈ 2,6:1) — seuil des composants non textuels. Sur le fond sombre du code (#0a0a0f), il atteint 4,7:1. Sur une page claire, foncez les teintes (par exemple #4338ca → #7c3aed).
  • L'élément de 40 × 40 px n'est pas interactif. S'il est inséré dans un bouton, c'est le <button> qui porte le focus et l'étiquette ARIA — le cube reçoit aria-hidden="true".

Compatibilité navigateur

Requiert @keyframes, animation, transform: perspective() rotateX() rotateY() et linear-gradient. Aucune bibliothèque, aucune variable CSS, zéro JavaScript.

Chrome 36+✓ Complet
Firefox 16+✓ Complet
Safari 9+✓ Complet
Edge 12+✓ Complet
Mobile iOS 9+✓ Complet
Android Chrome✓ Complet

Sans rotateX/rotateY, le carré reste immobile en indigo. Sans @keyframes, même résultat — un carré statique visible.

Le code

Structure HTML à coller dans votre page (CSS + JS disponibles avec un compte premium) :

index.html — structure
<div class="loader-cube"></div>
🔒 Débloquer le code complet — à partir de 2,99 € le 1er mois

HTML + CSS + JS complet, prêt à coller — avec des centaines d'effets premium.

Personnaliser

Options passées à l'API ou attributs data-* :

Option / propriétéDéfautEffet
Taille (CSS — .loader-cube) 40 × 40 px Hauteur et largeur en px ou em. La perspective est en pixels absolus (120px) : si vous agrandissez fortement l'élément, augmentez-la en proportion pour conserver le même rapport de foreshortening.
Couleur de fond (CSS — background) linear-gradient(135deg, #6366f1, #8b5cf6) Dégradé ou couleur unie. La face arrière montre le même dégradé retourné horizontalement ; une couleur unie efface cet effet miroir.
Durée (CSS — animation: 1.2s …) 1,2 s Durée d'un cycle complet (deux culbutes). 0.8s = rythme pressé ; 2s = retournement lent et délibéré.
Progression (CSS — ease-in-out) ease-in-out Courbe appliquée aux deux phases indépendamment. linear donne une vitesse de rotation constante ; ease-in-out produit une accélération au centre de chaque demi-tour et un bref repos en face pleine.
Perspective (CSS — perspective(120px) dans chaque image-clé) 120 px (rapport 3:1 sur l'élément de 40 px) Distance d'observation simulée. 80px (2:1) = effet 3D très prononcé ; 200px (5:1) = rotation quasi isométrique, peu de foreshortening. Modifiez la valeur dans les trois images-clés (0 %, 50 %, 100 %) simultanément.
Dos visible (à ajouter — backface-visibility: hidden) dos visible (comportement CSS par défaut) Sans cette règle, la face arrière — le dégradé retourné — est visible à 180°. Avec backface-visibility: hidden, l'élément disparaît au passage par l'axe, créant un blanc net entre les deux orientations.
Réduction du mouvement (à ajouter) absent du code vendu @media (prefers-reduced-motion: reduce) { .loader-cube { animation: none; } } immobilise le cube. Alternative : passer la durée à 4s pour un mouvement très lent plutôt que de tout couper.

FAQ

Le terme décrit la forme (un carré, face d'un cube), pas une construction géométrique. Il n'y a ni transform-style: preserve-3d ni enfants. L'illusion 3D vient de perspective(120px) rotateX() rotateY() appliqués à un élément plat : quand il bascule, la perspective déforme sa projection et le comprime jusqu'à 9 px de hauteur au passage par l'axe. Le dos n'est pas une face distincte — c'est le même dégradé retourné.
Cube Grid est formé de neuf carrés indépendants qui pulsent en 2D (scale 1 → 0 → 1) avec des délais décalés — une grille qui s'agite. Cube Flip est un seul élément qui effectue une rotation 3D réelle en deux phases sur deux axes. Les techniques n'ont rien en commun : Cube Grid n'utilise pas perspective ni rotateX/rotateY, et Cube Flip n'a pas de grille ni de décalage temporel. À noter : le CSS vendu avec Cube Flip contient par erreur le code complet de Cube Grid (@keyframes cubeGridScale et les 11 règles .loader-cube-grid) — il peut être supprimé sans effet sur Cube Flip.
La propriété CSS perspective posée sur un parent crée un espace 3D partagé pour tous ses enfants — le point de fuite est unique, centré sur le parent. La fonction perspective() dans le transform crée un espace 3D propre à chaque élément, centré sur lui-même. Conséquence ici : deux instances de .loader-cube côte à côte ont chacune leur propre point de fuite et s'animent indépendamment, sans que la perspective de l'un ne déforme l'autre.