Atmosphère✨ Premium

Underwater Caustics

Deux couches de repeating-conic-gradient animées en sens opposés créent des caustiques aquatiques moirées — bulles CSS montantes incluses, zéro JavaScript.

CSSGradientAnimation

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. Atmosphère comprend 57 effets, dont 10 gratuits. Découvrir la catégorie →

3 exemples d'usage

Hero / Landing — Site de réservation plongée — Underwater Caustics exemple 1

① Hero / Landing — Site de réservation plongée

QuandHeader pleine page d'un site de travel ou d'activités nautiques — là où l'ambiance prime sur la densité d'information.
PourquoiLes caustiques en mouvement lent créent une immersion « fond marin » sans image lourde : moins de 1 Ko de CSS, aucune ressource externe, aucune dépendance.
RéglagesRalentir les couches à 6 s et 9 s (durées dans .caustics-layer et :nth-child(2)) ; monter l'alpha des gradients coniques de .06 à .09 pour plus d'éclat.
Composant produit — Widget hydratation / bilan santé — Underwater Caustics exemple 2

② Composant produit — Widget hydratation / bilan santé

QuandDashboard d'une application bien-être ou sportive affichant un objectif atteint — hydratation, pas quotidiens, bilan sommeil.
PourquoiL'eau animée en fond relie visuellement le widget à son thème sans icône supplémentaire ; <code>opacity: .8</code> laisse le texte de la carte lisible.
RéglagesAccélérer à 2,5 s et 4 s pour plus de vivacité ; limiter la hauteur du conteneur à 160 px et ne garder que 2 <span> bulles pour alléger.
App natation — Récapitulatif de session — Underwater Caustics exemple 3

③ App natation — Récapitulatif de session

QuandPage de profil ou écran post-séance d'une application de natation ou de sport aquatique, affiché immédiatement après la fin de la session.
PourquoiLe fond caustique établit un lien visuel direct entre les données (distance, allure, longueurs) et l'élément eau, sans icône ni image supplémentaire — les chiffres semblent flotter dans la piscine.
RéglagesConserver les durées par défaut 4 s / 6 s pour un moiré lent qui imite les reflets de bassin ; monter l'alpha des cônes à .08 (rgba(100, 200, 255, .08)) pour des caustiques plus lisibles derrière les tuiles de données.

Comment ça marche

L'effet repose sur deux couches CSS superposées (.caustics-layer), chacune portant une paire de repeating-conic-gradient. La première ancre ses cônes en at 25% 25% et at 75% 75%, répétés sur des tuiles de 80 × 80 px et 100 × 100 px. La seconde les décale à from 30deg at 60% 40% et from 60deg at 40% 60%, sur 90 × 90 px et 70 × 70 px. L'angle de départ (from) et la position (at) différents décalent la phase angulaire des deux grilles, créant ensemble un réseau de losanges lumineux (alpha 4–6 %) qui imite le patron optique des caustiques en piscine.

Les deux couches partagent la même animation causticsMove — translation ±10 px, rotation ±2° — mais avec des durées distinctes (4 s et 6 s) et des directions opposées (animation-direction: normal vs reverse). Ce déphasage de fréquence (rapport 2/3, battement à 12 s) génère un moiré animé : les deux grilles glissent l'une par rapport à l'autre en continu, produisant l'ondulation caractéristique des reflets sous-marins sans JavaScript ni canvas.

Le fond est un linear-gradient sur .caustics-container — trois stops : #006994 en surface, #046 à mi-profondeur, #034 en fond — qui joue le rôle de la masse d'eau. Les deux couches sont en position: absolute; inset: 0 et couvrent le conteneur quelle que soit sa taille. L'overflow: hidden évite tout débordement lors des translations.

Quatre bulles (.caustics-bubbles span) sont des cercles CSS purs — border-radius: 50%, fond quasi transparent (rgba(255,255,255,.05)), contour 1 px solid rgba(255,255,255,.2) — animées par bubbleRise (ease-in, montée de 220 px, scale(1.3)). Quatre durées distinctes (5 s, 6 s, 7 s, 5,5 s) et des délais échelonnés de 0 à 3 s évitent tout cycle répétitif visible.

Accessibilité

  • prefers-reduced-motion absent dans le code : aucune règle @media (prefers-reduced-motion) n'est présente. Les animations causticsMove et bubbleRise tournent même si l'utilisateur a activé « Réduire le mouvement ». À ajouter avant prod : @media (prefers-reduced-motion: reduce) { .caustics-layer, .caustics-bubbles span { animation: none; } }.
  • Le .caustics-container ne porte pas d'aria-hidden. L'effet étant purement décoratif, ajouter aria-hidden="true" pour l'exclure de l'arbre d'accessibilité.
  • Aucun role ni aria-label n'est défini sur le conteneur. En usage réel, envelopper l'effet + le contenu overlay dans un role="img" avec aria-label descriptif.
  • Aucune interaction clavier ni pointeur — effet 100 % décoratif. L'accessibilité repose sur le contenu texte positionné par-dessus (z-index supérieur).
  • Le .caustics-label (blanc rgba(255,255,255,.85) sur fond bleu #006994) atteint un ratio de contraste estimé ≥ 4,6:1 — conforme WCAG AA pour le texte courant.

Compatibilité navigateur

Requiert repeating-conic-gradient (CSS Gradients Level 4). Supporté dans tous les navigateurs modernes depuis 2019–2020. Zéro JavaScript, zéro dépendance externe.

Chrome 69+✓ Complet
Firefox 83+✓ Complet
Safari 12.1+✓ Complet
Edge 79+✓ Complet
Mobile iOS 12.2+✓ Complet
Android Chrome✓ Complet

Les navigateurs sans support <code>repeating-conic-gradient</code> (IE, anciens Edge) affichent uniquement le <code>linear-gradient</code> de fond — dégradé bleu uni, aucune erreur JS, mise en page intacte.

Le code

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

index.html — structure
<div class="caustics-container">
  <div class="caustics-layer"></div>
  <div class="caustics-layer"></div>
  <div class="caustics-bubbles">
    <span></span>
    <span></span>
    <span></span>
    <span></span>
  </div>
</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
linear-gradient sur .caustics-container #006994, #046, #034 Couleurs de fond de la masse d'eau — modifiez les 3 stops pour adapter la profondeur perçue (aqua vif, bleu nuit, vert algue).
animation-duration: 4s (.caustics-layer) 4s Vitesse de la couche 1. 4 s = dynamique, 8 s = contemplatif. Conserver un ratio non entier avec la couche 2 pour un moiré riche.
animation-duration: 6s (.caustics-layer:nth-child(2)) 6s Vitesse de la couche 2 (direction reverse). Le rapport 4 s/6 s crée un battement à 12 s — changez-le pour allonger ou raccourcir la période du cycle visuel.
rgba(100, 200, 255, .06) dans repeating-conic-gradient .06 / .05 / .04 Alpha des segments lumineux des cônes. Montez jusqu'à .15 pour des caustiques très prononcées, descendez à .02 pour une texture de fond quasi imperceptible.
background-size: 80px 80px (couche 1) 80px / 100px Taille des tuiles coniques — plus petites = grain fin, plus grandes = larges nappes lumineuses. Changez les deux valeurs de la même couche ensemble pour conserver l'aspect composite.
opacity: .8 sur .caustics-layer .8 Transparence globale de chaque couche. Descendez à .4 pour un effet très subtil, montez à 1 pour un rendu saturé.
animation-duration des .caustics-bubbles span 6s, 5s, 7s, 5.5s Durée de montée de chaque bulle. Valeurs variées = montée asynchrone naturelle. Valeurs identiques = cadence régulière et hypnotique.
translateY(-220px) dans @keyframes bubbleRise -220px Distance verticale parcourue par les bulles. Alignez sur la hauteur réelle du conteneur pour que les bulles disparaissent précisément en haut.

FAQ

Non — Underwater Caustics est 100 % CSS. Le code source ne contient aucune ligne de JS. Copiez le HTML et le CSS dans votre page, l'effet démarre immédiatement. Compatible avec React, Vue, Angular, Svelte : aucun composant JS à initialiser, aucune dépendance à importer.
repeating-conic-gradient est supporté depuis Chrome 69 (2018), Firefox 83 (2020), Safari 12.1 (2019). Sur Internet Explorer ou un navigateur antérieur, seul le linear-gradient de fond est rendu — un dégradé bleu propre, sans erreur, sans mise en page cassée.
Positionnez votre contenu en position: absolute; z-index: 2 dans le même conteneur (position: relative; overflow: hidden). Ajoutez un scrim si nécessaire — un div inset: 0 absolu en z-index: 1 avec background: linear-gradient(rgba(0,0,0,.4), rgba(0,0,0,.3)) — pour garantir le contraste texte WCAG AA.