MediaWiki:Common.js: Difference between revisions
Jump to navigation
Jump to search
Created page with "→Any JavaScript here will be loaded for all users on every page load.: →TOC - floating: mw.hook('wikipage.content').add(function () { const toc = document.getElementById('toc'); if (!toc) return; const tocTop = toc.getBoundingClientRect().top + window.scrollY; function onScroll() { if (window.scrollY > tocTop) { toc.classList.add('toc-floating'); } else { toc.classList.remove('toc-floating'); } } // Desktop only listener..." |
No edit summary |
||
| (8 intermediate revisions by the same user not shown) | |||
| Line 4: | Line 4: | ||
TOC - floating | TOC - floating | ||
*/ | */ | ||
mw.hook('wikipage.content').add(function () { | mw.hook('wikipage.content').add(function () { | ||
const toc = document.getElementById('toc'); | const toc = document.getElementById('toc'); | ||
if (!toc) return; | if (!toc) return; | ||
// Horizontal pin helper | |||
function pinHorizontalPosition() { | |||
const rect = toc.getBoundingClientRect(); | |||
toc.style.setProperty('--toc-left', rect.left + 'px'); | |||
toc.style.left = rect.left + 'px'; | |||
toc.style.width = rect.width + 'px'; | |||
} | |||
// Don't float if not using desktop | |||
if (window.innerWidth < 600) return; | |||
const tocTop = toc.getBoundingClientRect().top + window.scrollY; | const tocTop = toc.getBoundingClientRect().top + window.scrollY; | ||
// Floating trigger: only float after scrolling past original position | |||
function onScroll() { | function onScroll() { | ||
if (window.scrollY > tocTop) { | if (window.scrollY > tocTop) { | ||
toc.classList.add('toc-floating'); | // ONLY when we first enter floating state | ||
if (!toc.classList.contains('toc-floating')) { | |||
pinHorizontalPosition(); // 👈 snapshot left + width | |||
toc.classList.add('toc-floating'); | |||
} | |||
} else { | } else { | ||
// Leaving floating state | |||
toc.classList.remove('toc-floating'); | toc.classList.remove('toc-floating'); | ||
unpinHorizontalPosition(); | |||
} | } | ||
} | |||
window.addEventListener('scroll', onScroll); | window.addEventListener('scroll', onScroll, { passive: true }); | ||
onScroll(); | |||
}); | }); | ||
// Prevent overlap with footer | // Prevent overlap with footer | ||
const footer = document.querySelector('#footer'); | const footer = document.querySelector('#footer'); | ||
Latest revision as of 14:50, 10 February 2026
/* Any JavaScript here will be loaded for all users on every page load. */
/*
TOC - floating
*/
mw.hook('wikipage.content').add(function () {
const toc = document.getElementById('toc');
if (!toc) return;
// Horizontal pin helper
function pinHorizontalPosition() {
const rect = toc.getBoundingClientRect();
toc.style.setProperty('--toc-left', rect.left + 'px');
toc.style.left = rect.left + 'px';
toc.style.width = rect.width + 'px';
}
// Don't float if not using desktop
if (window.innerWidth < 600) return;
const tocTop = toc.getBoundingClientRect().top + window.scrollY;
// Floating trigger: only float after scrolling past original position
function onScroll() {
if (window.scrollY > tocTop) {
// ONLY when we first enter floating state
if (!toc.classList.contains('toc-floating')) {
pinHorizontalPosition(); // 👈 snapshot left + width
toc.classList.add('toc-floating');
}
} else {
// Leaving floating state
toc.classList.remove('toc-floating');
unpinHorizontalPosition();
}
}
window.addEventListener('scroll', onScroll, { passive: true });
onScroll();
});
// Prevent overlap with footer
const footer = document.querySelector('#footer');
const footerTop = footer.getBoundingClientRect().top + window.scrollY;
if (window.scrollY + toc.offsetHeight + 100 > footerTop) {
toc.style.opacity = '0';
} else {
toc.style.opacity = '1';
}