前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >React滚动页面触发相应位置动画

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

作者头像
世间万物皆对象
发布2024-03-20 20:00:47
1340
发布2024-03-20 20:00:47
举报
文章被收录于专栏:start
需要实现的效果: (滚动到内容区域触发)

第一段内容移动效果 第二段内容淡入 第三段内容缩放

实现思路

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

完整代码

demo.jsx

代码语言:javascript
复制
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

代码语言:javascript
复制
.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);
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需要实现的效果: (滚动到内容区域触发)
  • 实现思路
  • 完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档