024

SVG Blob Morph

£10 or the whole Vault, £99

Organic blob masks that morph between shapes with MorphSVGPlugin. Portraits live inside drifting blobs that settle into a circle on hover.

MorphSVG intermediate
3 more details
morphinghover-effectclip-path

This demo reads better at your own screen size than in the frame below:

About this effect

An organic blob morphing effect built on MorphSVGPlugin, shown as a studio team row. Each card masks a portrait inside an SVG clipPath shaped like a hand-drawn blob, then drifts through a library of blob states on a slow ambient loop, with every card offset to its own rhythm so a row never looks cloned. On hover or keyboard focus the blob settles into a calm circle with a gentle back ease while the portrait scales up inside the mask. A matching outline path morphs in sync with the clip and picks up the accent colour, so the shape change and the colour change land together.

SVG Blob Morph - GSAP animation effect preview

What's included

8 items
  • MorphSVG-powered morphing between any number of blob path states
  • Blob doubles as a clipPath image mask, so photos live inside the moving shape
  • Ambient idle loop with per-card phase offset for an organic, non-cloned feel
  • Hover and focus morph to a calm circle with synchronized image zoom
  • Synchronized outline path with non-scaling stroke for a drawn edge
  • Four blob shapes included, all normalised to one bounding box so a row never looks uneven
  • Idle loop, hover morph, and speed all configurable via data attributes
  • Touch support: first tap morphs the blob, second tap follows the link

Perfect for

5 use cases
  • Team and about pages that want portraits with personality instead of circles
  • Portfolio and case study grids with a soft, editorial art direction
  • Service or feature sections that need organic shapes instead of hard rectangles
  • Landing page heroes where a static image mask feels too rigid
  • Creative agency sites that want motion without scroll-jacking

How it works

1 section

Each card contains an SVG with two paths sharing the same geometry: one inside a clipPath masking a photo, one rendered as a stroked outline. A looping timeline morphs both paths through a sequence of blob shapes with MorphSVG, offset per card so the cards never fall into step. Every shape in the library is normalised to the same bounding box, so cards sitting on different shapes still read as one row. Hover and focus pause the idle loop and morph to a circle with a soft overshoot; on leave the blob morphs home and the idle loop restarts from the settled shape rather than from a stale one.

Plugins MorphSVG
Difficulty Intermediate
Includes HTML + JS + CSS source, documentation, AI setup prompt, lifetime updates

Lighthouse, as measured

Google Lighthouse on this effect's demo, from the latest scan. A measurement of the demo as shipped, not a promise for your page.

Accessibility
100
Best practices
100

No performance score, on purpose. That figure depends on how you deploy: your server's compression and caching, your CDN, the connection and the device doing the test, none of which the code controls. The same page can score very differently on two consecutive runs, so measure it where it will live.

Paid effect

Purchase to unlock the code.

Buying SVG Blob Morph opens the HTML, CSS and JavaScript source, the full documentation, an AI setup prompt for your editor, and every update we ship to it. Standard license: unlimited personal and commercial projects. Every paid product is tested for desktop and mobile layouts, reduced-motion handling, animation cleanup and keyboard controls wherever there is something to operate.

£10 Standard license, unlimited projects

Browse free effects

Or the whole library: the Vault, £99, one payment.

Documentation

Quick Start

1. Add to your HTML <head>:

Code snippet omitted: it ships with the download.

2. Add before closing </body> tag:

Code snippet omitted: it ships with the download.

3. Add the effect HTML to your <body>:

Code snippet omitted: it ships with the download.

Important: every card needs a unique clipPath id (blobClip1, blobClip2, ...) with a matching clip-path="url(#...)" on its image. The script assigns each card a different starting blob automatically, so the initial d you paste is just a placeholder.

Using It With Your Own Design

What the effect requires of your markup

  • A .blob-morph container. Everything else is found from there.
  • One .blob-card per blob. It can be an <a>, a <button>, or any focusable element; the script binds hover, focus and tap to it.
  • Inside each card, an SVG on a 200 x 200 viewBox holding two paths with the same d: .blob-clip (inside a <clipPath>) and .blob-outline (stroked and visible). Both are morph targets and must move together, which is what gives the shape a drawn edge rather than a flat silhouette.
  • .blob-img is the masked <image>. It carries clip-path="url(#...)" pointing at that card's own clipPath id.
  • Every card needs a unique clipPath id. Duplicate ids mean every blob masks through the first card's shape, which looks like the morph is broken.

What is only this demo's CSS

The grey page, Mona Sans, the fat display line, the hairline rules, the captions and the electric-blue accent are all art direction. None of it is load-bearing. .blob-figure and .blob-caption are demo layout classes the script never touches; drop them and lay the cards out however you like.

The non-obvious CSS the effect depends on

  • .blob-svg { overflow: visible }. The hover shape is a circle inscribed in the same bounding box as the blobs, but the back.out overshoot briefly pushes past it. Without this the settle clips against the SVG edge and reads as a stutter.
  • stroke="currentColor" on .blob-outline, with the colour set on .blob-card. That is what lets .is-active recolour the outline in CSS while GSAP owns the shape; if you hardcode a stroke colour the settle loses half its effect.
  • vector-effect="non-scaling-stroke" keeps the outline one hairline wide at every card size. Without it the stroke thickens as the blob scales up.
  • The <image> is drawn at y="16" rather than y="0". The blob narrows towards the top, so a portrait framed tight to the top of its file gets its crown cut off. Nudging the image down inside the mask moves the crop onto the shoulders instead. Adjust this to suit your own photography rather than assuming 0 is correct.

Choosing your own blob shapes

All shapes in the library, and the hover circle, are normalised to the same bounding box (10 to 190 on both axes). Keep any shape you add inside that box or that card will visibly sit at a different size to the rest of the row. Every path must also be closed and use the same command structure, or MorphSVG has to guess at the correspondence and the morph twists.

Options

Set these as data attributes on the .blob-morph container.

Attribute Values Default Description
data-enabled true, false true Enable/disable the effect
data-idle true, false true Ambient morph loop while idle
data-hover true, false true Morph to a circle on hover/focus
data-speed Any number 1 Ambient loop speed multiplier

Accessibility

This effect is fully accessible:

  • Reduced motion: With prefers-reduced-motion: reduce, blobs render as static shapes; no ambient loop, no hover morph, and the content stays fully visible
  • Keyboard navigation: Focus triggers the same morph as hover, with a visible focus outline on the card
  • Touch: First tap plays the morph, second tap follows the link
  • Semantic HTML: Cards are real links; the decorative SVG is aria-hidden so screen readers read the label text

Dependencies

Required:

  • GSAP 3.12+
  • MorphSVGPlugin (free on the public CDN since GSAP 3.13)

Optional:

  • None. No scroll behaviour, so no ScrollTrigger or Lenis needed.

Worked examples, the events and programmatic API, and the class reference ship with the download, alongside the full source.