Overview
SVG gooey blob effects merge two or more overlapping shapes into a single fluid silhouette via an SVG filter that blurs the alpha channel and then thresholds it back to a hard edge. The primitives stay div-or-circle simple; the filter does the work. Pair the technique with mix-blend-mode or a colored gradient and the result passes for true metaball math without any WebGL or per-frame JS.
When to use it
Reach for gooey for loading indicators, ambient hero accents, or any place where two shapes need to feel related (a navigation dot that absorbs into the next dot, drops of liquid coalescing, a marker that splits when reaching a divider). Skip it for content layout — the filter region creates a stacking context that traps clicks and can break form layouts beneath. Skip it under transparent backgrounds; the threshold matrix depends on opaque alpha to find an edge.
How it works
The filter is a two-step pipeline: feGaussianBlur stdDeviation="9" smudges the alpha channel of overlapping shapes into one blurry mass, then feColorMatrix multiplies the alpha by ~18 and subtracts ~7 so the smooth blur snaps back to a hard edge wherever the alpha crossed a threshold. Shapes that were too far apart to overlap during the blur step stay separate; shapes that overlapped fuse. Apply the filter to a parent<g> or div containing the primitives. Animate the underlying shapes’ transform or cx/cy — the goo follows.
In practical search terms, feColorMatrix values are the whole trick. A matrix tail like 18 -7 means “multiply the blurred alpha by 18, then subtract 7,” which crushes the soft blur into a crisp edge. A stronger tail like 21 -7 tightens the threshold and makes the gooey bridge appear later; a lower multiplier makes blobs merge sooner but look mushier. Tune the multiplier and the feGaussianBlur stdDeviation together instead of copying one magic matrix into every SVG gooey effect.
Production gotchas
Filter region defaults to a small bounding box; set x="-35%" y="-35%" width="170%" height="170%" on the filter so blur near the edges does not clip into a hard line. The created stacking context blocks pointer-events on anything underneath the filtered region; if a form sits beneath, use pointer-events: none on the gooey wrapper or move the form out of the filter region. On Safari iOS the colorMatrix multiplier > 20 can banding-artifact — stay in the 17-19 range. Animating the shapes with filter: blur already applied is double work; use a single SVG filter, not two.
Accessibility
The gooey region is decorative; wrap it in aria-hidden="true" and ensure focusable content sits outside the filtered region (the stacking context can make focus rings render wrong against the filter). Under prefers-reduced-motion: reduce freeze the underlying shape positions; the goo itself is fine because the filter is decorative geometry, not motion.
References