Skip to content

Bubbles

The bubbles simulation creates rising soap bubbles with iridescent light reflections and subtle color shifts. Bubbles gently wobble as they float upward and can be popped with a click.

Click to pop bubbles

Examples

Basic bubbles

Rising soap bubbles with click-to-pop interaction.

Click to pop bubbles

<template>
    <EffectDemo>
        <canvas ref="canvasRef"></canvas>
        <span class="effect-demo__hint">Click to pop bubbles</span>
    </EffectDemo>
</template>

<script
    setup
    lang="ts">
    import { onMounted, onUnmounted, ref } from 'vue';
    import { createBubbles } from '@basmilius/sparkle';

    const canvasRef = ref<HTMLCanvasElement>();
    let sim: ReturnType<typeof createBubbles> | null = null;

    onMounted(() => {
        if (canvasRef.value) {
            sim = createBubbles();
            sim.mount(canvasRef.value).start();
        }
    });

    onUnmounted(() => {
        sim?.destroy();
        sim = null;
    });
</script>

Dense and interactive

More bubbles with a larger pop radius.

Click to pop bubbles

<template>
    <EffectDemo>
        <canvas ref="canvasRef"></canvas>
        <span class="effect-demo__hint">Click to pop bubbles</span>
    </EffectDemo>
</template>

<script
    setup
    lang="ts">
    import { onMounted, onUnmounted, ref } from 'vue';
    import { createBubbles } from '@basmilius/sparkle';

    const canvasRef = ref<HTMLCanvasElement>();
    let sim: ReturnType<typeof createBubbles> | null = null;

    onMounted(() => {
        if (canvasRef.value) {
            sim = createBubbles({
                count: 50,
                sizeRange: [15, 50],
                popOnClick: true,
                popRadius: 80
            });
            sim.mount(canvasRef.value).start();
        }
    });

    onUnmounted(() => {
        sim?.destroy();
        sim = null;
    });
</script>

Configuration

All options are passed via a config object:

typescript
import { createBubbles } from '@basmilius/sparkle';

const bubbles = createBubbles({
    count: 30,
    sizeRange: [10, 40],
    speed: 1,
    popOnClick: true,
    scale: 1
});
bubbles.mount(canvas).start();

Count

Control the number of bubbles:

typescript
// Few, sparse bubbles
createBubbles({ count: 10 });

// Dense bubble field
createBubbles({ count: 60 });

Size Range

Set the minimum and maximum bubble radius:

typescript
// Small, uniform bubbles
createBubbles({ sizeRange: [5, 15] });

// Large, varied bubbles
createBubbles({ sizeRange: [20, 60] });

Pop on Click

Enable or disable click-to-pop:

typescript
// Disable popping
createBubbles({ popOnClick: false });

// Larger pop detection area
createBubbles({ popOnClick: true, popRadius: 100 });

Wobble

Control the horizontal wobble intensity:

typescript
// Minimal wobble
createBubbles({ wobbleAmount: 0.3 });

// Exaggerated wobble
createBubbles({ wobbleAmount: 2 });