fix(ux): prevent flash of unstyled content during page transitions
- Keep old page stylesheet until new one is fully loaded - Hide new page wrapper until render() completes before starting animation
This commit is contained in:
+17
-5
@@ -78,12 +78,19 @@ function loadPageStyle(moduleName) {
|
|||||||
link.rel = 'stylesheet';
|
link.rel = 'stylesheet';
|
||||||
link.href = href;
|
link.href = href;
|
||||||
|
|
||||||
|
const oldLink = activePageStyle;
|
||||||
|
|
||||||
const loaded = new Promise((resolve) => {
|
const loaded = new Promise((resolve) => {
|
||||||
link.onload = resolve;
|
link.onload = () => {
|
||||||
link.onerror = resolve;
|
if (oldLink) oldLink.remove();
|
||||||
|
resolve();
|
||||||
|
};
|
||||||
|
link.onerror = () => {
|
||||||
|
if (oldLink) oldLink.remove();
|
||||||
|
resolve();
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
if (activePageStyle) activePageStyle.remove();
|
|
||||||
document.head.appendChild(link);
|
document.head.appendChild(link);
|
||||||
activePageStyle = link;
|
activePageStyle = link;
|
||||||
return loaded;
|
return loaded;
|
||||||
@@ -225,14 +232,19 @@ async function renderPage(route, previousPath = null) {
|
|||||||
await new Promise(r => setTimeout(r, 120));
|
await new Promise(r => setTimeout(r, 120));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Seiten-Wrapper bereits jetzt in den DOM einfügen, damit
|
// Seiten-Wrapper unsichtbar in den DOM einfügen, damit
|
||||||
// document.getElementById() in render() die richtigen Elemente findet.
|
// document.getElementById() in render() die richtigen Elemente findet.
|
||||||
const pageWrapper = document.createElement('div');
|
const pageWrapper = document.createElement('div');
|
||||||
pageWrapper.className = `page-transition ${inClass}`;
|
pageWrapper.className = 'page-transition';
|
||||||
|
pageWrapper.style.opacity = '0';
|
||||||
content.replaceChildren(pageWrapper);
|
content.replaceChildren(pageWrapper);
|
||||||
|
|
||||||
await module.render(pageWrapper, { user: currentUser });
|
await module.render(pageWrapper, { user: currentUser });
|
||||||
|
|
||||||
|
// Erst nach render() + CSS sichtbar machen und Animation starten
|
||||||
|
pageWrapper.style.opacity = '';
|
||||||
|
pageWrapper.classList.add(inClass);
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('[Router] Seiten-Render-Fehler:', err);
|
console.error('[Router] Seiten-Render-Fehler:', err);
|
||||||
renderError(app, err);
|
renderError(app, err);
|
||||||
|
|||||||
Reference in New Issue
Block a user