demo · v140
Transition Sequencer
Chain three view transitions using await vt.finished. In Chrome 140, finished resolves after the animation truly completes, so A→B then B→C sequences cleanly. Enable "Old timing" to simulate the pre-140 early resolution and see the flicker.
A
t1.ready—
t1.updateCallbackDone—
t1.finished—
t2.ready—
t2.updateCallbackDone—
t2.finished—
t3.ready—
t3.done—
Press "Run sequence" to start.
Transition timeline — each row = one step
run the sequence to see the timeline
pre-140 — early finished, overlap
// finished resolved too early → // starting t2 while t1 still animating // → visual overlap / flicker const t1 = startViewTransition(...); await t1.finished; // resolved mid-animation! const t2 = startViewTransition(...); // t1 and t2 run concurrently → mess
Chrome 140 — finished = animation done
// finished resolves after animation ends // → t2 starts when t1 is fully complete const t1 = startViewTransition(...); await t1.finished; // resolves after paint const t2 = startViewTransition(...); await t2.finished; // clean sequential chain, no flicker
async function runSequence() {
const t1 = document.startViewTransition(() => showPanel('B'));
await t1.finished; // Chrome 140: resolves when animation ends
const t2 = document.startViewTransition(() => showPanel('C'));
await t2.finished;
const t3 = document.startViewTransition(() => showPanel('A'));
await t3.finished;
console.log('All transitions complete, cleanly sequenced');
}
see also
- View Transition finished promise timing change — feature index
- Timing Diagram — waterfall view
- No-flicker Cleanup — cleanup code demo
- ChromeStatus entry