SCALE — Build Lab
UI部品 · REACT HOOK

スクロールで隠れる/現れるヘッダ

CATEGORYUI部品 TYPEReact Hook EFFORT30〜60分 DIFFICULTY
PRIMARY CODE
tsx
import { useEffect, useState } from 'react';

export function useScrollDirection() {
  const [show, setShow] = useState(true);
  useEffect(() => {
    let lastY = window.scrollY;
    const onScroll = () => {
      const y = window.scrollY;
      if (Math.abs(y - lastY) < 10) return;  // 微小スクロール無視
      setShow(y < lastY || y < 100);  // 上スクロール or 上部
      lastY = y;
    };
    window.addEventListener('scroll', onScroll, { passive: true });
    return () => window.removeEventListener('scroll', onScroll);
  }, []);
  return show;
}

// 使い方:
// const show = useScrollDirection();
// <header style={{ position: 'sticky', top: 0, transform: show ? 'translateY(0)' : 'translateY(-100%)', transition: 'transform .25s' }}>...</header>
前提条件
Tailwind CSS v4TypeScript 5
USE CASES
  • 任意のダッシュボードに組み込み

スクロールで隠れる/現れるヘッダ

:LiTarget: 用途

下スクロールで隠れて、上スクロールで現れるヘッダ。スマホアプリ風。

:LiSparkle: 特徴

  • 下スクロール隠す
  • 上スクロール現す
  • 滑らかアニメ
  • 閾値カスタム

:LiCode: コード(コピペ用)

import { useEffect, useState } from 'react';

export function useScrollDirection() {
  const [show, setShow] = useState(true);
  useEffect(() => {
    let lastY = window.scrollY;
    const onScroll = () => {
      const y = window.scrollY;
      if (Math.abs(y - lastY) < 10) return;  // 微小スクロール無視
      setShow(y < lastY || y < 100);  // 上スクロール or 上部
      lastY = y;
    };
    window.addEventListener('scroll', onScroll, { passive: true });
    return () => window.removeEventListener('scroll', onScroll);
  }, []);
  return show;
}

// 使い方:
// const show = useScrollDirection();
// <header style={{ position: 'sticky', top: 0, transform: show ? 'translateY(0)' : 'translateY(-100%)', transition: 'transform .25s' }}>...</header>

:LiHandPointer: 使い方

対象プロジェクトに該当ファイルをコピーして、props を流し込むだけ。

:LiAlertCircle: 注意事項

  • 依存パッケージを忘れず追加