Archived
Footer-Anker von Unterseiten, 404 ohne Konsolenfehler, Datenschutz-Link im neuen Tab
ScrollToTop springt bei /#services nach dem Laden der Schriften zum Abschnitt (vorher landete man oben auf der Startseite bzw. 220 px zu weit unten). Dazu Quelltext-Test gegen 99,9. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e6d603cd0c
commit
d78338a969
4 files changed
+85
-18
No files matched your search
+31
-3
@@ -10,11 +10,39 @@ import { AppRoutes } from "./routes";
|
||||
|
||||
const queryClient = new QueryClient();
|
||||
|
||||
/** Scrollt bei einem Seitenwechsel nach oben; Anker-Links (URL mit #) bleiben unberührt. */
|
||||
const ScrollToTop = () => {
|
||||
/**
|
||||
* Scrollt bei einem Seitenwechsel nach oben. Mit Anker (URL mit #) springt es zum Abschnitt,
|
||||
* sobald er gerendert ist, z. B. beim Footer-Link „/#services“ von einer Unterseite aus.
|
||||
*/
|
||||
export const ScrollToTop = () => {
|
||||
const { pathname, hash } = useLocation();
|
||||
useEffect(() => {
|
||||
if (!hash) window.scrollTo(0, 0);
|
||||
if (!hash) {
|
||||
window.scrollTo(0, 0);
|
||||
return;
|
||||
}
|
||||
const id = decodeURIComponent(hash.slice(1));
|
||||
let versuche = 0;
|
||||
let frame = 0;
|
||||
let abgebrochen = false;
|
||||
const springe = () => {
|
||||
const ziel = document.getElementById(id);
|
||||
if (!ziel) {
|
||||
if (versuche++ < 60) frame = requestAnimationFrame(springe); // höchstens ca. 1 s warten
|
||||
return;
|
||||
}
|
||||
// Erst springen, wenn die Schriften geladen sind: Vorher ist der Text darüber höher,
|
||||
// und der Abschnitt landet nach dem Nachladen ein Stück zu weit oben.
|
||||
const schriften = document.fonts?.ready ?? Promise.resolve();
|
||||
schriften.then(() => {
|
||||
if (!abgebrochen) ziel.scrollIntoView();
|
||||
});
|
||||
};
|
||||
springe();
|
||||
return () => {
|
||||
abgebrochen = true;
|
||||
cancelAnimationFrame(frame);
|
||||
};
|
||||
}, [pathname, hash]);
|
||||
return null;
|
||||
};
|
||||
|
||||
Reference in new issue
Block a user