The transitionstart event fires when a CSS transition has actually started—after any transition-delay has ended. Learn how it differs from transitionrun, addEventListener vs ontransitionstart, TransitionEvent properties, and five try-it labs.
01
Kind
Instance event
02
Type
TransitionEvent
03
When
Motion begins
04
Handler
ontransitionstart
05
Cancelable?
No
06
Status
Baseline Widely
Fundamentals
Introduction
When the delay is over and property values begin changing, the browser fires transitionstart. Use it to mark UI as “in motion,” start related work that should wait until animation actually begins, or log that the delay window ended.
Earlier in the lifecycle, transitionrun fires when the transition is created (start of any delay). After motion finishes you get transitionend; if it aborts, you get transitioncancel.
💡
Beginner tip
With a positive delay, you will see transitionrun first, then transitionstart when pixels move. With no delay (or a negative delay), MDN says both fire together.
Concept
Understanding transitionstart
An instance event on elements that participate in CSS Transitions. MDN: it fires when a CSS transition has actually started, i.e., after any transition-delay has ended. It is not cancelable.
Starts when delay ends and the animation of properties begins.
TransitionEvent — includes propertyName, elapsedTime, pseudoElement.
May be skipped if the transition is canceled during the delay (after transitionrun).
Baseline Widely available — solid modern browser support (since Mar 2020).
Foundation
📝 Syntax
Use the event name with addEventListener, or set the handler property:
Adding the driving class creates the transition. With a positive delay, this log appears when the delay finishes and the box starts moving—not at creation time.
Example 2 — ontransitionstart Property
MDN’s alternate style using the event handler property.
transitionstart is marked Baseline Widely available on MDN (across browsers since March 2020). Logos use the shared browser-image-sprite.png sprite from this project.
✓ Baseline · Widely available
Element transitionstart
Fires when a CSS transition actually starts after any transition-delay. Not cancelable. Pair with transitionrun to see the delay gap.
FullWidely available
Google Chrome74+
Yes
Mozilla Firefox53+
Yes
Apple Safari13.1+
Yes
Microsoft Edge79+ Chromium (legacy Edge partial)
Yes
Opera62+
Yes
Internet ExplorerNo transitionstart support
Unavailable
transitionstartBaseline
Bottom line: Listen with addEventListener("transitionstart", …). Use a positive delay to separate it from transitionrun; expect start only if the delay was not canceled.
Wrap Up
Conclusion
transitionstart is the “motion began” signal—after delay, when property values are changing. Pair it with transitionrun, transitionend, and transitioncancel for a complete lifecycle.
Use start for “in motion” UI; use run for “scheduled”
Log propertyName when several properties transition
Keep handlers light—this can fire often on busy UIs
❌ Don’t
Assume start always follows run (cancel during delay skips it)
Expect only one event when multiple properties transition
Forget that zero/negative delay makes run and start fire together
Confuse this with CSS Animations / Web Animations APIs
Skip transitionend / transitioncancel for cleanup
Summary
Key Takeaways
Knowledge Unlocked
Five things to remember about transitionstart
Motion began—after delay ends, pixels are changing.
5
Core concepts
🎬01
Means moving
after delay
Event
🎨02
TransitionEvent
property + time
API
⏱️03
vs run
delay gap
Compare
🔔04
addEventListener
preferred
Listen
🎯05
Baseline
widely available
Compat
❓ Frequently Asked Questions
It fires when a CSS transition has actually started — that is, after any transition-delay has ended and the property values begin changing. It is not cancelable.
No. MDN does not mark Element transitionstart as Deprecated, Experimental, or Non-standard. It is Baseline Widely available (across browsers since March 2020).
transitionrun fires when the transition is created (start of any delay). transitionstart fires when the actual animation begins (end of any delay). With no delay or a negative delay, both fire.
A TransitionEvent. Useful read-only properties include propertyName, elapsedTime, and pseudoElement.
Prefer element.addEventListener("transitionstart", handler). You can also set ontransitionstart where supported.
If the transition is canceled during the delay (after transitionrun), you may never see transitionstart or transitionend — you get transitioncancel instead.
Did you know?
Canceling during the delay can give you transitionrun without transitionstart. That is why “in motion” UI should key off start—not run—when you care about actual animation.