当前位置: 首页 > article >正文

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>
  );
}


http://www.kler.cn/news/356203.html

相关文章:

  • 操作系统(5) (POSIX--Linux线程编程pthread_t/create/join/exit)
  • 【ARM 嵌入式 编译系列 2.9 -- GCC 编译如何避免赋值判断 if ( x = 0)】
  • 无人机之融合集群技术篇
  • JAVA基础-API-Arrays工具类
  • Gee引擎架设教程:Gee引擎人形怪物设置,MonUseItems配置文件讲解
  • 【安当产品应用案例100集】021- 针对电网接入设备的控制指令安全解决方案
  • 红队攻防之隐匿真实IP
  • 【VUE】为什么要避免v-for和v-if在一起使用
  • 【Unity新闻】Unity 6 正式版发布
  • 大模型带来新安全机遇
  • 【idea技巧篇】idea的类注释和方法注释模版自定义设置
  • 如果有100万条消息堆积在MQ怎么解决
  • 2024 年 9 月区块链游戏研报:行业回暖,Telegram 游戏引发热潮
  • [工程构建] 使用 pkg-config 的 cmake 模板
  • laravel-admin后台子账号菜单配置详解
  • ant-design-vue 时间选择器 a-date-picker 单组件设置国际化失效问题解决
  • 网数中心举办CISAW安全软件教师培训 助力国家网络安全战略
  • 众数信科荣登“2024 CHINA AIGC 100”榜单
  • 如何修改网络ip地址:一步步指南‌
  • 【C语言】sizeof和strlen的区别