Skip to content

fix(carousel): eliminate banner "blink" on crossfade switch (#1010)#1318

Merged
jonfroehlich merged 1 commit into
masterfrom
1010-fix-banner-crossfade-blink
Jun 17, 2026
Merged

fix(carousel): eliminate banner "blink" on crossfade switch (#1010)#1318
jonfroehlich merged 1 commit into
masterfrom
1010-fix-banner-crossfade-blink

Conversation

@jonfroehlich

@jonfroehlich jonfroehlich commented Jun 17, 2026

Copy link
Copy Markdown
Member

What & why

Fixes #1010 — the hero/banner carousel "blinks" (a pink/magenta flash) when switching between banners on multi-banner pages.

Root cause. The crossfade was symmetric: on switch, the outgoing slide faded 1→0 while the incoming faded 0→1 simultaneously. Each slide is an opaque unit (black bg + cover image), so while both are semi-transparent mid-transition, up to ~25% of #main-carousel's bright magenta gradient backdrop bleeds through at the midpoint — the visible blink.

Fix. Make the crossfade dip-free by splitting the transition (CSS only, carousel_fade.css): the incoming slide fades in over a still-opaque outgoing slide, which only snaps to 0 (0s change, delayed by the fade duration) once it's fully covered. An opaque slide always covers the backdrop → zero bleed-through, while the 0.6s crossfade look is preserved. Reduced-motion still gets an instant cut.

Context on #1010

The original 2022 report predates the Bootstrap→vanilla carousel rewrite (#1288). That rewrite already fixed the decode-lag trigger (huge undecoded images) via server-side thumbnailing; this PR addresses the crossfade backdrop-bleed that the rewrite carried over. So #1010 is now fully resolved.

Verification

Drove the real page (/project/handsight, 3 banners) in a headless browser, slowed the crossfade to 2s, and screenshotted the exact transition midpoint under both the old and new CSS:

Midpoint mean RGB Result
Old (symmetric) (126, 92, 120) — blue channel spikes ~+45 magenta wash (blink)
New (asymmetric, this PR) (120, 93, 75) — natural warm blend clean photo-to-photo crossfade

Before / after (midpoint of the same banner switch)

Before (blink): attach issue1010_before_blink.png

After (fixed): attach issue1010_after_fixed.png

Scope / risk

  • One file, transition-timing only — no markup, no JS, no contrast changes.
  • prefers-reduced-motion path preserved (instant cut, no crossfade).
  • Affects every carousel-fade carousel (home, project gallery, project pages) — all benefit identically.

Testing notes

I visually verified this works but not taking a video.

The hero/banner carousel used a symmetric opacity crossfade: on switch the
outgoing slide faded 1->0 while the incoming faded 0->1 at the same time.
Each slide is an opaque unit (black bg + cover image), so while both are
semi-transparent mid-transition, up to ~25% of #main-carousel's bright
magenta gradient backdrop bleeds through at the midpoint -- a visible
pink/magenta "blink" when banners switch.

Make the crossfade dip-free by splitting the transition: the incoming slide
fades in over a still-opaque outgoing slide, which only snaps to 0 (0s change,
delayed by the fade duration) after it's fully covered. An opaque slide always
covers the backdrop, so there is zero bleed-through, while the 0.6s crossfade
look is preserved. Reduced-motion still gets an instant cut.

This is the residual half of #1010: the original 2022 report predated the
Bootstrap->vanilla rewrite (#1288). The decode-lag trigger (huge undecoded
images) was already fixed by server-side thumbnailing; this addresses the
crossfade backdrop-bleed that the rewrite carried over.

Verified with a headless-browser A/B at the transition midpoint: the old
symmetric fade shows a magenta wash (mean RGB blue channel spikes ~+45);
the new asymmetric fade shows a clean photo-to-photo blend.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jonfroehlich jonfroehlich merged commit cb4c6ec into master Jun 17, 2026
2 checks passed
@jonfroehlich jonfroehlich deleted the 1010-fix-banner-crossfade-blink branch June 17, 2026 14:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Individual Project Banner "Blinks" When Switching

1 participant