fix(docs): Shadow DOM 목차 앵커 클릭 시 스크롤 이동
브라우저의 #프래그먼트 이동은 Shadow DOM 안의 id를 못 찾아 목차 순번 클릭이 안 먹혔다. 클릭을 가로채 그림자 안에서 대상을 찾아 scrollIntoView.
This commit is contained in:
parent
cd61f06ba5
commit
a209bb1d80
@ -28,6 +28,28 @@ function DocShadow({ html }) {
|
|||||||
if (!host) return;
|
if (!host) return;
|
||||||
const shadow = host.shadowRoot || host.attachShadow({ mode: 'open' });
|
const shadow = host.shadowRoot || host.attachShadow({ mode: 'open' });
|
||||||
shadow.innerHTML = html;
|
shadow.innerHTML = html;
|
||||||
|
|
||||||
|
// ⚠️ Shadow DOM 안의 목차 앵커(<a href="#id">)는 브라우저 기본 스크롤이 안 먹는다.
|
||||||
|
// 브라우저의 #프래그먼트 이동은 light DOM의 id만 찾고, 그림자 트리 안은 못 본다.
|
||||||
|
// 그래서 클릭을 직접 가로채, 그림자 안에서 대상을 찾아 스크롤한다.
|
||||||
|
// (스크롤은 가장 가까운 스크롤 조상 .doc-immersive-scroll이 담당한다.)
|
||||||
|
const onClick = (e) => {
|
||||||
|
const a = e.composedPath().find(
|
||||||
|
(el) => el.tagName === 'A' && el.getAttribute?.('href')?.startsWith('#'),
|
||||||
|
);
|
||||||
|
if (!a) return;
|
||||||
|
const id = decodeURIComponent(a.getAttribute('href').slice(1));
|
||||||
|
if (!id) return;
|
||||||
|
const target =
|
||||||
|
shadow.querySelector(`#${CSS.escape(id)}`) ||
|
||||||
|
shadow.querySelector(`[name="${CSS.escape(id)}"]`);
|
||||||
|
if (target) {
|
||||||
|
e.preventDefault();
|
||||||
|
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
shadow.addEventListener('click', onClick);
|
||||||
|
return () => shadow.removeEventListener('click', onClick);
|
||||||
}, [html]);
|
}, [html]);
|
||||||
return <div ref={hostRef} className="doc-shadow-host" />;
|
return <div ref={hostRef} className="doc-shadow-host" />;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user