You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用TailwindCSS实现React Header仅在滚动时显示阴影

React + TailwindCSS 实现滚动时Header显示阴影

可以通过监听页面滚动状态,结合React状态动态切换Header的类名,具体实现方案如下:

基础实现方案

在函数组件中用useState维护滚动状态,通过useEffect监听窗口滚动事件:

import { useState, useEffect } from 'react';

const Header = () => {
  // 标记是否已滚动离开顶部初始位置
  const [isScrolled, setIsScrolled] = useState(false);

  useEffect(() => {
    const handleScroll = () => {
      // 判断滚动距离是否大于0
      setIsScrolled(window.scrollY > 0);
    };

    // 添加滚动监听
    window.addEventListener('scroll', handleScroll);
    // 组件卸载时移除监听,避免内存泄漏
    return () => window.removeEventListener('scroll', handleScroll);
  }, []);

  return (
    <header className={`sticky left-0 top-0 right-0 z-20 ${isScrolled ? 'shadow' : ''}`}>
      {/* Header内容 */}
    </header>
  );
};

export default Header;

优化:添加防抖处理

滚动事件会频繁触发,添加防抖可以减少状态更新次数,提升页面性能:

import { useState, useEffect } from 'react';

const Header = () => {
  const [isScrolled, setIsScrolled] = useState(false);

  useEffect(() => {
    let timeoutId;
    const handleScroll = () => {
      // 防抖:延迟100ms更新状态
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() => {
        setIsScrolled(window.scrollY > 0);
      }, 100);
    };

    window.addEventListener('scroll', handleScroll);
    return () => {
      window.removeEventListener('scroll', handleScroll);
      clearTimeout(timeoutId);
    };
  }, []);

  return (
    <header className={`sticky left-0 top-0 right-0 z-20 ${isScrolled ? 'shadow' : ''}`}>
      {/* Header内容 */}
    </header>
  );
};

export default Header;

可选:使用clsx简化类名拼接

如果需要处理更复杂的类名逻辑,可以用clsx库(需先安装:npm install clsx):

import { useState, useEffect } from 'react';
import clsx from 'clsx';

const Header = () => {
  const [isScrolled, setIsScrolled] = useState(false);

  useEffect(() => {
    const handleScroll = () => {
      setIsScrolled(window.scrollY > 0);
    };

    window.addEventListener('scroll', handleScroll);
    return () => window.removeEventListener('scroll', handleScroll);
  }, []);

  // 用clsx动态组合类名
  const headerClasses = clsx(
    'sticky left-0 top-0 right-0 z-20',
    isScrolled && 'shadow'
  );

  return (
    <header className={headerClasses}>
      {/* Header内容 */}
    </header>
  );
};

export default Header;

关键说明

  • 依赖sticky定位确保Header始终固定在顶部,这样滚动时阴影效果才会明显
  • 滚动监听要在组件卸载时移除,避免内存泄漏
  • 防抖时间可根据需求调整,平衡响应速度和性能

内容的提问来源于stack exchange,提问作者Kevin Nammour

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:15:35