模拟mac滚动效果,鼠标滚动时自动展示滚动条

608 阅读1分钟

利用React封装自定义hook,模拟mac滚动效果,鼠标滚动时自动展示滚动条,滚动后自动取消滚动条显示;

import { useEffect } from 'react';
export function useToggleScroll(dom: HTMLElement | null) {
  function initStyle() {
    if (!document.querySelector('#toggle-scroll')) {
      const style = document.createElement('style');
      style.type = 'text/css';
      style.id = 'toggle-scroll';
      style.innerHTML = `
            .toggle-scroll-hidden::-webkit-scrollbar-thumb,
            .toggle-scroll-hidden::-webkit-scrollbar-track {
              visibility: hidden;
            }
            .toggle-scroll-visible::-webkit-scrollbar-thumb,
            .toggle-scroll-visible::-webkit-scrollbar-track {
              visibility: visible;
            }`;
      document.head.appendChild(style);
    }
  }
  useEffect(() => {
    initStyle();
    let timer: NodeJS.Timer;
    const className = ' toggle-scroll-visible';
    function handleScroll(e: any) {
      timer && clearTimeout(timer);
      if (!e.target.className.includes(className)) {
        e.target.className += className;
      }
      timer = setTimeout(() => {
        e.target.className = e.target.className.replace(className, '');
      }, 800);
    }
    if (dom) {
      dom.className += ' toggle-scroll-hidden';
      dom.addEventListener('scroll', handleScroll);
    }
    return () => {
      dom && dom.removeEventListener('scroll', handleScroll);
    };
  }, [dom]);
}