1.0.4 • Published 2 years ago

react-animation-particles v1.0.4

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

animation

A lightweight JavaScript library for creating particles.

✨ Technologies

This project was developed with the following technologies:

  • React
  • TypeScript

📃 Library installation

npm

npm install react-animation-particles

yarn

yarn add react-animation-particles

pnpm

pnpm install react-animation-particles

react-animation-particles aims to be a "plug and play" solution, without needing a lot of tinkering. In the ideal case, you can wrap the children you already have with , and get animation for free:

app.js

import { Particles } from "react-animation-particles";
import config from "assets/particles.config";

export const Example = () => (
  <Particles config={config}>
    <p style={{ position: relative, zIndex: 11 }}>Hello World!</p>
  </Particles>
);

By default, the particles have zIndex: 10, you must set the children with higher value

🪄 Demo / Generator

Configure, export, and share your react-animation-particles configuration:

Demo

Access https://react-animation-particles.vercel.app

particles.config.json

{
  particles: {
    number: {
      value: 60,
      density: {
        enable: true,
        value_area: 800,
      },
    },
    color: {
      value: "#199ada",
    },
    shape: {
      type: "circle",
      stroke: {
        width: 0,
        color: "#000000",
      },
      polygon: {
        nb_sides: 5,
      },
      image: {
        src: "",
        width: 300,
        height: 300,
      },
    },
    opacity: {
      value: 0.5,
      random: false,
      anim: {
        enable: false,
        speed: 1,
        opacity_min: 0.1,
        sync: false,
      },
    },
    size: {
      value: 3,
      random: true,
      anim: {
        enable: false,
        speed: 40,
        size_min: 0.1,
        sync: false,
      },
    },
    line_linked: {
      enable: true,
      distance: 150,
      color: "#199ada",
      opacity: 0.3,
      width: 1,
    },
    move: {
      enable: true,
      speed: 2,
      direction: "none",
      random: false,
      straight: false,
      out_mode: "out",
      bounce: false,
      attract: {
        enable: false,
        rotateX: 600,
        rotateY: 1200,
      },
    },
  },
  interactivity: {
    detect_on: "canvas",
    events: {
      onhover: {
        enable: false,
        mode: "grab",
      },
      onclick: {
        enable: true,
        mode: "push",
      },
      resize: true,
    },
    modes: {
      grab: {
        distance: 400,
        line_linked: {
          opacity: 1,
        },
      },
      bubble: {
        distance: 30,
        size: 4,
        duration: 2,
        opacity: 0.8,
        speed: 3,
      },
      repulse: {
        distance: 200,
        duration: 0.4,
      },
      push: {
        particles_nb: 4,
      },
      remove: {
        particles_nb: 2,
      },
    },
  },
  retina_detect: false,
}

You can control the start and end of the animation, just use the load() and destroy() functions

import { load } from "react-animation-particles";

/* load(@path-json (optional), @callback (optional)); */
load("assets/particles.json", function () {
  console.log("callback - particles.js config loaded");
});
import { destroy } from "react-animation-particles";

destroy();

SSR

You can use the package with SSR frameworks, like nextJs, for that you just have to do a few steps:

// index.tsx

import type { NextPage } from "next";
import { useEffect, useState } from "react";
import { BackgroundParticles } from "../Components/Particles";

const Content = () => {
  return (
    <>
      <p style={{ height: "100vh" }}>Hello, world!</p>
    </>
  );
};

const Home: NextPage = () => {
  const [isLoaded, setIsLoaded] = useState(false);

  useEffect(() => {
    setIsLoaded(true);
  }, []);

  if (!isLoaded) {
    return (
      <>
        <Content />
      </>
    );
  }
  return (
    <BackgroundParticles>
      <Content />
    </BackgroundParticles>
  );
};

export default Home;
// Components/Particles.tsx

import { ReactNode } from "react";
import { Particles } from "react-animation-particles";

export const BackgroundParticles = ({ children }: { children: ReactNode }) => {
  return (
    <>
      <Particles>{children}</Particles>
    </>
  );
};

Options

keyoption type / notesexample
particles.number.valuenumber40
particles.number.density.enablebooleantrue / false
particles.number.density.value_areanumber800
particles.color.valueHEX (string) RGB (object) HSL (object) array selection (HEX) random (string)"#b61924" {r:182, g:25, b:36} {h:356, s:76, l:41} ["#b61924", "#333333"] "random"
particles.shape.typestring array selection"circle" "edge" "triangle" "polygon" "star" "image" ["circle", "image"]
particles.shape.stroke.widthnumber2
particles.shape.stroke.colorHEX (string)"#222222"
particles.shape.polygon.nb_slidesnumber5
particles.shape.image.srcpath link svg / png / gif / jpg"assets/img/yop.svg" "http://example.com/img.png"
particles.shape.image.widthnumber (for aspect ratio)100
particles.shape.image.heightnumber (for aspect ratio)100
particles.opacity.valuenumber (0 to 1)0.75
particles.opacity.randombooleantrue / false
particles.opacity.anim.enablebooleantrue / false
particles.opacity.anim.speednumber3
particles.opacity.anim.opacity_minnumber (0 to 1)0.25
particles.opacity.anim.syncbooleantrue / false
particles.size.valuenumber20
particles.size.randombooleantrue / false
particles.size.anim.enablebooleantrue / false
particles.size.anim.speednumber3
particles.size.anim.size_minnumber0.25
particles.size.anim.syncbooleantrue / false
particles.line_linked.enablebooleantrue / false
particles.line_linked.distancenumber150
particles.line_linked.colorHEX (string)#ffffff
particles.line_linked.opacitynumber (0 to 1)0.5
particles.line_linked.widthnumber1.5
particles.move.enablebooleantrue / false
particles.move.speednumber4
particles.move.directionstring"none" "top" "top-right" "right" "bottom-right" "bottom" "bottom-left" "left" "top-left"
particles.move.randombooleantrue / false
particles.move.straightbooleantrue / false
particles.move.out_modestring (out of canvas)"out" "bounce"
particles.move.bounceboolean (between particles)true / false
particles.move.attract.enablebooleantrue / false
particles.move.attract.rotateXnumber3000
particles.move.attract.rotateYnumber1500
interactivity.detect_onstring"canvas", "window"
interactivity.events.onhover.enablebooleantrue / false
interactivity.events.onhover.modestring array selection"grab" "bubble" "repulse" ["grab", "bubble"]
interactivity.events.onclick.enablebooleantrue / false
interactivity.events.onclick.modestring array selection"push" "remove" "bubble" "repulse" ["push", "repulse"]
interactivity.events.resizebooleantrue / false
interactivity.events.modes.grab.distancenumber100
interactivity.events.modes.grab.line_linked.opacitynumber (0 to 1)0.75
interactivity.events.modes.bubble.distancenumber100
interactivity.events.modes.bubble.sizenumber40
interactivity.events.modes.bubble.durationnumber (second)0.4
interactivity.events.modes.repulse.distancenumber200
interactivity.events.modes.repulse.durationnumber (second)1.2
interactivity.events.modes.push.particles_nbnumber4
interactivity.events.modes.push.particles_nbnumber4
retina_detectbooleantrue / false

📝 Licence

This project is under MIT licence. See the archive LICENSE to more details.


Made with 💜 by IGS Design - Igor Santos 👋