Digital Garden
An Elegant Retreat: the Thirty-Minute Life of a Cross-Page Transition
When it arrived, everyone believed in it
The cross-page View Transition — one line of CSS, @view-transition { navigation: auto; }, cross-fading between pages along a 0.5-second spring curve. Touching no script, degrading automatically in unsupported browsers.
Technically impeccable, even elegant. And it shipped.
Then the user said one sentence
“In the garden, tapping Contact flashes the very top of the homepage for a moment, then arrives at the contact section.”
One sentence, and it died.
Root cause: the snapshot doesn’t know where you’re going
When the cross-page transition captures the new page’s snapshot, the page still rests at the top — the browser has no idea the “Contact” anchor sits at the bottom. So the transition first plays to the top-of-page frame, and the anchor jump arrives late.
Technically fixable: in pageswap, detect an anchor target and skip the transition, landing directly. And it was fixed.
But looking back after the fix, the problem had changed: anchor jumps need to land directly, and only anchor-less jumps deserve a transition — that rule itself was already admitting the transition was wrong.
The standard for retreat
Keep it, and pages gain 0.5 seconds of softening — at the cost of one more special case living in your head: when it appears, when it doesn’t.
Remove it, and the world returns to simplicity: navigation is navigation — crisp, direct, and true to thirty years of browser expectation.
When a rule needs an exception to save it, the exception is usually the answer. It went offline the same day; two blocks of CSS deleted, ten lines of script deleted.
What settled
The most valuable thing in this iteration was not what was added, but the courage to pull down, on the same day, something that had just shipped. Right work is polished repeatedly; right judgment is too.
Restraint is not only not adding — restraint also includes, with your own hands, retiring what you were proud of last month.
Comments