MediaWiki:Common.js: Difference between revisions

From Fate/Starry Night Wiki
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();
   }
   }
  // Desktop only listener
}
  if (window.innerWidth < 1200) return;
 
   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';
}