この
v1.8.0 リリース時に
この機能は
ズームアウトするには
ローカル環境では
そして、
動作例
どんな

使った 実装に 切り替える
react-medium-image-zoom をズーム機能を
そもそも
使い方はZoom
コンポーネントで
import React from 'react'import Zoom from 'react-medium-image-zoom'import 'react-medium-image-zoom/dist/styles.css'
export const MyImg = () => ( <Zoom> <img alt="That Wanaka Tree, New Zealand by Laura Smetsers" src="/path/to/thatwanakatree.jpg" width="500" /> </Zoom>)
基本的には
TL;DR
- 前提条件:
position: fixed
とwidth
を使って UI を 作成している - Radix UI を
使って ルート要素の スクロールを 一時的に 無効化する コンポーネントを 使用する - 2 実行時に
スクロールバーの 幅分の レイアウトシフトが 発生する - 2 実行時に
1 の width
からスクロールバーの 幅を 引くと 問題は 解決する - 画像ズーム時も
スクロールバーの 幅分の レイアウトシフトが 発生する (3 とは 別理由) - 画像ズーム時に
スクロールバーの 幅を 取得して 1 の width
から引く ことで 解決する
スクロールバーの 挙動
Radix UI の当ブログでは
Radix UI の
このposition: fixed
を

モーダルでoverflow: hidden
を
今回のoverflow: hidden
の
body[data-scroll-locked] { --removed-body-scroll-bar-size: 16px;}
body[data-scroll-locked] { overflow: hidden !important; overscroll-behavior: contain; position: relative !important; padding-left: 0px; padding-top: 0px; padding-right: 0px; margin-left: 0; margin-top: 0; margin-right: 16px !important;}
Radix UI の
なるposition: fixed
スクロールバーをposition: fixed
width
から
export const Layout = ({ children }: { children: React.ReactNode }) => ( <div className='fixed inset-0 flex w-[calc(100%-var(--removed-body-scroll-bar-size,0px))] justify-center sm:px-8'> {/* ... */} </div>);
--removed-body-scroll-bar-size
は
スクロールバーの 挙動
react-medium-image-zoom のreact-medium-image-zoom をbody
タグにoverflow: hidden
が--removed-body-scroll-bar-size
は
幸いにもZoomContent
と
type ModalState = 'LOADED' | 'LOADING' | 'UNLOADED' | 'UNLOADING';
// eslint-disable-next-line @typescript-eslint/no-explicit-anyconst CustomZoom = ({ img, _modalState, gap }: { img: React.ReactElement | null; _modalState: any; gap: number }) => { const modalState = _modalState as ModalState;
React.useEffect(() => { if (modalState === 'LOADING') { document.body.style.setProperty('--removed-body-scroll-bar-size', `${gap}px`); }
if (modalState === 'UNLOADED') { document.body.style.removeProperty('--removed-body-scroll-bar-size'); } }, [gap, modalState]);
return <>{img}</>;};
上記コードでは--removed-body-scroll-bar-size
を--removed-body-scroll-bar-size
を
このCustomZoom
コンポーネントはZoom
コンポーネントのZoomContent
プロパティに
import { getGapWidth } from 'react-remove-scroll-bar';
const ZoomImage = ({ src, children }: { src: string; children: React.ReactNode }) => { const isDesktop = useMediaQuery('(min-width: 768px)'); const { gap } = getGapWidth();
return ( <Zoom zoomImg={{ src }} zoomMargin={isDesktop ? 45 : 10} ZoomContent={({ img, modalState }) => <CustomZoom img={img} _modalState={modalState} gap={gap} />} > {children} </Zoom> );};
肝心のgap
は
ZoomContent
プロパティのmodalState
はmodalState
をZoomContent
を
ざっとoverflow: hidden
を
ライブラリに
HTML や
そういったことに
極論だが、
リリース予定
今後の今の
- お問い
合わせ機能 - About ページ作成
(せっかくならいろんな API を 使いたい) - 統計ページ作成
(グラフを 色々 使いたい) - Notion 風の
目次を 作成 - PWA 化と
プッシュ通知機能の 実装 - 記事更新時に
各種 SNS へ 自動投稿 - メールマガジンの
実装 - Stripe を
使った 投げ銭機能の 実装 - Fediverse 対応
特に
それと、