Skip to content

Primeros pasos

tsParticles es una librería JavaScript/TypeScript para crear animaciones de partículas, confeti, fuegos artificiales y mucho más. Funciona en cualquier navegador moderno y está disponible como paquete npm o vía CDN con etiquetas <script>.

Quick start

La forma más rápida de empezar es con nuestra CLI:

bash
npm create tsparticles@latest

Siga las indicaciones interactivas para elegir una plantilla y un framework. Se creará un nuevo proyecto con tsParticles preconfigurado en el directorio actual.


Arquitectura: engine + bundle

@tsparticles/engine por sí solo no hace nada visible. Contiene solo el motor interno (bucle de animación, canvas, gestión de eventos) pero ninguna forma, ninguna interacción, ningún efecto visual. Para ver algo necesitas cargar al menos un bundle o plugins individuales.

ConceptoRol
@tsparticles/engineMotor base. Exporta tsParticles, los tipos, las opciones. Por sí solo no dibuja nada.
Bundle (@tsparticles/basic, @tsparticles/slim, etc.)Paquete preensamblado que registra formas, interacciones y updaters en el engine.
Plugins individuales (@tsparticles/shape-circle, @tsparticles/updater-opacity, etc.)Paquetes individuales para combinar a medida para un bundle personalizado.

Elige tu ruta

Ruta A — npm/pnpm/yarn (proyectos modernos con bundler)

Instala el motor + un bundle:

bash
pnpm add @tsparticles/engine @tsparticles/slim

Luego en tu código:

ts
import { tsParticles } from "@tsparticles/engine";
import { loadSlim } from "@tsparticles/slim";

(async () => {
  // 1. Registra todas las funcionalidades del bundle slim en el engine
  await loadSlim(tsParticles);

  // 2. Crea la animación
  await tsParticles.load({
    id: "tsparticles", // ID del contenedor HTML
    options: {
      background: {
        color: "#0b1020",
      },
      particles: {
        number: { value: 80 },
        links: {
          enable: true,
          distance: 150,
          opacity: 0.35,
        },
        move: {
          enable: true,
          speed: 2,
        },
      },
    },
  });
})();

El contenedor HTML:

html
<div id="tsparticles"></div>

Ruta B — CDN con etiqueta <script> (sin bundler, HTML vanilla)

Carga primero el engine, luego el bundle. Los archivos CDN exponen todo en window — no hace falta import.

html
<!DOCTYPE html>
<html>
  <head>
    <!-- tsParticles engine -->
    <script src="https://cdn.jsdelivr.net/npm/@tsparticles/engine@4/tsparticles.engine.min.js"></script>
    <!-- Bundle slim (expone loadSlim globalmente) -->
    <script src="https://cdn.jsdelivr.net/npm/@tsparticles/slim@4/tsparticles.slim.bundle.min.js"></script>
  </head>
  <body>
    <div id="tsparticles"></div>
    <script>
      (async () => {
        // loadSlim está disponible globalmente tras cargar el bundle CDN
        await loadSlim(tsParticles);

        await tsParticles.load({
          id: "tsparticles",
          options: {
            background: { color: "#0b1020" },
            particles: {
              number: { value: 80 },
              links: { enable: true, distance: 150 },
              move: { enable: true, speed: 2 },
            },
          },
        });
      })();
    </script>
  </body>
</html>

Nota: incluso con los bundles CDN debes llamar loadSlim(tsParticles) (o loadBasic / loadFull / loadAll) antes de usar tsParticles.load(). Los bundles CDN exponen la función loader globalmente pero no la llaman automáticamente.

El mismo esquema aplica para @tsparticles/basicloadBasic, tsparticlesloadFull, @tsparticles/allloadAll.

Ruta C — Bundles especializados con API dedicada (confeti, fuegos, partículas)

Algunos bundles tienen su propia API simplificada, sin pasar por tsParticles.load():

html
<!DOCTYPE html>
<html>
  <head>
    <script src="https://cdn.jsdelivr.net/npm/@tsparticles/confetti@4/tsparticles.confetti.bundle.min.js"></script>
  </head>
  <body>
    <script>
      confetti({ particleCount: 100, spread: 70 });
    </script>
  </body>
</html>

Lo mismo para fireworks(), particles(), ribbons().

¿Qué bundle elegir?

BundlenpmCuándo usarlo
@tsparticles/basicloadBasic(tsParticles)Mínimo indispensable: círculos, movimiento, opacidad, tamaño.
@tsparticles/slimloadSlim(tsParticles)Elección recomendada para la mayoría de proyectos. Añade interacciones (click/hover), enlaces entre partículas, imágenes, estrellas, polígonos.
tsparticlesloadFull(tsParticles)Conjunto completo de funcionalidades oficiales: emisores, absorbedores, formas texto, roll, wobble, trail.
@tsparticles/allloadAll(tsParticles)Todo el repositorio: cada forma, interacción, efecto, easing, ruta, exportación. Solo para prototipado.
@tsparticles/confetticonfetti(opciones)Confeti en una llamada. API dedicada.
@tsparticles/fireworksfireworks(opciones)Fuegos artificiales en una llamada. API dedicada.
@tsparticles/particlesparticles(opciones)Fondo de partículas simplificado. API dedicada.
@tsparticles/ribbonsribbons(opciones)Efecto ribbon/cintas. API dedicada.

Más detalles: /guide/bundles.

Usar presets predefinidos

El paquete @tsparticles/configs contiene decenas de configuraciones listas (absorbedores, burbujas, nieve, estrellas, gravity, collisions, etc.).

bash
pnpm add @tsparticles/engine @tsparticles/slim @tsparticles/configs
ts
import { tsParticles } from "@tsparticles/engine";
import { loadSlim } from "@tsparticles/slim";
import "@tsparticles/configs";

await loadSlim(tsParticles);

// Carga un preset por nombre
await tsParticles.load({
  id: "tsparticles",
  options: { preset: "snow" },
});

Con CDN:

html
<script src="https://cdn.jsdelivr.net/npm/@tsparticles/engine@4/tsparticles.engine.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@tsparticles/slim@4/tsparticles.slim.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@tsparticles/configs@4/tsparticles.configs.min.js"></script>
<script>
  (async () => {
    await loadSlim(tsParticles);
    tsParticles.load({ id: "tsparticles", options: { preset: "snow" } });
  })();
</script>

Referencias rápidas

Solución de problemas

ProblemaCausa probableSolución
Pantalla en blanco, sin partículas#tsparticles no existe en el DOM cuando llamas tsParticles.load()Verifica que el DIV esté presente antes del script, o usa DOMContentLoaded
Pantalla en blanco, sin partículasHas instalado solo @tsparticles/engineDebes instalar también un bundle (@tsparticles/slim) o plugins, porque el engine solo no tiene formas que dibujar
Error "loadBasic/loadSlim/loadFull is not a function"Bundle no instalado o import incorrectopnpm add @tsparticles/slim e importa { loadSlim }
Las partículas no se muevenmove.enable no está establecido a trueAñade move: { enable: true, speed: 2 }
Funcionalidad faltante (ej. enlaces, colisiones)El bundle elegido no incluye esa funcionalidadCambia a un bundle más completo (@tsparticles/slim o tsparticles) o instala el plugin específico
Errores de tipo TypeScriptVersiones de los paquetes no alineadasMantén engine y bundle en la misma versión mayor/menor