PagePathNav(ページパス表示)と GrowiContextualSubNavigation(PageControls等を含むサブナビゲーション)の Sticky 状態における z-index の重なり順を修正した際の知見。
スクロールしていって PagePathNav がウィンドウ上端に近づいたときに、PageControls のボタンが PagePathNav の要素の裏側に回ってしまい、クリックできなくなる。
z-index 的に以下のように重なっていたため:
[Before] 下層から順に:
PageControls が PagePathNav より下層にいたため、sticky 境界付近でクリック不能になっていた。
[After] 下層から順に:
GrowiContextualSubNavigation.tsx - GroundGlassBar を分離してレンダリング
position-fixed, z-1)z-3)PagePathNavSticky.tsx - z-index を動的に切り替え
z-2z-3GroundGlassBar を position-fixed で常に固定表示にすることで、
PageControls と切り離して独立した z-index 層として扱えるようにした。
これにより、GroundGlassBar → PagePathNav → PageControls という 理想的なレイヤー構造を実現できた。
PagePathNavSticky.tsx の sticky 時の z-index について:
// これだと CopyDropdown(マウスオーバーで表示されるドロップダウン)が出ない
innerActiveClass="active z-2 mt-1"
// これだと正常に動作する
innerActiveClass="active z-3 mt-1"
GrowiContextualSubNavigation の sticky-inner-wrapper は z-3 かつ横幅いっぱい(Flex アイテム)z-2)の上に重なる.grw-page-path-nav-layout:hover で visibility: visible になる仕組み
(参照: PagePathNavLayout.module.scss)PagePathNavSticky の sticky 時の z-index は z-3 である必要がある。
これは GrowiContextualSubNavigation と同じ層に置くことで、DOM 順序による前後関係を利用するため。
apps/app/src/client/components/PageView/PageView.tsxapps/app/src/client/components/Navbar/GrowiContextualSubNavigation.tsxapps/app/src/client/components/Navbar/GrowiContextualSubNavigation.module.scssapps/app/src/client/components/PagePathNavSticky/PagePathNavSticky.tsxapps/app/src/client/components/PagePathNavSticky/PagePathNavSticky.module.scssapps/app/src/components/Common/PagePathNav/PagePathNavLayout.tsx(CopyDropdown を含む)react-stickynode は 2025-12-31 で deprecated となる予定。
https://github.com/yahoo/react-stickynode
将来的には CSS position: sticky + IntersectionObserver への移行を検討する必要がある。
innerActiveClass で z-index を指定する際、
他のコンポーネントとの相互作用を確認すること