emojisplosion and emojisplosions are highly configurable. The following configurations may be passed to both via configuration objects.


Type: string or () => string

CSS class name to add to all emoji elements. Defaults to "emoji-styles".

emojisplosion({ className: "my-emoji-styles", });

Whenever a new className is passed to emojisplosion, a new <style> element is created to add general emoji styles for that class.


Type: Element or () => Element

Element container to append elements into. Defaults to a new <div /> inserted as a first child of document.body.

emojisplosion({ container: document.getElementById("fun"), });


Type: number or () => number

How many emojis to create per blast. Defaults to random number between 14 and 28.

Creating 9001 emoji per blast:

emojisplosion({ emojiCount: 9001, });

Creating a random number between 100 and 200 per blast:

emojisplosion({ emojiCount: () => Math.random() * 100 + 100, });


Type: string[] or () => string[]

List of allowed emojis to randomly choose from for each explosion.

Always choosing the 💖 emoji:

emojisplosion({ emojis: ["💖"], })

Allowing any of several wonderful heart emojis for each emoji within a blast:

emojisplosion({ emojis: ["💖", "💕", "💗", "💓", "💝"], });


Runtime change constants for emoji element movements. These default to a sane set of ranges for random numbers that give the appearance of fireworks-like blasts.

These values must be passed in as numbers, with defaults as (value) here:

  • framerate (60): Expected frames per second to adjust position and velocity changes by.
  • gravity (0.35): How much to increase y-velocity downward each tick.
  • rotationDeceleration (0.98): How much to decrease rotation amount each tick.

These values may be randomized, so you can provide them as a const number or { max: number, min: number } for a random integer within, inclusive. Defaults are ([min, max]) here:

  • fontSize ([14, 28]): Individual emojis' font size range.
  • initialVelocities
    • rotation ([-7, 7]): Range of initial rotation amount.
    • x ([-7, 7]): Range of initial horizontal velocity.
    • y ([-14, -11.7]): Range of initial vertical velocity.
  • rotation ([-45, 45]): Individual emojis' initial rotation range.

These values are optional:

  • preserveOutOfBounds: Whether to skip removing emojis that move outside of the visible screen.
  • opacityDelay: How much to slow down the (time elapsed / framerate) opacity reduction each tick (recommendation: 100 to fade out over a few seconds).

Causing emojis to spin wildly out of control:

emojisplosion({ physics: { initialVelocities: { rotation: { max: 14, min: -14, }, }, rotationDeceleration: 1.01, }, });

Inverting gravity:

emojisplosion({ physics: { gravity: -0.35, initialVelocities: { y: { max: 14, min: 11.7, }, }, }, });

Alternately, the defaultPhysics object is exported, so you can base your physics constants off it:

import { emojisplosions, defaultPhysics } from "emojisplosion"; emojisplosion({ physics: { gravity: -defaultPhysics.gravity, initialVelocities: { y: { max: -defaultPhysics.initialVelocities.max, min: -defaultPhysics.initialVelocities.min, }, }, }, });


Type: { x: number, y: number } or () => { x: number, y: number }

How to determine where to place blasts of emojis around the page. These are absolutely positioned midpoints to center the blasts around. They&#039re used directly as left and top CSS properties. You can provide a static object or a function to create one.

The default position chooses integers within the page:

emojisplosion({ position: () => ({ x: Math.random() * innerWidth, y: Math.random() * innerHeight, }), });

Always exploding from a fixed position:

emojisplosion({ position: { x: 35, y: 35, }, });

Exploding emoji around your favorite element on the page:

const element = document.querySelector("#my-face"); emojisplosion({ position() { // https://stackoverflow.com/questions/1480133 const offset = cumulativeOffset(element); return { x: offset.left + element.clientWidth / 2, y: offset.top + element.clientHeight / 2, }; }, });


Type: (element: Element) => void

Processes each element just before it's appended to the container. Useful if you'd like to apply custom attributes, class names, or styles to your elements.

Adding an .emoji class to each element:

emojisplosion({ process(element) { element.className = "emoji"; }, });


Type: string or () => string

DOM element tag name to create elements as. Defaults to "span".

Creating <div>s instead:

emojisplosion({ tagName: "div", });


Type: number or () => number

How many different types of emojis are allowed within a blast. Each blast will evaluate this to a number, U, and choose the first U emojis from a shuffled variant of the emojis list. If U > emojis.length, it will be ignored.

uniqueness defaults to Infinity.

Allowing only one emoji type per blast:

emojisplosion({ uniqueness: 1, });

Allowing one more emoji type per blast each blast:

let count = 0; emojisplosion({ uniqueness() { count += 1; return count; }, });


emojisplosions can take in all of the same settings as emojisplosion. It returns an object with a cancel function that can cancel any pending work:

// Commence explosions!... const { cancel } = emojisplosions(); // ...but stop after ten seconds. setTimeout(cancel, 10000);

Additionally, the following configurations are exclusively for emojisplosions:


Type: number or () => number

How frequently to create explosions. Passed to scheduler as the delay (typically in milliseconds) before each explosion.

Pass a number to always delay that much. Pass a function for it to be called immediately for the delay before the first explosion, then again as each explosion is started to schedule the next explosion.

The default interval is a function that returns 0 the first time for an immediate explosion, then a random number in [700, 2100] subsequent times.

As quickly as setInterval can fire (this will probably crash your browser!):

emojisplosions({ interval: 0, });

Once a second:

emojisplosions({ interval: 1000, });

0ms delay the first explosion, then 1000ms delay each subsequent explosion:

let scheduled = false; emojisplosions({ interval() { if (!scheduled) { scheduled = true; return 0; } return 1000; }, });


Type: (action: () => void, delay: number) => number

Schedules the next explosion to occur. This defaults to setTimeout, which is why interval is typically treated as milliseconds.

emojisplosions({ scheduler(action, delay) { console.log(`Will emoji in ${delay} ms!`); action(); }, });