CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-d3-transition

Animated transitions for D3 selections with smooth interpolation between DOM states over time.

Pending

Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

Overview
Eval results
Files

timing-control.mddocs/

Timing Control

Configuration methods for controlling transition timing including delay, duration, and easing functions.

Capabilities

Delay Control

delay Method

Sets or gets the transition delay in milliseconds.

/**
 * Sets or gets the transition delay in milliseconds
 * @param value - Delay in milliseconds (constant or function), omit to get current delay
 * @returns The transition instance for chaining, or current delay if no value provided
 */
transition.delay(value?: number | DelayFunction): Transition | number;

Usage Examples:

// Constant delay
transition.delay(500); // 500ms delay

// Function-based delay (staggered animation)
transition.delay(function(d, i) {
  return i * 100; // 0ms, 100ms, 200ms, etc.
});

// Data-driven delay
transition.delay(d => d.delayTime);

// Common stagger pattern
selectAll("circle")
  .transition()
  .delay((d, i) => i * 50)
  .attr("r", 10);

// Get current delay (returns delay of first element)
const currentDelay = transition.delay();

Duration Control

duration Method

Sets or gets the transition duration in milliseconds. Default is 250ms.

/**
 * Sets or gets the transition duration in milliseconds
 * @param value - Duration in milliseconds (constant or function), omit to get current duration
 * @returns The transition instance for chaining, or current duration if no value provided
 */
transition.duration(value?: number | DurationFunction): Transition | number;

Usage Examples:

// Constant duration
transition.duration(1000); // 1 second

// Function-based duration
transition.duration(function(d, i) {
  return 500 + (i * 100); // Variable duration based on index
});

// Data-driven duration
transition.duration(d => d.animationTime);

// Common patterns
transition.duration(d => d.important ? 2000 : 500);

// Get current duration
const currentDuration = transition.duration();

// Short animation
transition.duration(150).style("opacity", 0);

// Long, dramatic animation
transition.duration(3000).attr("transform", "scale(2)");

Easing Functions

ease Method

Sets or gets the easing function for the transition. Default is d3.easeCubicInOut.

/**
 * Sets or gets the easing function for the transition
 * @param value - Easing function, omit to get current easing function
 * @returns The transition instance for chaining, or current easing function if no value provided
 */
transition.ease(value?: EaseFunction): Transition | EaseFunction;

Common Easing Functions (from d3-ease):

// Linear easing
transition.ease(d3.easeLinear);

// Cubic easing (default family)
transition.ease(d3.easeCubic);        // cubic in-out
transition.ease(d3.easeCubicIn);      // cubic in
transition.ease(d3.easeCubicOut);     // cubic out
transition.ease(d3.easeCubicInOut);   // cubic in-out (default)

// Bounce easing
transition.ease(d3.easeBounce);       // bounce out
transition.ease(d3.easeBounceIn);     // bounce in
transition.ease(d3.easeBounceOut);    // bounce out
transition.ease(d3.easeBounceInOut);  // bounce in-out

// Elastic easing
transition.ease(d3.easeElastic);      // elastic out
transition.ease(d3.easeElasticIn);    // elastic in
transition.ease(d3.easeElasticOut);   // elastic out
transition.ease(d3.easeElasticInOut); // elastic in-out

// Back easing
transition.ease(d3.easeBack);         // back out
transition.ease(d3.easeBackIn);       // back in
transition.ease(d3.easeBackOut);      // back out
transition.ease(d3.easeBackInOut);    // back in-out

Usage Examples:

// Smooth, natural animation
transition
  .duration(800)
  .ease(d3.easeCubicOut)
  .style("transform", "translateX(100px)");

// Bouncy effect
transition
  .duration(1500)
  .ease(d3.easeBounceOut)
  .attr("cy", 300);

// Custom easing function
transition.ease(function(t) {
  return t * t * t; // cubic in
});

// Linear for constant speed
transition
  .ease(d3.easeLinear)
  .duration(2000)
  .attr("stroke-dashoffset", 0);

// Get current easing function
const currentEase = transition.ease();

easeVarying Method

Sets per-element easing functions using a factory function.

/**
 * Sets per-element easing functions using a factory
 * @param factory - Function that returns an easing function for each element
 * @returns The transition instance for chaining
 */
transition.easeVarying(factory: EaseFactory): Transition;

Usage Examples:

// Different easing based on data
transition.easeVarying(function(d, i) {
  return d.type === "primary" ? d3.easeBounceOut : d3.easeLinear;
});

// Alternating easing based on index
transition.easeVarying(function(d, i) {
  return i % 2 === 0 ? d3.easeBackOut : d3.easeBackIn;
});

// Data-driven easing intensity
transition.easeVarying(function(d) {
  if (d.priority === "high") return d3.easeElasticOut;
  if (d.priority === "medium") return d3.easeCubicOut;
  return d3.easeLinear;
});

Timing Combinations

Combine timing controls for sophisticated animations:

// Staggered entrance with bounce
selectAll(".item")
  .transition()
  .delay((d, i) => i * 100)          // Stagger by 100ms
  .duration(800)                      // 800ms duration
  .ease(d3.easeBounceOut)            // Bounce easing
  .style("opacity", 1)
  .style("transform", "translateY(0)");

// Variable timing based on data
selectAll("circle")
  .transition()
  .delay(d => d.startTime)           // Data-driven delay  
  .duration(d => d.animationLength)  // Data-driven duration
  .ease(d3.easeBackOut)             // Consistent easing
  .attr("r", d => d.targetRadius);

// Sequential phases with different timing
const phase1 = transition()
  .duration(500)
  .ease(d3.easeLinear);

const phase2 = phase1.transition()   // Chained transition
  .duration(1000)
  .ease(d3.easeBounceOut);

selectAll(".element")
  .transition(phase1)
  .style("opacity", 0.5)
  .transition(phase2)  
  .style("transform", "scale(1.5)");

Default Values

  • Delay: 0ms (no delay)
  • Duration: 250ms
  • Easing: d3.easeCubicInOut

Performance Considerations

  • Shorter durations (< 300ms) feel snappy for UI interactions
  • Longer durations (> 1000ms) work well for dramatic effects or data visualization
  • Staggered delays create pleasing sequential animations but may increase total animation time
  • Linear easing provides consistent speed, good for progress indicators
  • Elastic/bounce easing adds personality but may be distracting in data-heavy interfaces

Function Signatures

type DelayFunction = (this: Element, d: any, i: number, group: Element[]) => number;
type DurationFunction = (this: Element, d: any, i: number, group: Element[]) => number;
type EaseFunction = (t: number) => number;
type EaseFactory = (this: Element, d: any, i: number, group: Element[]) => EaseFunction;

Install with Tessl CLI

npx tessl i tessl/npm-d3-transition

docs

animation-properties.md

control-flow.md

index.md

selection-operations.md

timing-control.md

transition-creation.md

tile.json