From af0c2d6eb2a76c96af641f0062c364d39816a364 Mon Sep 17 00:00:00 2001 From: Honey Date: Tue, 28 Apr 2026 09:39:50 +0200 Subject: [PATCH] fix: preload bg image before crossfade to eliminate black flash Co-Authored-By: Claude Sonnet 4.6 --- src/player.js | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/player.js b/src/player.js index b711994..b67c2bf 100644 --- a/src/player.js +++ b/src/player.js @@ -62,14 +62,21 @@ let _npBgLastUrl = ''; function _crossfadeNpBg(cv) { if ((cv || '') === _npBgLastUrl) return; _npBgLastUrl = cv || ''; - const currEl = document.getElementById(`np-bg-${_npBgCurr}`); - const nextId = _npBgCurr === 'a' ? 'b' : 'a'; - const nextEl = document.getElementById(`np-bg-${nextId}`); - if (!currEl || !nextEl) return; - nextEl.style.backgroundImage = cv ? `url('${cv}')` : 'none'; - nextEl.style.opacity = '1'; - currEl.style.opacity = '0'; - _npBgCurr = nextId; + const doFade = () => { + const currEl = document.getElementById(`np-bg-${_npBgCurr}`); + const nextId = _npBgCurr === 'a' ? 'b' : 'a'; + const nextEl = document.getElementById(`np-bg-${nextId}`); + if (!currEl || !nextEl) return; + nextEl.style.backgroundImage = cv ? `url('${cv}')` : 'none'; + nextEl.style.opacity = '1'; + currEl.style.opacity = '0'; + _npBgCurr = nextId; + }; + if (!cv) { doFade(); return; } + const img = new Image(); + img.onload = doFade; + img.onerror = doFade; + img.src = cv; } export function _syncNpDirect(s) {