見出し画像

gsapのObserverプラグインを使ってスクロール方向によるヘッダーの表示制御を実現してみました

こんにちわ。nap5です。


gsapのObserverプラグインを使ってスクロール方向によるヘッダーの表示制御を実現してみましたので、紹介したいと思います。


note様のヘッダー挙動とかもそうですよね。


デモコードです。



デモサイトです。


以下のようにヘッダーコンポーネントに書くとうまくできると思います。

import {css, cx} from '@emotion/css';
import {gsap} from 'gsap';
import {Observer} from 'gsap/dist/Observer';
import {useEffect, useRef, useState} from 'react';

gsap.registerPlugin(Observer);

const Header = () => {
  const headerDomRef = useRef(null);
  const [isClient, setIsClient] = useState(false);
  useEffect(() => {
    if (typeof window !== 'undefined') {
      setIsClient(true);
      const headerDom = headerDomRef.current;
      Observer.create({
        target: window,
        type: 'scroll',
        tolerance: 50,
        onUp: () => {
          headerDom.classList.remove('is-hidden');
        },
        onDown: () => {
          headerDom.classList.add('is-hidden');
        },
      });
    }
  }, []);
  return (
    <header
      ref={headerDomRef}
      className={cx(
        css`
          transition: transform 0.4s ease;
          &.is-hidden {
            transform: translateY(-100%);
          }
        `,
        `fixed top-0 min-h-[3rem] w-full border-2 bg-white z-10 flex items-center justify-center shadow-md`
      )}
    >
      Header
    </header>
  );
};

export default Header;


簡単ですが、以上です。

いいなと思ったら応援しよう!