Compare commits
2 commits
689ec3b138
...
edc3e3db1d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
edc3e3db1d | ||
|
|
719f6ced53 |
2 changed files with 17 additions and 3 deletions
|
|
@ -64,6 +64,12 @@
|
||||||
img.src = BG_URL
|
img.src = BG_URL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sync body[data-template] with the active template so CSS selectors (e.g. footer hide)
|
||||||
|
// stay correct on SPA navigation — PHP only sets it on the initial page load.
|
||||||
|
$effect(() => {
|
||||||
|
if (activeTemplate) document.body.dataset.template = activeTemplate
|
||||||
|
})
|
||||||
|
|
||||||
// Active la transition seulement après le premier paint à la bonne position.
|
// Active la transition seulement après le premier paint à la bonne position.
|
||||||
// Double rAF : le premier laisse passer un paint avec le bon translateX,
|
// Double rAF : le premier laisse passer un paint avec le bon translateX,
|
||||||
// le second active is-animated — évite l'animation parasite au chargement.
|
// le second active is-animated — évite l'animation parasite au chargement.
|
||||||
|
|
|
||||||
|
|
@ -23,15 +23,23 @@
|
||||||
function onScroll() {
|
function onScroll() {
|
||||||
if (rafId) return
|
if (rafId) return
|
||||||
rafId = requestAnimationFrame(() => {
|
rafId = requestAnimationFrame(() => {
|
||||||
const threshold = window.innerWidth > 800 ? 100 : 200
|
const scrollHeight = scrollableContainer.scrollHeight
|
||||||
const atBottom = scrollableContainer.scrollTop >= scrollableContainer.scrollHeight - scrollableContainer.clientHeight - threshold
|
const clientHeight = scrollableContainer.clientHeight
|
||||||
|
const threshold = window.innerWidth > 800 ? 100 : 200
|
||||||
|
// Only show footer when content actually overflows AND user is near the bottom.
|
||||||
|
// Without the overflow guard, atBottom is true even when scrollHeight === clientHeight
|
||||||
|
// (0 >= 0 - threshold), causing the footer to appear on pages with no scroll.
|
||||||
|
const overflows = scrollHeight > clientHeight
|
||||||
|
const atBottom = overflows && scrollableContainer.scrollTop >= scrollHeight - clientHeight - threshold
|
||||||
isHidden = !atBottom
|
isHidden = !atBottom
|
||||||
rafId = null
|
rafId = null
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
scrollableContainer.addEventListener('scroll', onScroll)
|
scrollableContainer.addEventListener('scroll', onScroll)
|
||||||
onScroll()
|
// No immediate onScroll() call: footer starts hidden and only reveals when
|
||||||
|
// the user actively scrolls near the bottom. Calling it immediately caused
|
||||||
|
// the footer to flash on page load when content barely exceeded the threshold.
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
scrollableContainer.removeEventListener('scroll', onScroll)
|
scrollableContainer.removeEventListener('scroll', onScroll)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue