From cb6f97fc49b5b9e8627e3c1507ecd1d5e595b3dd Mon Sep 17 00:00:00 2001 From: Hasenpfote Date: Sun, 18 May 2025 12:26:59 +0900 Subject: [PATCH] fix: resolve katex-display scrollbar issues (#326) * fix: resolve katex-display scrollbar issues * style: add katex display container styles for better responsiveness * fix: enhance katex display handling with scrollable containers and intersection observer --------- Co-authored-by: L4Ph <4ranci0ne@gmail.com> --- src/layouts/Layout.astro | 42 +++++++++++++++++++++++++++++++++++++--- src/styles/markdown.css | 7 +++++++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro index a61344b0..db99dfd7 100644 --- a/src/layouts/Layout.astro +++ b/src/layouts/Layout.astro @@ -316,13 +316,49 @@ function initCustomScrollbar() { } }); }); + const katexElements = document.querySelectorAll('.katex-display') as NodeListOf; - katexElements.forEach((ele) => { - OverlayScrollbars(ele, { + + const katexObserverOptions = { + root: null, + rootMargin: '100px', + threshold: 0.1 + }; + + const processKatexElement = (element: HTMLElement) => { + if (!element.parentNode) return; + if (element.hasAttribute('data-scrollbar-initialized')) return; + + const container = document.createElement('div'); + container.className = 'katex-display-container'; + container.setAttribute('aria-label', 'scrollable container for formulas'); + + element.parentNode.insertBefore(container, element); + container.appendChild(element); + + OverlayScrollbars(container, { scrollbars: { - theme: 'scrollbar-base scrollbar-auto py-1', + theme: 'scrollbar-base scrollbar-auto', + autoHide: 'leave', + autoHideDelay: 500, + autoHideSuspend: false } }); + + element.setAttribute('data-scrollbar-initialized', 'true'); + }; + + const katexObserver = new IntersectionObserver((entries, observer) => { + entries.forEach(entry => { + if (entry.isIntersecting) { + processKatexElement(entry.target as HTMLElement); + observer.unobserve(entry.target); + } + }); + }, katexObserverOptions); + + katexElements.forEach(element => { + katexObserver.observe(element); }); } diff --git a/src/styles/markdown.css b/src/styles/markdown.css index 23bdad17..1f956eca 100644 --- a/src/styles/markdown.css +++ b/src/styles/markdown.css @@ -91,4 +91,11 @@ } } + + .katex-display-container { + max-width: 100%; + overflow-x: auto; + margin: 1em 0; + } + }