css+js实现滚动渐变

业务要求:
在页面中有一个

希望在滚动的过程中给这个div加一个rgba(247, 248, 252,1)背景色,要求在滚动1px的时候白色透明度为0,滚动到banner高度的时候透明度为1并且过程是丝滑的

为了实现这一效果,可以采用CSS的linear-gradient结合JavaScript来动态调整背景颜色的透明度。下面是如何实现这一功能的具体步骤:

  1. CSS样式定义
    首先,在CSS中定义一个类,用于设置content 的背景颜色和过渡效果。
.content {
  position: relative;
  background: transparent;
  transition: background 0.3s ease-in-out; // 如果效果很平滑不需要加
  margin: 0 -12px; // 如果区域自带padding的话可以用
  padding: 0 12px;// 如果区域自带padding的话可以用
}

  1. JavaScript处理滚动事件
    然后,在JavaScript中监听窗口的滚动事件,并根据滚动距离动态改变背景颜色的透明度。
import { useEffect, useRef, useState, useMemo } from 'react';
import BannerArea from './components/BannerArea';
import styles from './index.module.less';

export default function AppList() {
  const [bannerList, setBannerList] = useState([]);
  const layoutRef = useRef<HTMLDivElement>(null);
  const bannerAreaRef = useRef<HTMLDivElement>(null);
  const [scrollTop, setScrollTop] = useState(0);
  const [bannerHeight, setBannerHeight] = useState(0);

  // 计算 bannerArea 的高度
  useEffect(() => {
    if (bannerList.length > 0 && bannerAreaRef.current) {
      setBannerHeight(bannerAreaRef.current.clientHeight);
    }
  }, [bannerList]);

  // 监听滚动事件
  useEffect(() => {
    const handleScroll = () => {
      if (layoutRef.current) {
        setScrollTop(layoutRef.current.scrollTop);
      }
    };

    if (layoutRef.current) {
      layoutRef.current.addEventListener('scroll', handleScroll);
    }

    return () => {
      if (layoutRef.current) {
        layoutRef.current.removeEventListener('scroll', handleScroll);
      }
    };
  }, []);

  // 根据滚动距离计算背景透明度
  const opacity = useMemo(() => {
    const newOpacity = Math.min(1, scrollTop / bannerHeight);
    return newOpacity;
  }, [scrollTop, bannerHeight]);

  return (
        <div
          className={styles.content}
          style={{ background: `rgba(247, 248, 252, ${opacity})` }}
        >
          {/* Banner区域 */}
          <div ref={bannerAreaRef}>
            {bannerList?.length ? <BannerArea bannerList={bannerList} /> : null}
          </div>
        </div>
    </Layout>
  );
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值