Chargement✨ Premium

Morphing Shape

50 × 50 px, dégradé #6366f1 → #d946ef, quatre formes en boucle de 2 s : cercle, carré, deux feuilles diagonales opposées — chaque état pivote d'un quart de tour. Pur CSS, zéro JavaScript.

CSSTransform

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

Écran d'attente d'un outil créatif — la forme fait office de logo animé — Morphing Shape exemple 1

① Écran d'attente d'un outil créatif — la forme fait office de logo animé

QuandSplash plein écran d'un éditeur de visuels ou d'un générateur d'images, entre le clic sur l'icône et l'ouverture de l'espace de travail (1–4 s, le temps de charger polices, calques et modules) : la forme de 50 px trône seule au centre du fond sombre, à côté du wordmark, sans barre de progression.
PourquoiCe loader n'est pas un anneau qui tourne : ses quatre états — cercle, carré, deux feuilles diagonales — sont des primitives géométriques nettes qui se lisent comme la construction d'un logotype, et chaque quart de tour repose le carré aligné sur la ligne de base du wordmark. À 50 px et avec son dégradé indigo → fuchsia d'origine, il tient la place d'un logo animé. Et comme il est 100 % CSS, il s'affiche dès la coquille HTML, avant même que le bundle JavaScript de l'éditeur — précisément ce que l'écran attend — soit arrivé.
RéglagesCode d'origine intact : width: 50px; height: 50px, linear-gradient(135deg, #6366f1, #d946ef), animation: 2s ease-in-out infinite — le ease-in-out marque chaque forme d'une courte pause, ce qui la laisse se lire comme un logo posé. Le conteneur porte role="status" aria-live="polite" ; le wordmark suit à 20 px dans un display: flex; align-items: center.
Zone de génération IA — attente de la première réponse — Morphing Shape exemple 2

② Zone de génération IA — attente de la première réponse

QuandInterface d'un assistant ou d'un générateur de texte : après l'envoi du prompt, avant que le premier token n'apparaisse, le loader s'affiche au centre de la zone de réponse.
PourquoiLes quatre formes discrètes (cercle, carré, deux diagonales) suggèrent des états de traitement successifs — plus expressif qu'un spinner uniforme. La palette indigo-violet correspond à la charte de nombreux produits IA.
Réglagesanimation-timing-function: linear pour un rythme mécanique régulier ; opacity: 0.8 pour l'atténuer dès que le texte commence à défiler ; taille conservée à 50 × 50 px.
Upload de fichier — indicateur centré dans la zone de dépôt — Morphing Shape exemple 3

③ Upload de fichier — indicateur centré dans la zone de dépôt

QuandZone de glisser-déposer (image, PDF, vidéo) : pendant le transfert vers le serveur, le loader remplace l'icône de dépose dans le rectangle pointillé.
Pourquoi50 × 50 px est proportionné pour une zone de dépôt de 200 × 120 px ou plus. Les formes qui se transforment signalent un traitement actif sans barre de progression quand la durée est imprévisible.
Réglageswidth: 48px; height: 48px ; animation-duration: 2.5s pour un rythme calme adapté à un transfert pouvant durer plusieurs secondes.

Comment ça marche

Un seul div.loader-morph de 50 × 50 px, coloré par linear-gradient(135deg, #6366f1, #d946ef) (indigo vers violet rosé), reçoit l'animation morphLoader en 2s ease-in-out infinite. Aucun JavaScript, aucun élément supplémentaire, aucun pseudo-élément.

L'animation @keyframes morphLoader définit quatre états : cercle à 0 %/100 % (border-radius: 50%, rotate(0deg)) ; carré à 25 % (border-radius: 0, rotate(90deg)) ; feuille diagonale A à 50 % (border-radius: 50% 0 — coins TL et BR arrondis à 50 %, TR et BL à 0 —, rotate(180deg)) ; feuille diagonale B à 75 % (border-radius: 0 50% — TR et BL arrondis à 50 %, TL et BR à 0 —, rotate(270deg)). Chaque étape de forme coïncide avec un quart de tour exact : le carré à 90° apparaît aligné avec les axes, sans inclinaison parasite. Le timing ease-in-out marque une courte pause à chaque forme avant la déformation suivante.

Accessibilité

  • prefers-reduced-motion absent du code : l'animation tourne en continu quelle que soit la préférence de l'utilisateur. Ajoutez dans votre CSS : @media (prefers-reduced-motion: reduce) { .loader-morph { animation: none; border-radius: 50%; } } — l'élément reste visible comme un disque coloré statique.
  • Rôle d'indicateur de chargement non déclaré : le code ne contient ni role="status", ni aria-busy, ni aria-live, ni texte alternatif. Enveloppez le div dans un conteneur role="status" aria-live="polite" aria-label="Chargement en cours" (ou posez aria-busy="true" sur l'élément qu'il couvre) pour que les lecteurs d'écran annoncent le début et la fin du chargement.
  • Contraste : #6366f1 sur fond sombre #0a0a0f mesure 4,4:1 et #d946ef mesure 3,7:1 — tous deux au-dessus du seuil de 3:1 pour les éléments graphiques (WCAG 1.4.11). Sur un fond clair, les deux couleurs passent sous 3:1 ; adaptez le gradient ou ajoutez un fond sombre au conteneur.
  • Élément non focalisable : le div n'est pas interactif et ne reçoit pas le focus clavier. Aucun libellé n'est nécessaire sur lui ; c'est le conteneur portant role="status" qui porte le nom accessible.

Compatibilité navigateur

Requiert @keyframes, border-radius en pourcentage, transform: rotate() et linear-gradient non préfixés. Zéro dépendance.

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

Sans animation (navigateurs anciens), l'élément est un carré fixe de 50 × 50 px avec le dégradé indigo-violet. Sans linear-gradient (IE 8 et antérieurs), l'élément est un carré vide sans fond visible.

Le code

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

index.html — structure
<div class="loader-morph"></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 — width et height) 50px Les deux valeurs sont couplées pour garder un carré. De 20 à 24 px il entre dans un bouton de 44 px ; à 80 px il convient à un grand indicateur de page.
Couleurs du dégradé (CSS — linear-gradient(135deg, #6366f1, #d946ef)) #6366f1 → #d946ef Remplacez les deux valeurs hex. Un dégradé blanc translucide convient à un bouton sombre ; une couleur plate (#6366f1, #6366f1) supprime le dégradé.
Durée (CSS — animation-duration dans .loader-morph) 2s 1 s = rythme vif pour les attentes courtes (< 500 ms) ; 3 s = allure posée pour une génération longue.
Timing (CSS — animation-timing-function dans .loader-morph) ease-in-out ease-in-out marque chaque forme d'une courte pause. linear donne un mouvement continu et uniforme, plus mécanique.
Forme carrée (CSS — border-radius: 0 à 25 %) 0 (angles vifs) Remplacez par 4px pour un carré à coins légèrement arrondis, intermédiaire perceptible entre le cercle et le carré strict.
Formes intermédiaires (CSS — 50% 0 à 50 %, 0 50% à 75 %) TL+BR arrondis puis TR+BL arrondis Remplacez 50% 0 par 50% 10% pour adoucir les coins vifs des feuilles diagonales. 30% 0 donne des demi-feuilles moins prononcées.
prefers-reduced-motion (CSS — à ajouter) absent du code Ajoutez @media (prefers-reduced-motion: reduce) { .loader-morph { animation: none; border-radius: 50%; } } pour immobiliser l'indicateur sur les systèmes qui le demandent.

FAQ

fx-0134 anime border-radius sur une carte interactive de taille variable — sans rotation, avec un clic pour étendre et du JavaScript. fx-0431 est un indicateur de chargement de 50 × 50 px piloté par une animation CSS à quatre états qui coordonnent simultanément border-radius et rotate(), sans aucun JavaScript ni interaction. Contexte (carte vs. loader), échelle et mécanique sont différents.
Les keyframes sont construits pour ça : chaque palier de 25 % du cycle correspond à 90° de rotation, soit 360° au total. Le carré apparaît donc toujours aligné avec les axes (aucune inclinaison parasite). Si vous décalez — par exemple rotate(45deg) à 25 % — le carré devient un losange et les feuilles diagonales apparaissent biaisées.
Le code ne contient aucune règle pour ce media. Ajoutez dans votre CSS : @media (prefers-reduced-motion: reduce) { .loader-morph { animation: none; border-radius: 50%; } }. L'élément reste visible comme un disque coloré fixe — présence confirmée sans mouvement.