React滚动页面触发相应位置动画

简介: 滚动过的距离+当前窗口的高度>元素到顶部窗口的距离 ===>则触发动画

需要实现的效果: (滚动到内容区域触发)



第一段内容移动效果

第二段内容淡入

第三段内容缩放


实现思路



滚动过的距离+当前窗口的高度>元素到顶部窗口的距离 ===>则触发动画


完整代码



demo.jsx


import React,{useRef,useEffect,useState} from 'react';
// 此函数用于获取一个元素到最外层窗口的距离
// 接收两个参数
// obg---> Dom元素
// direction----->方向  top|bottom|left|right
const offset = (obj, direction) => {
      //将top,left首字母大写,并拼接成offsetTop,offsetLeft
      var offsetDir = 'offset'+ direction[0].toUpperCase()+direction.substring(1);    
      var realNum = obj[offsetDir];
      var positionParent = obj.offsetParent;  //获取上一级定位元素对象
      while(positionParent != null){
          realNum += positionParent[offsetDir];
          positionParent = positionParent.offsetParent;
      }
      return realNum;
}
const View = () => {
    let text_area1=useRef()
    let text_area2=useRef()
    let text_area3 = useRef()
    let [scrollH, setscrollH] = useState(0)
    let [domTop, setDomTop] = useState(
        {
            Dom1_offT:0,
            Dom2_offT:0,
            Dom3_offT:0,
        }
    )
    const init=()=>{
        let Dom1_offT = offset(text_area1.current, 'top')
        let Dom2_offT = offset(text_area2.current, 'top')
        let Dom3_offT = offset(text_area3.current, 'top')
        setDomTop({
            Dom1_offT,
            Dom2_offT,
            Dom3_offT
        })
        window.onscroll = () => {
            let currentH = document.documentElement.clientHeight
            let scrollH = document.documentElement.scrollTop
            setscrollH(scrollH+currentH)
        }
    }
    useEffect(() => {
        init()
    }, [])
    return (
        <div className="demo1_container">
            <div ref={text_area1} className={scrollH > domTop.Dom1_offT? 'text_area1 a_1' : 'text_area1'}>
                <ul>
                    {new Array(10).fill(0).map((item, index) => {
                        return (
                            <li key={index}>
                                这是一段内容{index}
                            </li>
                        )
                    })}
                </ul>
            </div>
            <div ref={text_area2}  className={scrollH>domTop.Dom2_offT?'text_area2 a_2':'text_area2' }>
                    <ul>
                    {new Array(10).fill(0).map((item, index) => {
                        return (
                            <li key={index+10}>
                                这是一段内容{index}
                            </li>
                        )
                    })}
                </ul>
            </div>
            <div ref={text_area3}  className={scrollH>domTop.Dom3_offT?'text_area3 a_3':'text_area3' }>
                <ul>
                    {new Array(10).fill(0).map((item, index) => {
                        return (
                            <li key={index+20}>
                                这是一段内容{index}
                            </li>
                        )
                    })}
                </ul>
            </div>
        </div>       
    )
}
export default View 


demo.scss


.demo1_container {
  div {
    margin-top: 700px;
  }
}
.a_1 {
  animation: A 1s 1;
}
.a_2 {
  animation: B 1s 1;
}
.a_3 {
  animation: C 1s 1;
}
@keyframes A {
  0% {
    transform: translate(20%, 20%);
  }
  100% {
    transform: translate(0);
  }
}
@keyframes B {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
@keyframes C {
  0% {
    transform: scale(0.8);
  }
  100% {
    transform: scale(1);
  }
}


相关文章
|
6月前
|
存储 前端开发 JavaScript
react怎么实现跨页面传参
react怎么实现跨页面传参
193 2
|
6月前
|
前端开发 Java API
【第49期】一文了解React动画
【第49期】一文了解React动画
168 0
|
2月前
|
前端开发 JavaScript
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
本文介绍了在React项目中实现路由懒加载的方法,使用React提供的`lazy`和`Suspense`来优化项目首次加载的速度。通过将路由组件改为懒加载的方式,可以显著减少初始包的大小,从而加快首次加载速度。文章还展示了如何使用`Suspense`组件包裹`Switch`来实现懒加载过程中的fallback效果,并提供了使用前后的加载时间对比,说明了懒加载对性能的提升作用。
174 2
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
|
6月前
|
资源调度 JavaScript 前端开发
React-Router 5.0 制作导航栏+页面参数传递
React-Router 5.0 制作导航栏+页面参数传递
52 0
监听 react-custom-scrollbars 滚动到底部
监听 react-custom-scrollbars 滚动到底部
|
2月前
|
前端开发 JavaScript UED
react或者vue更改用户所属组,将页面所有数据进行替换(解决问题思路)____一个按钮使得页面所有接口重新请求
在React或Vue中,若需在更改用户所属组后更新页面所有数据但不刷新整个页面,可以通过改变路由出口的key值来实现。在用户切换组成功后,更新key值,这会触发React或Vue重新渲染路由出口下的所有组件,从而请求新的数据。这种方法避免了使用`window.location.reload()`导致的页面闪烁,提供了更流畅的用户体验。
54 1
react或者vue更改用户所属组,将页面所有数据进行替换(解决问题思路)____一个按钮使得页面所有接口重新请求
|
2月前
针对react-captcha-code第三方插件不能每次触发深颜色的处理
针对`react-captcha-code`插件生成浅色验证码的问题,通过改造成class组件`MyCaptcha.js`,自定义颜色和验证码生成逻辑,解决了颜色问题。
29 1
针对react-captcha-code第三方插件不能每次触发深颜色的处理
|
2月前
|
前端开发
React页面跳转取消上一个页面的所有请求
React页面跳转时取消上一个页面的所有axios请求,通过axios拦截器设置cancelToken,并在页面跳转时调用cancel函数取消未完成的请求。
29 2
|
2月前
|
前端开发 JavaScript
React配合axios请求拦截校验session,403跳转至登陆页面
React中使用axios进行请求拦截,通过自定义事件监听和响应拦截实现403状态码时的自动登录页面跳转。
84 2
|
6月前
|
数据采集 资源调度 前端开发
React的服务器端渲染:使用ReactDOMServer进行高效页面预渲染
【4月更文挑战第25天】使用ReactDOMServer,React支持服务器端渲染以实现高效预渲染。通过在Node.js环境中将React组件转化为HTML字符串,减少客户端JavaScript负载和渲染时间。优点包括更快首屏加载、改善SEO和兼容无JavaScript环境,但也会增加服务器负载、复杂性和状态管理挑战。开发者需根据项目需求平衡SSR和CSR。