SVG✨ Premium

Cellular Automata

Le jeu de la vie de Conway sur une grille de petites cellules colorées : dix générations par seconde, des teintes qui tournent, une nouvelle population toutes les 50 secondes.

CanvasSimulationConway

Mis à jour le

Cet effet fait partie d'Effect.Labs — 840 effets vanilla, une partie gratuite, une partie premium. SVG comprend 30 effets, dont 3 gratuits. Découvrir la catégorie →

3 exemples d'usage

Fond de la page d'inscription d'une conférence sur la vie artificielle — Cellular Automata exemple 1

① Fond de la page d'inscription d'une conférence sur la vie artificielle

QuandSur la page d'Abiotelle 2027, l'automate couvre tout l'écran, atténué ; le titre, les dates et les thèmes à gauche, le formulaire d'inscription dans une carte opaque à droite.
PourquoiLe jeu de la vie est l'exemple fondateur de la vie artificielle : le fond dit le sujet de la conférence, et ses motifs qui naissent et meurent restent assez fins pour passer derrière un formulaire.
RéglagesRacine en position:absolute; inset:0 avec --gol-height:100% et opacity:.7 ; voile radial centré sur le texte ; canvas en aria-hidden="true". Grille de 90 × 60 cellules sur 540 × 360 px.
Vignette animée d'un cours dans un catalogue de formations — Cellular Automata exemple 2

② Vignette animée d'un cours dans un catalogue de formations

QuandDans le catalogue Codalme, la carte du cours « Automates cellulaires » a pour image l'automate en marche, à côté de deux cours dont la vignette est fixe.
PourquoiLa vignette montre le sujet du cours au lieu de l'illustrer, et le mouvement distingue la nouveauté dans une grille de cartes immobiles.
RéglagesRacine dans une vignette de 157 × 112 px (26 × 18 cellules), badge « Nouveau » posé par-dessus. Le canvas garde role="img" et un libellé, car il remplace l'image de la carte.
Zone d'attente pendant le calcul d'un devis de déménagement — Cellular Automata exemple 3

③ Zone d'attente pendant le calcul d'un devis de déménagement

QuandSur le simulateur Démorvel, le clic sur « Calculer mon devis » remplace le message d'accueil par l'automate et « Calcul de votre devis… », puis le montant s'affiche quelques secondes plus tard.
PourquoiUne population qui évolue sans jamais se répéter occupe l'œil sans promettre de progression chiffrée, ce qu'une barre de chargement inventée ferait à tort.
RéglagesLa zone d'attente (250 × 150 px, 41 × 25 cellules) n'est affichée que dans l'état « attente » ; le code vendu démarre à sa première apparition, s'arrête quand elle disparaît et reprend la même population au calcul suivant.

Comment ça marche

La zone est découpée en cellules de 6 px (grille centrée), dont 30 % sont tirées vivantes au départ. À chaque génération, chaque cellule compte ses huit voisines : une cellule vivante survit avec 2 ou 3 voisines, une cellule morte naît avec exactement 3, toutes les autres meurent ou restent vides. La nouvelle grille est calculée entièrement à partir de l'ancienne, et les bords se rejoignent comme sur un tore : ce qui sort à droite revient à gauche.

Une génération dure 100 ms, mesurées en temps écoulé (plafonné à 50 ms par image), soit dix par seconde sur tous les écrans. Le canvas n'est redessiné qu'au changement de génération : chaque cellule vivante devient un carré de 4 px séparé de ses voisines par 2 px, en hsl(génération × 2 + ligne + colonne, 70 %, 55 %), d'où des diagonales arc-en-ciel qui glissent au fil du temps. Après 500 générations (50 s), une nouvelle population aléatoire repart, car une soupe au hasard finit en blocs immobiles et en clignotants.

La taille de la grille vient de la zone affichée (multipliée par devicePixelRatio pour un rendu net) ; un ResizeObserver relance une population adaptée quand la zone change de taille, et rien ne démarre tant qu'elle est plus petite qu'une cellule. Un IntersectionObserver arrête le calcul hors écran. Le canvas est transparent : le fond est celui de .fx-0618-root. Chaque racine a sa propre population, lancée une seule fois (data-gol-ready) même si le script est collé deux fois.

Accessibilité

  • Libellé : role="img" et aria-label sur le canvas. En fond de page ou dans une zone d'attente déjà décrite par un texte, passez-le en aria-hidden="true".
  • Mouvement réduit : sous prefers-reduced-motion: reduce, 40 générations sont calculées d'un coup et la grille s'affiche figée, avec ses premières structures stables.
  • Clignotements : les oscillateurs les plus courants changent d'état à chaque génération, soit 5 allers-retours par seconde, sur des carrés de 4 px. Pour un public sensible au scintillement, montez GENERATION_MS à 350 : on passe sous 3 changements par seconde.
  • Pause : pas de bouton intégré ; basculer l'attribut hidden de la racine arrête le calcul (critère WCAG 2.2.2) et le reprend à la même génération.
  • Clavier : aucun élément interactif dans l'effet.

Compatibilité navigateur

Canvas 2D et environ 4,3 Ko de JavaScript, sans dépendance. ResizeObserver : Chrome 64, Firefox 69, Safari 13.1 ; IntersectionObserver : Chrome 51, Firefox 55, Safari 12.1 (données MDN). Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 : rendu à densité 2, deux populations indépendantes, démarrage après un affichage différé, grille figée en mouvement réduit, aucun calcul hors écran.

Chrome 64+✓ Complet (mesuré)
Firefox 69+✓ Complet (mesuré)
Safari 13.1+✓ Complet (mesuré dans WebKit)
Edge 79+✓ Complet (moteur Chromium)
Safari iOS 13.4+✓ Complet (WebKit, non vérifié sur appareil)
Chrome Android 64+✓ Complet (moteur Chromium)

Sans ResizeObserver, la grille ne s'adapte qu'au redimensionnement de la fenêtre ; sans IntersectionObserver, les générations continuent hors écran. Sans JavaScript, la zone garde le fond de la racine.

Le code

Structure HTML à coller dans votre page (le CSS + JS sont inclus avec votre achat) :

index.html — structure
<div class="fx-0618-root">
  <canvas class="gol-canvas" role="img" aria-label="Jeu de la vie de Conway : cellules colorées qui naissent et meurent sur une grille"></canvas>
</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
Taille des cellules (JS — CELL) 6 px (carrés de 4 px) 4 px donne une texture fine, 10 px des motifs lisibles où l'on reconnaît planeurs et clignotants.
Population de départ (JS — DENSITY) 0.3 0.15 laisse quelques îlots qui s'éteignent vite, 0.5 une mêlée qui se vide d'abord avant de s'organiser.
Durée d'une génération (JS — GENERATION_MS) 100 ms 350 ms ou plus pour un rythme calme et moins de 3 clignotements par seconde, 50 ms pour une évolution rapide.
Renouvellement (JS — RESTART_AFTER) 500 générations Infinity laisse la population s'éteindre ou se figer d'elle-même ; 200 relance plus souvent une soupe agitée.
Couleurs (JS — ligne fillStyle de draw()) hsl(génération × 2 + ligne + colonne, 70 %, 55 %) Une teinte fixe, par exemple 'hsl(170, 70%, 55%)', donne une grille monochrome sobre.
Fond (CSS — background de .fx-0618-root) #0a0a0f Le canvas est transparent : seule cette couleur compte, y compris sur fond clair.
Hauteur (CSS — --gol-height) 300px Toute hauteur fixe, ou 100% dans un parent de hauteur connue.

FAQ

Oui : règle B3/S23 (naissance avec 3 voisines, survie avec 2 ou 3), mise à jour synchrone de toute la grille et voisinage de Moore à huit cases. Seule particularité, les bords sont reliés : un planeur qui sort d'un côté réapparaît de l'autre.
Pas avec les réglages fournis : seed() tire les cellules au hasard. Pour un motif, il faut remplacer le tirage par la liste des cellules à allumer (coordonnées ligne, colonne) dans seed(), et mettre RESTART_AFTER à Infinity pour qu'il ne soit pas effacé.
Une population tirée au hasard se stabilise en quelques centaines de générations : il ne reste que des blocs fixes et des clignotants, et l'image devient répétitive. RESTART_AFTER (500 générations à 10 par seconde) relance une soupe neuve avant ce moment.