Lexington has been awarded a grant from Astro, to celebrate. Get a 30% discount. Apply code LEXINGTON30 at checkout.
Hello everyone! Today, we’re going to learn how to create a bubble animation using Tailwind CSS and JavaScript ( and a bit of CSS too).
A bubble animation is a type of animation that creates a burst of bubbles that move in a circular motion. It’s a fun and playful way to add some visual interest to your website or app.
As you can see the markup is pretty simple, only a container for the bubbles and a few CSS rules to make the animation work. We will be injecting the bubbles dynamically using JavaScript.
We need to make sure that the body tag has a height of 100% and that the overflow is hidden so the bubbles don’t go outside the viewport.
h-screen
: This is a utility class that sets the height property of the element to the height of the viewport.relative
: This is a utility class that sets the position property of the element to relative.overflow-hidden
: This is a utility class that sets the overflow property of the element to hidden.Id’s
id="bubble-container"
: This is an id attribute that identifies the element with the id of “bubble-container”.
Classesabsolute
: This is a utility class that sets the position property of the element to absolute.inset-0
: This is a utility class that sets the top, right, bottom, and left properties of the element to 0.z-0
: This is a utility class that sets the z-index property of the element to 0.<body class="h-screen relative overflow-hidden">
<div id="bubble-container" class="absolute inset-0 z-0">
<!-- Bubbles will be added here -->
</div>
</body>
We are going to write a bit of CSS, yeas, no worries, the CSS is simple a short. The keyframes
@keyframes float
: This is a CSS at-rule that defines a keyframe animation.0%
: This is a CSS percentage that specifies the starting point of the animation.100%
: This is a CSS percentage that specifies the ending point of the animation.transform
: This is a CSS property that specifies how an element should be transformed.translateY(100vh)
: This is a CSS function that translates the element vertically by 100% of the viewport height.translateX(0)
: This is a CSS function that translates the element horizontally by 0 pixels.translateX(calc(sin(var(--random-offset)) * 50px))
: This is a CSS function that translates the element horizontally by a random value between 0 and 50 pixelsThe bubble class
position: absolute
: This is a CSS property that sets the position property of the element to absolute.border-radius: 50%
: This is a CSS property that sets the border-radius property of the element to 50%.opacity: 0.7
: This is a CSS property that sets the opacity property of the element to 70%.transition: background-color 0.3s ease-in-out
: This is a CSS property that sets the transition property of the element to background-color 0.3s ease-in-out.will-change: transform
: This is a CSS property that sets the will-change property of the element to transform. @keyframes float {
0% {
transform: translateY(100vh) translateX(0);
}
100% {
transform: translateY(-100vh) translateX(calc(sin(var(--random-offset)) * 50px));
}
}
.bubble {
position: absolute;
border-radius: 50%;
opacity: 0.7;
transition: background-color 0.3s ease-in-out;
will-change: transform;
}
The createBubble function
function createBubble()
: This is a JavaScript function that defines a function named createBubble.const bubble = document.createElement("div")
: This is a JavaScript statement that creates a new div element and assigns it to the variable bubble.bubble.classList.add("bubble")
: This is a JavaScript statement that adds the class bubble to the bubble element.const size = Math.random() * 60 + 20
: This is a JavaScript statement that assigns a random size between 20 and 80 to the size variable.bubble.style.width =
${size}px;
: This is a JavaScript statement that sets the width of the bubble to the size variable.bubble.style.height =
${size}px;
: This is a JavaScript statement that sets the height of the bubble to the size variable.const startPosition = Math.random() * 100
: This is a JavaScript statement that assigns a random start position between 0 and 100 to the startPosition variable.bubble.style.left =
${startPosition}%;
: This is a JavaScript statement that sets the left position of the bubble to the startPosition variable.const duration = Math.random() * 15 + 10
: This is a JavaScript statement that assigns a random duration between 10 and 25 to the duration variable.bubble.style.setProperty("--random-offset", Math.random() * 360 + "deg");
: This is a JavaScript statement that sets the random-offset property of the bubble to a random value between 0 and 360 degrees.bubble.style.animation =
float ${duration}s linear infinite;
: This is a JavaScript statement that sets the animation property of the bubble to float duration s linear infinite.const colors = ["bg-[#f1dfd9]", "bg-[#f4c0d8]", "bg-[#c9b0df]", "bg-[#b767d4]", "bg-[#84adc2]", "bg-[#c8589e]"];
: This is a JavaScript statement that assigns an array of Tailwind color classes to the colors variable.bubble.classList.add(colors[Math.floor(Math.random() * colors.length)]);
: This is a JavaScript statement that adds a random color from the colors array to the bubble element.setInterval(() => {
: This is a JavaScript statement that starts an interval that will run the following code every 2 seconds.bubble.classList.remove(...colors);
: This is a JavaScript statement that removes all colors from the bubble element.bubble.classList.add(colors[Math.floor(Math.random() * colors.length)]);
: This is a JavaScript statement that adds a random color from the colors array to the bubble element.}, 2000);
: This is a JavaScript statement that ends the interval.const container = document.getElementById("bubble-container");
: This is a JavaScript statement that assigns the element with the id bubble-container to the container variable.if (container) {
: This is a JavaScript statement that checks if the container variable is not null.container.appendChild(bubble);
: This is a JavaScript statement that appends the bubble element to the container element.}, duration * 1000);
: This is a JavaScript statement that ends the timeout.setTimeout(() => {
: This is a JavaScript statement that starts a timeout that will run the following code after the duration variable.bubble.remove();
: This is a JavaScript statement that removes the bubble element from the DOM.}, duration * 1000);
: This is a JavaScript statement that ends the timeout.function startBubbleAnimation()
: This is a JavaScript function that defines a function named startBubbleAnimation.for (let i = 0; i < 10; i++) {
: This is a JavaScript statement that starts a for loop that will run the following code 10 times.createBubble();
: This is a JavaScript statement that calls the createBubble function.}
: This is a JavaScript statement that ends the for loop.setInterval(createBubble, 300);
: This is a JavaScript statement that starts an interval that will run the createBubble function every 300 milliseconds.window.addEventListener("load", startBubbleAnimation);
: This is a JavaScript statement that adds an event listener to the window object that listens for the load event and calls the startBubbleAnimation function when the event is triggered. function createBubble() {
const bubble = document.createElement("div");
bubble.classList.add("bubble");
// Random size between 20px and 80px
const size = Math.random() * 60 + 20;
bubble.style.width = `${size}px`;
bubble.style.height = `${size}px`;
// Random starting position
const startPosition = Math.random() * 100;
bubble.style.left = `${startPosition}%`;
// Random animation duration
const duration = Math.random() * 15 + 10;
bubble.style.setProperty("--random-offset", Math.random() * 360 + "deg");
// Apply the animation
bubble.style.animation = `float ${duration}s linear infinite`;
// Array of Tailwind color classes
const colors = [
"bg-[#f1dfd9]",
"bg-[#f4c0d8]",
"bg-[#c9b0df]",
"bg-[#b767d4]",
"bg-[#84adc2]",
"bg-[#c8589e]",
];
// Initial color
bubble.classList.add(colors[Math.floor(Math.random() * colors.length)]);
// Change color every 2 seconds
setInterval(() => {
bubble.classList.remove(...colors);
bubble.classList.add(colors[Math.floor(Math.random() * colors.length)]);
}, 2000);
// Add bubble to container
const container = document.getElementById("bubble-container");
if (container) {
container.appendChild(bubble);
}
// Remove bubble after animation completes
setTimeout(() => {
bubble.remove();
}, duration * 1000);
}
// Create new bubbles periodically
function startBubbleAnimation() {
// Create initial set of bubbles
for (let i = 0; i < 10; i++) {
createBubble();
}
// Continue creating bubbles every 300ms
setInterval(createBubble, 300);
}
// Start animation when the page loads
window.addEventListener("load", startBubbleAnimation);
This is a simple tutorial that demonstrates how to create a bubble animation using Tailwind CSS and JavaScript and a bit of CSS too.
Hope you enjoyed this tutorial and have a great day!
/Michael Andreuzza
Get access to all themes
Unlock all themes for $199 for forever! Includes lifetime updates,
new themes, unlimited projects, and support
— No subscription
needed.