#

#

Pro Tips

Generative

SC Animated Radial Ellipse

SC Animated Radial Ellipse

SC Animated Radial Ellipse

Apr 27, 2025

0 views

A highly customizable SVG animation that draws multiple rotating ellipses in radial symmetry. Supports trim-path style reveals, gradient strokes, and responsive sizing—perfect for abstract loaders, hypnotic loops, animated backgrounds, and generative motifs.

Lilac Flower
Lilac Flower
Lilac Flower
Lilac Flower
#
Built With
React, SVG, CSS, Framer Code Component API
#
Layout Support
Fully Responsive or fixed width/height
#
Orientation
Full Fill or Text Mask
#
Ideal Use Case
Animated backgrounds, design motifs, abstract loaders
#
Built With
React, SVG, CSS, Framer Code Component API
#
Layout Support
Fully Responsive or fixed width/height
#
Orientation
Full Fill or Text Mask
#
Ideal Use Case
Animated backgrounds, design motifs, abstract loaders
#
Built With
React, SVG, CSS, Framer Code Component API
#
Layout Support
Fully Responsive or fixed width/height
#
Orientation
Full Fill or Text Mask
#
Ideal Use Case
Animated backgrounds, design motifs, abstract loaders

//

Tags

svg
ellipse
animation
radial
trim
stroke-dash
gradient
responsive
generative
//
Technologies
None (pure SVG/React)
//
Notes
No runtime libraries required; works with Framer’s standard runtime.
//
Technologies
None (pure SVG/React)
//
Notes
No runtime libraries required; works with Framer’s standard runtime.
//
Technologies
None (pure SVG/React)
//
Notes
No runtime libraries required; works with Framer’s standard runtime.
#
Logic Level
Medium (animated render, dash math)
#
Runtime Cost
Medium–High with rotate + trim active (bounded by ellipse count)
#
Component Size
~3–4 KB (raw TSX)
#
Notes
Use Show FPS only while debugging.
#
Logic Level
Medium (animated render, dash math)
#
Runtime Cost
Medium–High with rotate + trim active (bounded by ellipse count)
#
Component Size
~3–4 KB (raw TSX)
#
Notes
Use Show FPS only while debugging.
#
Logic Level
Medium (animated render, dash math)
#
Runtime Cost
Medium–High with rotate + trim active (bounded by ellipse count)
#
Component Size
~3–4 KB (raw TSX)
#
Notes
Use Show FPS only while debugging.
  1. Add SCAnimatedRadialEllipse to your canvas.

  2. Choose sizing: Size Mode = fixed (px) or dynamic (% of container).

  3. Set geometry: Count, Width/Height (or Width%/Height%), Width/Height Ratio.

  4. Style strokes: Stroke Width/Color or enable Gradient Blend and set a unique Gradient ID.

  5. Animate: toggle Animate → set Rotation direction/speed.

  6. Trim window (optional): enable Trim Path, tune Trim Speed, Trim Offset, Trim Phase Start, and Mirror Trim.

  7. Position: set Anchor and X/Y Offset.

  8. (Debug) Toggle Show FPS during tuning; disable before publish.

  • Loader Minimal: count=9 · strokeWidth=1 · animate=on · trimPath=on · trimSpeed=0.006 · rotationSpeed=0.15 · gradient=off.

  • Hypnotic Halo: count=33 · strokeWidth=2 · gradient=on · ellipseRatioX=1 · ellipseRatioY=1.2 · animate=on · trimPath=on · mirrorTrim=on.

  • Low-Power Accent: count=13 · animate=on · trimPath=off · rotationSpeed=0.1 · strokeWidth=1.

  • Odd symmetry: Ensures an odd Count for balanced radial spacing (angleStep = 360/oddCount).

  • Sizing: Uses fixed px or container-relative % to compute actualWidth/Height; ratios (ellipseRatioX/Y) thin/flatten radii (rx = width/ratioX, ry = height/ratioY).

  • Rotation: Each ellipse receives a per-element transform: rotate(angle, cx, cy) where angle = index*step + rotation.

  • Trim window: Approximates ellipse perimeter with Ramanujan’s formula; applies strokeDasharray=perimeter and animates strokeDashoffset by a sinusoidal phase (supports Mirror Trim by offsetting half-perimeter).

  • Gradient: Optional <linearGradient id={gradientId}> stroked via url(#id)—unique IDs prevent collisions across instances.

  • Layout: ResizeObserver and a resize handler update container dimensions; anchor presets offset the cluster by quarter-frame steps plus X/Y offsets.

  • Cost scales with Count × Stroke effects. Keep strokeWidth ≤ 2–3px when Trim Path is on.

  • Prefer moderate Count (7–33 UI accents, 33–99 hero visuals).

  • Large gradients across many ellipses are expensive—reuse one gradient where possible.

  • Disable Show FPS for production.

  • Modern evergreen browsers (Chrome/Edge/Safari/Firefox).

  • SVG gradients and stroke-dash animations are broadly supported; verify on older mobile Safari if using heavy gradients.

  • Multiple instances on one page must use unique Gradient ID.

  • Decorative by default; if it conveys no information, wrap with aria-hidden="true".

  • In Text Mask scenarios (external), ensure readable contrast or provide a plain-text alternative nearby.

  • No network calls; no data stored.

  • Typed props; no dangerouslySetInnerHTML / eval.

  • No device permissions.

  • Cleanup note: event listeners created for resize are removed; ResizeObserver is disconnected on unmount.

Name

Type

Default

Description

count

number

15

Number of ellipses (auto-forces odd for symmetry)

strokeWidth

number

1

SVG stroke width of each ellipse (px)

strokeColor

string

#FF4081

Stroke color (used if Gradient Blend is off)

gradient

boolean

false

Enable linear gradient stroke instead of solid color

gradientId

string

grad-default

Unique SVG gradient id (avoid collisions)

sizeMode

string(enum)

fixed

Ellipse sizing mode (fixed or container-relative)

ellipseWidth

number

200

Ellipse width in pixels (when Size Mode = fixed)

ellipseHeight

number

600

Ellipse height in pixels (when Size Mode = fixed)

widthPercent

number

12

Ellipse width as % of container (when Size Mode = dynamic)

heightPercent

number

48

Ellipse height as % of container (when Size Mode = dynamic)

ellipseRatioX

number

1

Width divisor for ellipse radius (higher = thinner)

ellipseRatioY

number

1

Height divisor for ellipse radius (higher = flatter)

animate

boolean

false

Turn on rotation/trim animation loop

showFPS

boolean

false

Overlay a live FPS counter (for testing)

rotationDirection

string(enum)

counter-clockwise

Rotation direction (counter-clockwise/clockwise)

rotationSpeed

number

0.2

Degrees per frame tick while animating

trimPath

boolean

false

Animate a traveling stroke “window” via dash offsets

mirrorTrim

boolean

false

Mirror trim window around the ellipse path

trimSpeed

number

0.01

Trim phase speed (cycles per frame tick)

trimOffset

number

0

Per-ellipse trim phase offset (−1..1)

trimStartOffset

number

0

Global trim phase start (0..1)

positionAnchor

string(enum)

center

Base anchor for the ellipse cluster

xOffset

number

0

Horizontal offset from anchor (px)

yOffset

number

0

Vertical offset from anchor (px)

name:count
type:number
default:15
desc:Number of ellipses (auto-forces odd for symmetry)
name:strokeWidth
type:number
default:1
desc:SVG stroke width of each ellipse (px)
name:strokeColor
type:string
default:#FF4081
desc:Stroke color (used if Gradient Blend is off)
name:gradient
type:boolean
default:false
desc:Enable linear gradient stroke instead of solid color
name:gradientId
type:string
default:grad-default
desc:Unique SVG gradient id (avoid collisions)
name:sizeMode
type:string(enum)
default:fixed
desc:Ellipse sizing mode (fixed or container-relative)
name:ellipseWidth
type:number
default:200
desc:Ellipse width in pixels (when Size Mode = fixed)
name:ellipseHeight
type:number
default:600
desc:Ellipse height in pixels (when Size Mode = fixed)
name:widthPercent
type:number
default:12
desc:Ellipse width as % of container (when Size Mode = dynamic)
name:heightPercent
type:number
default:48
desc:Ellipse height as % of container (when Size Mode = dynamic)
name:ellipseRatioX
type:number
default:1
desc:Width divisor for ellipse radius (higher = thinner)
name:ellipseRatioY
type:number
default:1
desc:Height divisor for ellipse radius (higher = flatter)
name:animate
type:boolean
default:false
desc:Turn on rotation/trim animation loop
name:showFPS
type:boolean
default:false
desc:Overlay a live FPS counter (for testing)
name:rotationDirection
type:string(enum)
default:counter-clockwise
desc:Rotation direction (counter-clockwise/clockwise)
name:rotationSpeed
type:number
default:0.2
desc:Degrees per frame tick while animating
name:trimPath
type:boolean
default:false
desc:Animate a traveling stroke “window” via dash offsets
name:mirrorTrim
type:boolean
default:false
desc:Mirror trim window around the ellipse path
name:trimSpeed
type:number
default:0.01
desc:Trim phase speed (cycles per frame tick)
name:trimOffset
type:number
default:0
desc:Per-ellipse trim phase offset (−1..1)
name:trimStartOffset
type:number
default:0
desc:Global trim phase start (0..1)
name:positionAnchor
type:string(enum)
default:center
desc:Base anchor for the ellipse cluster
name:xOffset
type:number
default:0
desc:Horizontal offset from anchor (px)
name:yOffset
type:number
default:0
desc:Vertical offset from anchor (px)

Name

Type

Default

Description

name:count
type:number
default:15
desc:Number of ellipses (auto-forces odd for symmetry)
name:strokeWidth
type:number
default:1
desc:SVG stroke width of each ellipse (px)
name:strokeColor
type:string
default:#FF4081
desc:Stroke color (used if Gradient Blend is off)
name:gradient
type:boolean
default:false
desc:Enable linear gradient stroke instead of solid color
name:gradientId
type:string
default:grad-default
desc:Unique SVG gradient id (avoid collisions)
name:sizeMode
type:string(enum)
default:fixed
desc:Ellipse sizing mode (fixed or container-relative)
name:ellipseWidth
type:number
default:200
desc:Ellipse width in pixels (when Size Mode = fixed)
name:ellipseHeight
type:number
default:600
desc:Ellipse height in pixels (when Size Mode = fixed)
name:widthPercent
type:number
default:12
desc:Ellipse width as % of container (when Size Mode = dynamic)
name:heightPercent
type:number
default:48
desc:Ellipse height as % of container (when Size Mode = dynamic)
name:ellipseRatioX
type:number
default:1
desc:Width divisor for ellipse radius (higher = thinner)
name:ellipseRatioY
type:number
default:1
desc:Height divisor for ellipse radius (higher = flatter)
name:animate
type:boolean
default:false
desc:Turn on rotation/trim animation loop
name:showFPS
type:boolean
default:false
desc:Overlay a live FPS counter (for testing)
name:rotationDirection
type:string(enum)
default:counter-clockwise
desc:Rotation direction (counter-clockwise/clockwise)
name:rotationSpeed
type:number
default:0.2
desc:Degrees per frame tick while animating
name:trimPath
type:boolean
default:false
desc:Animate a traveling stroke “window” via dash offsets
name:mirrorTrim
type:boolean
default:false
desc:Mirror trim window around the ellipse path
name:trimSpeed
type:number
default:0.01
desc:Trim phase speed (cycles per frame tick)
name:trimOffset
type:number
default:0
desc:Per-ellipse trim phase offset (−1..1)
name:trimStartOffset
type:number
default:0
desc:Global trim phase start (0..1)
name:positionAnchor
type:string(enum)
default:center
desc:Base anchor for the ellipse cluster
name:xOffset
type:number
default:0
desc:Horizontal offset from anchor (px)
name:yOffset
type:number
default:0
desc:Vertical offset from anchor (px)
  • Decorative by default; if it conveys no information, wrap with aria-hidden="true".

  • In Text Mask scenarios (external), ensure readable contrast or provide a plain-text alternative nearby.

  • No network calls; no data stored.

  • Typed props; no dangerouslySetInnerHTML / eval.

  • No device permissions.

  • Cleanup note: event listeners created for resize are removed; ResizeObserver is disconnected on unmount.

Concept, implementation, and Framer adaptation by SecretoCho Design.
Ellipse trim math uses a Ramanujan-style circumference approximation.

SecretoCho Design 2025

Provided “as is” for visual/UX purposes. Validate performance, accessibility, and visual contrast on your target devices and layouts.

Stay ahead of the curve with insights into emerging visualization trends and technologies.