Post
2025年12月2日 下午09:31

useResizeObserver

圖片的顯示範圍並不是固定的,例如當進入放大模式後左右兩邊的黑邊會需要消失。這時使用 ResizeObserver 解耦就變得很方便。(而且效能也不錯)

方便使用,我們參考 useHooks 的 useIntersectionObserver 另外寫了一個 useResizeObserver 觸發 rerender。

// useResizeObserver hook to observe size changes of a DOM element, return a ResizeObserver entry

export const useResizeObserver = (element: HTMLElement | null): ResizeObserverEntry | null => {

const [entry, setEntry] = useState<ResizeObserverEntry | null>(null);

useEffect(() => {

if (!element) return;

const resizeObserver = new ResizeObserver((entries) => {

if (entries.length > 0) {

setEntry(entries[0]);

}

});

resizeObserver.observe(element);

return () => {

resizeObserver.disconnect();

};

}, [element]);

return entry;

};

沒有什麼特別之處,簡單但蠻方便的。

ResizeObserver 的詳細資料可以參考文件: https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver

Lightbox pointer event 穿透

黑邊關閉圖片是這次重構的重點之一,但也是最麻煩的。

以附圖為例:

  • 橘色斜線區域是應該要觸發關閉的黑邊區域。
  • 綠色網狀區是圖片本身,應該要觸發拖曳或縮放效果。而且拖曳時橘色區域應該關閉。
  • 紅色是切換圖片的手勢區域。

理想的做法是在橘色區域綁 onClick⋯⋯但 HTML 沒有 event mask 這種東西。而且黑邊的大小跟位置也不固定,用 event position 判斷並不實際。

CSS 有 pointer-event: none 可以使用,理論上在 Lightbox wrapper 設定事件穿透,讓後面的 backdrop 收得到事件就沒有問...

...顯示更多 (367 字)

綜合之後,就是這次的更新😊

一個盡量模仿原生介面的 Web Lightbox。

做完之後又可以繼續拖稿 App 了