Floating Blob
🟢 CSS OnlyFluid, vibrant colored circular blobs bouncing gently and morphing shapes in the background.
Responsive Horizontal Leaderboard
Slot ID: ca-pub-detail-below-preview
Interactive Settings
Medium Rectangle Block
Slot ID: ca-pub-detail-after-customization
Quick Copy Actions
Download File Packages
Keyboard Shortcuts
Responsive Horizontal Leaderboard
Slot ID: ca-pub-detail-before-related
More in Blob
Loading Canvas Shader...
Organic Blob
A single large centered blob with an organically shifting outline and high-contrast pastel gradients.
Loading Canvas Shader...
Lava Blob
Simulating a dark volcanic lava lamp with vertical bubbles joining, rising, and separating slowly.
Loading Canvas Shader...
Morphing Blob
An animated shifting color drop with glassmorphic reflection overlay, perfect as an accent backplate.
Floating Blob - CSS-only Blob background for React & Tailwind
Integrate the Floating Blob directly into your website. This asset is rendered using pure CSS and HTML keyframes. It is optimized for zero layout-shifts and runs with high-performance hardware-accelerated processing.
⚡ Performance Specifications
- Render Mode: CSS-ONLY (CSS-only)
- Fluidity: Locked at 60fps dynamic loop
- Bundle Footprint: Zero external NPM dependencies
- SEO Indexing status: 100% Crawlable static semantic HTML
🛠️ Integration Capabilities
Our templates expose inline design tokens like --color-1 and --color-2 for infinite color palettes. This template is designed to fit inside hero elements, full-screen landing pages, and interactive presentation cards.
Technical Code Reference & Syntaxes for Googlebot & Crawlers
The snippets below display the direct, unminified source code utilized for rendering this background.
HTML & Inline CSS Snippet (Vanilla)
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Floating Blob</title>
<style>
html, body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
overflow: hidden;
background: #09090b;
}
:root {
--speed-pink: 12s;
--speed-cyan: 16s;
}
.blob-wrapper {
position: relative;
width: 100%;
height: 100%;
background: #09090b;
overflow: hidden;
}
.blob {
position: absolute;
border-radius: 50%;
filter: blur(50px);
opacity: 0.55;
mix-blend-mode: screen;
}
.blob-pink {
width: 250px;
height: 250px;
background: #f43f5e;
top: 20%;
left: 20%;
animation: blob-float-pink var(--speed-pink) infinite ease-in-out;
}
.blob-cyan {
width: 300px;
height: 300px;
background: #18c5ff;
bottom: 25%;
right: 20%;
animation: blob-float-cyan var(--speed-cyan) infinite ease-in-out;
}
@keyframes blob-float-pink {
0% { transform: translate(0, 0) scale(1); border-radius: 50% 40% 30% 60% / 50% 30% 70% 50%; }
33% { transform: translate(100px, 80px) scale(1.15); border-radius: 40% 60% 50% 30% / 40% 50% 60% 70%; }
66% { transform: translate(-50px, 120px) scale(0.9); border-radius: 60% 30% 70% 40% / 50% 60% 30% 50%; }
100% { transform: translate(0, 0) scale(1); border-radius: 50% 40% 30% 60% / 50% 30% 70% 50%; }
}
@keyframes blob-float-cyan {
0% { transform: translate(0, 0) scale(1.1); border-radius: 40% 50% 60% 70% / 40% 60% 50% 30%; }
33% { transform: translate(-120px, -60px) scale(0.85); border-radius: 60% 30% 70% 40% / 50% 60% 30% 50%; }
66% { transform: translate(80px, -110px) scale(1.1); border-radius: 50% 40% 30% 60% / 50% 30% 70% 50%; }
100% { transform: translate(0, 0) scale(1.1); border-radius: 40% 50% 60% 70% / 40% 60% 50% 30%; }
}
</style>
</head>
<body>
<div class="blob-wrapper">
<div class="blob blob-pink"></div>
<div class="blob blob-cyan"></div>
</div>
</body>
</html>React Component Wrapper (TSX)
import React from 'react';
export default function FloatingBlobBackground() {
return (
<div
style={{ width: '100%', height: '100%', position: 'relative', overflow: 'hidden' }}
>
<style dangerouslySetInnerHTML={{ __html: `
:root {
--speed-pink: 12s;
--speed-cyan: 16s;
}
.blob-wrapper {
position: relative;
width: 100%;
height: 100%;
background: #09090b;
overflow: hidden;
}
.blob {
position: absolute;
border-radius: 50%;
filter: blur(50px);
opacity: 0.55;
mix-blend-mode: screen;
}
.blob-pink {
width: 250px;
height: 250px;
background: #f43f5e;
top: 20%;
left: 20%;
animation: blob-float-pink var(--speed-pink) infinite ease-in-out;
}
.blob-cyan {
width: 300px;
height: 300px;
background: #18c5ff;
bottom: 25%;
right: 20%;
animation: blob-float-cyan var(--speed-cyan) infinite ease-in-out;
}
@keyframes blob-float-pink {
0% { transform: translate(0, 0) scale(1); border-radius: 50% 40% 30% 60% / 50% 30% 70% 50%; }
33% { transform: translate(100px, 80px) scale(1.15); border-radius: 40% 60% 50% 30% / 40% 50% 60% 70%; }
66% { transform: translate(-50px, 120px) scale(0.9); border-radius: 60% 30% 70% 40% / 50% 60% 30% 50%; }
100% { transform: translate(0, 0) scale(1); border-radius: 50% 40% 30% 60% / 50% 30% 70% 50%; }
}
@keyframes blob-float-cyan {
0% { transform: translate(0, 0) scale(1.1); border-radius: 40% 50% 60% 70% / 40% 60% 50% 30%; }
33% { transform: translate(-120px, -60px) scale(0.85); border-radius: 60% 30% 70% 40% / 50% 60% 30% 50%; }
66% { transform: translate(80px, -110px) scale(1.1); border-radius: 50% 40% 30% 60% / 50% 30% 70% 50%; }
100% { transform: translate(0, 0) scale(1.1); border-radius: 40% 50% 60% 70% / 40% 60% 50% 30%; }
}
` }} />
{/* HTML Structure */}
<div
style={{ width: '100%', height: '100%' }}
dangerouslySetInnerHTML={{ __html: `
<div class="blob-wrapper">
<div class="blob blob-pink"></div>
<div class="blob blob-cyan"></div>
</div>
` }}
/>
</div>
);
}Next.js App Router Component (use client)
'use client';
import React from 'react';
export default function FloatingBlobBackground() {
return (
<div
className="w-full h-full relative overflow-hidden"
>
<style dangerouslySetInnerHTML={{ __html: `
:root {
--speed-pink: 12s;
--speed-cyan: 16s;
}
.blob-wrapper {
position: relative;
width: 100%;
height: 100%;
background: #09090b;
overflow: hidden;
}
.blob {
position: absolute;
border-radius: 50%;
filter: blur(50px);
opacity: 0.55;
mix-blend-mode: screen;
}
.blob-pink {
width: 250px;
height: 250px;
background: #f43f5e;
top: 20%;
left: 20%;
animation: blob-float-pink var(--speed-pink) infinite ease-in-out;
}
.blob-cyan {
width: 300px;
height: 300px;
background: #18c5ff;
bottom: 25%;
right: 20%;
animation: blob-float-cyan var(--speed-cyan) infinite ease-in-out;
}
@keyframes blob-float-pink {
0% { transform: translate(0, 0) scale(1); border-radius: 50% 40% 30% 60% / 50% 30% 70% 50%; }
33% { transform: translate(100px, 80px) scale(1.15); border-radius: 40% 60% 50% 30% / 40% 50% 60% 70%; }
66% { transform: translate(-50px, 120px) scale(0.9); border-radius: 60% 30% 70% 40% / 50% 60% 30% 50%; }
100% { transform: translate(0, 0) scale(1); border-radius: 50% 40% 30% 60% / 50% 30% 70% 50%; }
}
@keyframes blob-float-cyan {
0% { transform: translate(0, 0) scale(1.1); border-radius: 40% 50% 60% 70% / 40% 60% 50% 30%; }
33% { transform: translate(-120px, -60px) scale(0.85); border-radius: 60% 30% 70% 40% / 50% 60% 30% 50%; }
66% { transform: translate(80px, -110px) scale(1.1); border-radius: 50% 40% 30% 60% / 50% 30% 70% 50%; }
100% { transform: translate(0, 0) scale(1.1); border-radius: 40% 50% 60% 70% / 40% 60% 50% 30%; }
}
` }} />
{/* HTML Structure */}
<div
className="w-full h-full"
dangerouslySetInnerHTML={{ __html: `
<div class="blob-wrapper">
<div class="blob blob-pink"></div>
<div class="blob blob-cyan"></div>
</div>
` }}
/>
</div>
);
}Raw CSS Stylesheet Snippet
:root {
--speed-pink: 12s;
--speed-cyan: 16s;
}
.blob-wrapper {
position: relative;
width: 100%;
height: 100%;
background: #09090b;
overflow: hidden;
}
.blob {
position: absolute;
border-radius: 50%;
filter: blur(50px);
opacity: 0.55;
mix-blend-mode: screen;
}
.blob-pink {
width: 250px;
height: 250px;
background: #f43f5e;
top: 20%;
left: 20%;
animation: blob-float-pink var(--speed-pink) infinite ease-in-out;
}
.blob-cyan {
width: 300px;
height: 300px;
background: #18c5ff;
bottom: 25%;
right: 20%;
animation: blob-float-cyan var(--speed-cyan) infinite ease-in-out;
}
@keyframes blob-float-pink {
0% { transform: translate(0, 0) scale(1); border-radius: 50% 40% 30% 60% / 50% 30% 70% 50%; }
33% { transform: translate(100px, 80px) scale(1.15); border-radius: 40% 60% 50% 30% / 40% 50% 60% 70%; }
66% { transform: translate(-50px, 120px) scale(0.9); border-radius: 60% 30% 70% 40% / 50% 60% 30% 50%; }
100% { transform: translate(0, 0) scale(1); border-radius: 50% 40% 30% 60% / 50% 30% 70% 50%; }
}
@keyframes blob-float-cyan {
0% { transform: translate(0, 0) scale(1.1); border-radius: 40% 50% 60% 70% / 40% 60% 50% 30%; }
33% { transform: translate(-120px, -60px) scale(0.85); border-radius: 60% 30% 70% 40% / 50% 60% 30% 50%; }
66% { transform: translate(80px, -110px) scale(1.1); border-radius: 50% 40% 30% 60% / 50% 30% 70% 50%; }
100% { transform: translate(0, 0) scale(1.1); border-radius: 40% 50% 60% 70% / 40% 60% 50% 30%; }
}