GlassmorphismGratuit

Squircle Cards

Trois cartes de 110 px découpées en vraie superellipse (|x|⁴ + |y|⁴ = 1, 64 points en clip-path: polygon()), chacune posée sur une ombre floue de sa propre couleur : la courbe continue des icônes de téléphone, en CSS seul, sans SVG ni identifiant.

SVGClip-pathHover

Mis à jour le

⚙Settings
♥Health
★Photos
Survolez ou cliquez la scène pour interagir

Cet effet est gratuit — la catégorie Glassmorphism en contient 47 au total, dont 6 gratuits. Effect.Labs regroupe 840 effets vanilla. Découvrir la catégorie →

Exemples d'usage

Malik · 2 prêts

Rayons

📖Romans4 210 titres
💬BD1 870 albums
🧸Jeunesse3 045 titres
🎧Musique980 CD et vinyles

Nouveautés de la semaine : 38 titresRetour avant le 12 novembre

① Rayons de la médiathèque — appli d'une bibliothèque municipale

QuandAccueil de l'appli : Romans, BD, Jeunesse, Musique, chacun dans une tuile de couleur, sous la recherche et au-dessus de la date de retour des prêts.
PourquoiLa courbe continue de la superellipse est celle des icônes du téléphone : les quatre rayons se lisent comme des applis qu'on touche, pas comme des boutons de site. L'ombre de la même couleur détache chaque tuile du fond papier sans cadre ni trait.
RéglagesQuatre cartes de 110 px au lieu de trois, gap: 16px ; couleurs passées par --sqc-from / --sqc-to sur chaque enveloppe (#6d28d9, #be123c, #0f766e, #1d4ed8 en départ, pour un texte blanc au-dessus de 5:1) ; nombre de titres en small sous le nom du rayon.
TC des PeupliersTennis club · 6 courts en terre battue
Licence 2026-27 ✓

Bonjour Maëlle — les courts 2 et 5 sont libres à 18 h

🎾Réserver un court2 libres à 18 h
🏆Tournoi d'automneInscriptions → 8 nov.
🧢École de tennisGroupe du mercredi 14 h

Courts ouverts de 8 h à 22 hTerrain sec · 14 °C

② Raccourcis d'un club de tennis — appli du club

QuandLe joueur ouvre l'appli du club : réserver un court, s'inscrire au tournoi d'automne ou retrouver l'école de tennis, sur le fond terre battue du club.
PourquoiTrois grosses tuiles à toucher au pouce, qui ressemblent aux icônes de son téléphone : il n'y a rien d'autre à lire. La superellipse en pourcentages suit la taille : agrandie à 142 px, la forme reste la même, sans recalcul.
Réglages.squircle-card et son enveloppe passées à 142 × 142 px, icône à 2,3 rem, libellé à 14 px ; vert #15803d, bleu nuit #1e3a8a, violet #7e22ce en départ de dégradé ; une ligne de disponibilité (« 2 libres à 18 h ») sous chaque libellé.
Atelier Garance

Choisir par matière

Collection d'automne : 42 pièces cousues à Roubaix et à Cholet

🌾Lin14 pièces
🧶Laine recyclée11 pièces
🌱Coton bio17 pièces

Fabriqué en FranceRéparation offerte 2 ansRetour sous 30 jours

③ Catégories d'une boutique de mode éthique

QuandEn haut de la boutique, sous le titre « Choisir par matière » : Lin, Laine recyclée, Coton bio, avec le nombre de pièces de chaque matière.
PourquoiLa forme douce et précise sert une marque soignée ; les coins superelliptiques évitent l'aspect « bouton web par défaut » d'un simple border-radius. Les teintes naturelles (pierre, terre cuite, olive) passent par deux variables, sans toucher au CSS.
RéglagesCartes de 128 px, gap: 24px ; --sqc-from / --sqc-to : #57534e → #a8a29e (lin), #9a3412 → #ea580c (laine), #3f6212 → #84cc16 (coton) ; fond en toile de lin dessinée par deux repeating-linear-gradient.

Comment ça marche

Chaque carte .squircle-card (110 × 110 px, dégradé à 135°, texte blanc de 12 px en graisse 600) est découpée par clip-path: var(--sqc-squircle). La variable, déclarée sur la carte elle-même, contient un polygon() de 64 points en pourcentages calculés sur la superellipse d'exposant 4 : la courbure varie sans à-coup du côté vers le coin, là où un border-radius enchaîne une droite et un quart de cercle. La forme retire 7,3 % de la surface de la boîte (calcul) ; au coin, le bord passe à 8,8 px de l'angle sur chaque axe. Mesuré dans Chromium 151, Firefox 153 et WebKit 26 : le point situé à 2 px du coin ne reçoit pas le clic, il tombe sur le parent. En pourcentages, la forme suit la taille de la carte : à 142 px dans la deuxième scène, elle reste une superellipse.

Les couleurs passent par deux variables posées sur l'enveloppe .squircle-card-shadow : style="--sqc-from: #6366f1; --sqc-to: #8b5cf6;". La carte peint linear-gradient(135deg, var(--sqc-from), var(--sqc-to)) var(--sqc-from) — un dégradé posé sur une couleur unie, ce qui garde le texte blanc lisible là où les dégradés ne s'affichent pas. L'ombre est le ::after de l'enveloppe : 94 × 20 px, 6 px sous la carte, même dégradé, border-radius: 50%, filter: blur(12px), opacité 0,4, z-index: -1 ; isolation: isolate sur l'enveloppe la garde au-dessus du fond de la page. Au survol, la carte monte de 4 px, grossit de 8 % et s'éclaircit de 15 % en 0,4 s, avec un léger rebond (cubic-bezier(0.34, 1.56, 0.64, 1)).

Pourquoi la forme est écrite dans le CSS (--sqc-squircle: polygon(…)) plutôt que dans un <clipPath> SVG appelé par clip-path: url(#squircle) : un tel appel ne marche que si le SVG est présent dans la page, avec un id unique ; sans lui, les cartes s'affichent en carrés (mesuré : 0 % de surface découpée, coin cliquable). En CSS, rien à ajouter, et plusieurs effets collés dans la même page ne peuvent pas entrer en collision. Deux détails vont avec : le dégradé est porté par la carte elle-même, pas par une enveloppe qui peindrait un rectangle derrière la forme découpée, et l'ombre colorée vit dans un contexte d'empilement propre — en z-index: -1 sans lui, elle passerait sous le fond de la page et ne se verrait jamais.

Accessibilité

  • Contraste du texte blanc (12 px, graisse 600 : texte normal, seuil 4,5:1) mesuré sur la couleur de départ de chaque dégradé : 4,47:1 sur #6366f1 (limite), 3,53:1 sur #ec4899, 2,43:1 sur #06b6d4. Seule la première carte tient presque le seuil. Assombrissez --sqc-from : les scènes de cette page utilisent #6d28d9, #be123c, #0f766e ou #1d4ed8, toutes au-dessus de 5:1.
  • Clavier et lecteurs d'écran : les cartes sont des div avec cursor: pointer, sans rôle ni tabindex — Tab ne s'y arrête pas (mesuré). Pour des raccourcis cliquables, remplacez .squircle-card par un <a> ou un <button> ; attention, clip-path rogne aussi l'anneau de focus : donnez-en un à l'enveloppe (.squircle-card-shadow:focus-within { outline: 2px solid; outline-offset: 4px }). Les icônes (⚙ ♥ ★) sont lues par la synthèse vocale : aria-hidden="true" sur .sq-icon.
  • prefers-reduced-motion absent du code : le soulèvement de 4 px avec rebond reste actif sous la préférence (mesuré). Le mouvement est court et déclenché par le visiteur ; pour le retirer : @media (prefers-reduced-motion: reduce) { .squircle-card { transition: none } .squircle-card:hover { transform: none } }.

Compatibilité navigateur

CSS seul : clip-path: polygon() en pourcentages, propriétés personnalisées (--sqc-*), dégradés, filter: blur() et brightness(), isolation. Zéro JavaScript, zéro SVG, zéro dépendance. Mesuré collé dans une page vierge : forme identique dans Chromium 151, Firefox 153 et WebKit 26 (Safari), coin hors de la zone cliquable dans les trois.

Chrome 55+✓ Complet
Firefox 54+✓ Complet
Safari 13.1+✓ Complet
Edge 79+✓ Complet
Mobile iOS 13.4+✓ Complet (le survol devient un appui)
Android Chrome 55+✓ Complet

Sans clip-path sur les éléments HTML (Safari avant 13.1 sans le préfixe -webkit-clip-path, Firefox avant 54), la carte s'affiche carrée, contenu et couleurs intacts. Pour Safari 9 à 13 : ajoutez -webkit-clip-path: var(--sqc-squircle) à côté de la ligne d'origine.

Le code

Copiez les trois blocs dans votre page. Aucune dépendance.

HTML
<div class="squircle-cards-wrap">
    <div class="squircle-card-shadow" style="--sqc-from: #6366f1; --sqc-to: #8b5cf6;">
      <div class="squircle-card"><span class="sq-icon">&#9881;</span>Settings</div>
    </div>
    <div class="squircle-card-shadow" style="--sqc-from: #ec4899; --sqc-to: #f43f5e;">
      <div class="squircle-card"><span class="sq-icon">&#9829;</span>Health</div>
    </div>
    <div class="squircle-card-shadow" style="--sqc-from: #06b6d4; --sqc-to: #3b82f6;">
      <div class="squircle-card"><span class="sq-icon">&#9733;</span>Photos</div>
    </div>
  </div>
CSS
/* Formes en clip-path: polygon(), sans SVG ni id : Superellipse n = 4 (|x|^4 + |y|^4 = 1), 64 points en % de la carte. */
.squircle-card {
  --sqc-squircle: polygon(0% 50%, 0.1% 34.3%, 0.5% 27.9%, 1.1% 23.1%, 1.9% 19.1%, 3% 15.7%, 4.4% 12.7%, 6% 10.2%, 8% 8%, 10.2% 6%, 12.7% 4.4%, 15.7% 3%, 19.1% 1.9%, 23.1% 1.1%, 27.9% 0.5%, 34.3% 0.1%, 50% 0%, 65.7% 0.1%, 72.1% 0.5%, 76.9% 1.1%, 80.9% 1.9%, 84.3% 3%, 87.3% 4.4%, 89.8% 6%, 92% 8%, 94% 10.2%, 95.6% 12.7%, 97% 15.7%, 98.1% 19.1%, 98.9% 23.1%, 99.5% 27.9%, 99.9% 34.3%, 100% 50%, 99.9% 65.7%, 99.5% 72.1%, 98.9% 76.9%, 98.1% 80.9%, 97% 84.3%, 95.6% 87.3%, 94% 89.8%, 92% 92%, 89.8% 94%, 87.3% 95.6%, 84.3% 97%, 80.9% 98.1%, 76.9% 98.9%, 72.1% 99.5%, 65.7% 99.9%, 50% 100%, 34.3% 99.9%, 27.9% 99.5%, 23.1% 98.9%, 19.1% 98.1%, 15.7% 97%, 12.7% 95.6%, 10.2% 94%, 8% 92%, 6% 89.8%, 4.4% 87.3%, 3% 84.3%, 1.9% 80.9%, 1.1% 76.9%, 0.5% 72.1%, 0.1% 65.7%);
}

.squircle-cards-wrap {
  display: flex;
  gap: 14px;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  padding: 10px;
}

.squircle-card {
  width: 110px;
  height: 110px;
  background: linear-gradient(135deg, var(--sqc-from, #6366f1), var(--sqc-to, #8b5cf6)) var(--sqc-from, #6366f1);
  clip-path: var(--sqc-squircle);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  color: white;
  font-weight: 600;
  font-size: 0.75rem;
  transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1), filter 0.3s ease;
  cursor: pointer;
  position: relative;
}

.squircle-card:nth-child(2) {
  background: linear-gradient(135deg, #ec4899, #f43f5e);
}

.squircle-card:nth-child(3) {
  background: linear-gradient(135deg, #06b6d4, #3b82f6);
}

.squircle-card .sq-icon {
  font-size: 1.8rem;
  margin-bottom: 4px;
}

.squircle-card:hover {
  transform: scale(1.08) translateY(-4px);
  filter: brightness(1.15);
}

.squircle-card-shadow {
  width: 110px;
  height: 110px;
  position: relative;
  isolation: isolate;
}

.squircle-card-shadow::after {
  content: '';
  position: absolute;
  bottom: -6px;
  left: 8px;
  right: 8px;
  height: 20px;
  background: linear-gradient(135deg, var(--sqc-from, #6366f1), var(--sqc-to, #8b5cf6));
  border-radius: 50%;
  filter: blur(12px);
  opacity: 0.4;
  z-index: -1;
}
JavaScript (fx-0333)

Personnaliser

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

Option / propriétéDéfautEffet
Couleurs (HTML — style="--sqc-from: …; --sqc-to: …;" sur .squircle-card-shadow) indigo → violet, rose → rouge, cyan → bleu Les deux variables colorent la carte ET son ombre. --sqc-from sert aussi de couleur unie sous le dégradé : c'est elle qui compte pour le contraste du texte blanc. Sans variable, la carte prend #6366f1 → #8b5cf6.
Courbure (CSS — --sqc-squircle sur .squircle-card) superellipse n = 4, 64 points Pour un autre exposant, recalculez les 64 points en console avec n défini : Array.from({length: 64}, (_, i) => { const t = Math.PI + i * Math.PI / 32, c = Math.cos(t), s = Math.sin(t), e = 2 / n; return (50 + 50 * Math.sign(c) * Math.abs(c) ** e).toFixed(1) + '% ' + (50 + 50 * Math.sign(s) * Math.abs(s) ** e).toFixed(1) + '%'; }).join(', '), puis collez le résultat dans polygon(…). n = 3 est plus rond (11,7 % de surface retirée), n = 5 plus carré (5 %).
Taille (CSS — width / height de .squircle-card et de .squircle-card-shadow) 110 × 110 px Changez les deux règles ensemble : la forme est en pourcentages et suit. Une carte non carrée donne une superellipse étirée (coins plus longs sur le grand côté).
Ombre (CSS — .squircle-card-shadow::after) 94 × 20 px, 6 px sous la carte, blur(12px), opacité 0,4 opacity: .6 et bottom: -10px pour une carte qui flotte davantage. Ne remettez pas de clip-path sur l'ombre : le flou serait rogné net sur la forme.
Survol (CSS — .squircle-card:hover) scale(1.08) translateY(-4px), brightness(1.15), 0,4 s avec rebond scale(1.04) pour une grille serrée ; remplacez la courbe par ease-out pour supprimer le rebond.

FAQ

Quelle différence avec un border-radius de 30 % ?

Un border-radius raccorde un côté droit à un quart de cercle : la courbure saute d'un coup de zéro à sa valeur, et l'œil voit la « cassure » au début de l'arrondi. La superellipse fait varier la courbure en continu, du milieu du côté jusqu'au coin : c'est la forme des icônes iOS et des « squircles » de Figma. Sur une carte de 110 px, le coin de la superellipse n = 4 passe à 8,8 px de l'angle sur chaque axe ; un border-radius qui passe au même point doit valoir environ 30 px, et son arc paraît alors plus mou sur les côtés. La différence se voit surtout sur les grandes tailles et les fonds unis.

Pourquoi les règles .squircle-card:nth-child(2) et (3) ne changent-elles rien ?

Parce que chaque carte est seule dans son enveloppe .squircle-card-shadow : elle est toujours le premier enfant, ces deux sélecteurs ne trouvent jamais rien. Les couleurs viennent des variables --sqc-from / --sqc-to posées sur l'enveloppe. Vous pouvez supprimer ces deux règles sans effet visible.

Faut-il ajouter un clipPath SVG pour obtenir la forme ?

Non. Le code décrit la forme dans le CSS (--sqc-squircle: polygon(…)) : rien à ajouter, aucun id à garder unique, et plusieurs copies de l'effet — ou d'autres effets de la même famille — cohabitent sans conflit dans une même page. Un clip-path: url(#squircle) qui viserait un <clipPath id="squircle"> absent de la page laisserait au contraire les cartes carrées, sans erreur visible : c'est pour cela que toute la famille des formes découpées s'en passe.