滚动页面触发相应位置动画 ---react

2023-11-17

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

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

实现思路

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

整体代码

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 

样式文件



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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

滚动页面触发相应位置动画 ---react 的相关文章

  • eslint/prettier 在 html 标签中添加不需要的空间

    我正在尝试向我的项目添加配置 以便代码自动格式化 我对 VS Code 中的用户设置进行了一些更新 还安装了 eslint 和 prettier 现在 每当我尝试保存我的代码时 都会从中得到改变 div div div div div di
  • 使用 Apollo-Client 对 GitHub API v4 进行身份验证

    与之前的版本一样 GitHub 的新 GraphQL API 需要使用令牌进行身份验证 那么 我们如何添加一个 Header 信息到HttpLink里面Apollo Client const client new ApolloClient
  • 生成日期并将新属性添加到对象数组中

    我无法控制数据列表 但我需要将其映射到日期范围数据 数据列表如下所示 只有 from 和 to date from 2017 05 06 00 00 00 date to 2017 05 08 23 59 59 state name San
  • “ReactNode”不是有效的 JSX 元素

    我有以下代码 代码沙箱 https codesandbox io s react typescript forked 50beyp file src App tsx import ComponentType ReactNode from r
  • React Map 总是使用最后一个元素的数据调用方法

    我正在制作一个社交媒体应用程序 我正在循环浏览所有评论并将其显示在用户界面上 当我单击编辑时 最后一条评论的文本总是显示在输入中 我尝试了很多不同的方法 改变了结构 使用bind来绑定上下文 但没有任何帮助 我正在使用 React Mate
  • 添加 CSS 来响应创建的元素,例如 data-reactroot

    在我的根div下 react 自动 创建另一个div 有没有办法向该 div 添加一个类 我需要添加 height 100 来防止背景内容在显示覆盖层时在移动设备中滚动 这就是我检查网站上的元素时显示的方式 单击按钮时 我需要将 heigh
  • React 不响应按键事件

    我正在尝试实现一些非常基本的按键检测 但我根本无法让它工作 我有一个裸露的组件 应该在onKeyDown事件 但控制台中没有任何内容被注销 class App extends React Component constructor prop
  • Material UI - 更改主题中的按钮文本颜色

    我在直接在 Material UI 主题中更改按钮文本颜色时遇到问题 更改主色 按钮字体大小效果很好 因此问题不在于传递主题 这是我的代码 import React from react import MuiThemeProvider cr
  • 从回调中访问状态

    我在从回调访问组件状态时遇到问题 国家的价值num更改正确 但此类更改对于加载时定义的回调函数不可见 import React useState from react class MyObject callback gt void cons
  • 在 React 应用程序的 shell 脚本中设置环境变量

    我正在尝试在 powershell 和 bash 脚本中设置一些环境变量 并在 ReactJS 应用程序中读取它们 shell脚本很简单 env AUTHDOMAIN some domain com env AUTHCLIENTID bun
  • React Router v4 不渲染组件

    React Router v4 渲染组件存在问题 在应用程序初始加载时 它将呈现与 URL 相对应的正确组件 但是 任何后续的组件Link单击不会呈现所需的组件 图书馆 反应路由器 4 2 2 https reacttraining com
  • 如何在reactjs中访问悬停状态?

    我有一个侧面导航 里面有很多篮球队 因此 当其中一个团队悬停在上方时 我想为每个团队显示不同的内容 另外 我正在使用 Reactjs 所以如果我可以有一个可以传递给另一个组件的变量 那就太棒了 React 组件在其顶级界面中公开所有标准 J
  • webpack 4 React loadable 不会根据卡盘点分割供应商

    我目前正在使用 webpack 4 和 React loadable 来创建块 它实际上分块取决于断点 然而 供应商规模保持不变 React loadable 还不支持 webpack 4 吗 或者我缺少一些设置 css 实际上似乎被分成了
  • Jest 和 React 以及导入 CSS 文件时出现语法错误

    我正在尝试让我的第一个 Jest 测试通过 React 和 Babel 我收到以下错误 SyntaxError Users manueldupont test avid sibelius publishing viewer src comp
  • 当文本输入聚焦在 React Native for Android 的底部工作表上时,视图移出屏幕

    我正在使用图书馆 https github com osdnk react native reanimated bottom sheet https github com osdnk react native reanimated bott
  • yup.js 验证数字字段大于同级字段,或者可以为空

    我正在使用 Yup js 来验证一些表单字段 我有两个整数字段 Year Built Year Renovated Year Built是必填字段 Year Renovated is not 不过 装修年份可以留空如果有一个值它应该大于建造
  • 以编程方式填写reactjs表单

    我正在编写一个用户脚本 但无法填写由reactjs制作的表单 我的代码 document querySelector id username value email protected cdn cgi l email protection
  • className 属性是否承担 Reactjs 中 id 属性的角色?

    由于 id 属性在 Reactjs 组件中很少使用 因为 id 属性意味着组件不会被重用 那么是否使用 className 属性来代替 id 呢 如果是这样的话 那么 Reactjs 中相当于 HTML 中的 class 属性的是什么 cl
  • 使用 Vite 和 React 进行生产构建时出错:Uncaught TypeError 中的错误:_ 不是函数

    我在我的网站上使用 Vite React React Router 和 TypeScript 我在运行生产构建时遇到问题 在开发模式下一切正常 使用生产版本时 我的浏览器显示白色背景 并且在浏览器控制台中出现以下错误 上面的链接将我带到第
  • 如何在执行新操作时取消先前操作的执行?

    我有一个动作创建器 它会进行昂贵的计算 并在每次用户输入内容时调度一个动作 基本上是实时更新 但是 如果用户输入多个内容 我不希望之前昂贵的计算完全运行 理想情况下 我希望能够取消执行先前的计算并只执行当前的计算 没有内置功能可以取消Pro

随机推荐

  • eNSP基础配置

    用户视图
  • latch&timeborrowing&Lookup latch

    原创文章 latch 锁存器 电路图结构如下 当 E 1 时 latch直传 transparent D端信号的变化会即时反应在Q端 当 E 0 时 latch关断 closed Q端保持关断瞬间D端的值 设计中使用Latch的好处是 相比
  • 【大数据】Flink 详解(三):核心篇 Ⅱ

    本系列包含 大数据 Flink 详解 一 基础篇 大数据 Flink 详解 二 核心篇 大数据 Flink 详解 三 核心篇 大数据 Flink 详解 四 核心篇 大数据 Flink 详解 五 核心篇 大数据 Flink 详解 六 源码篇
  • NoSQL - MongoDB及工具 - 安装

    1 应用场景 主要用于安装和使用MongoDB 2 学习 操作 1 文档阅读 NoSQL MongoDB 学习 实践 穿素白衫的中少年的博客 CSDN博客 2 整理输出 用于学习 推荐安装最新版本 或者 最新稳定版 这里就安装最新稳定版 如
  • vector string及数组使用

    使用vector输入字符串并输出字符串 include
  • 2023中兴笔试复盘

    选择加编程 选择题考的范围挺广的 编程题第一题有点难度 第二题还好 复盘一下遇到的有点卡顿的题目 1 排序问题 快速排序最适合排完全无序的数据 如果基本有序的数据反而会耗时比较长 原因在于这种情况下一般拿第一个数做基准值的话 容易出现按基准
  • synchronized的作用和用法

    郁闷 参考 synchronized的作用和用法 Java中Synchronized的使用 文章目录 简单介绍 用法 实战实例 修饰代码块 修饰普通方法 修饰静态方法 简单介绍 synchronized关键字是用来控制线程同步的 就是在多线
  • tensorflow学习笔记(1)-tensoflow的设计机制

    tensorflow将整个计算表征为一个图 graph 图的节点 node 是Operation 常常简称为ops 节点之间的边 edge 是张量 tensor 不能理解反了 用图的方式能很容易根据边的连接关系 发现可以并行执行的节点 运算
  • 【笔记】用python计算BS模型、隐波的笔记

    前言 这篇笔记是根据姜禄彬老板在公众号上发布的笔记复刻的 不同的是原作者用的是股票数据 我用的是比特币期权数据 这份笔记里主要是如何用python代码来计算BS模型 如何求隐含波动率 什么是波动率微笑 greeks等 整体还是有点乱 之后有
  • 半生已过:别赌感情,别猜人心

    感情中 很多时候 我们明明懂得了一些道理 却依然会屡屡受伤 是因为我们总是抱着一种信念 以为自己很在乎的人 真的和别人不一样 于是 我们常常毫无保留地信任一个人 坚定不移地相信一段感情 殊不知 期望越大 有时候失望也就会越大 看过一段话说
  • Gabor滤波进行目标图像纹理特征的提取

    1 傅里叶变换 1 简介 数字图像处理的方法主要分成两大部分 空域分析法和频域分析法 空域分析法就是对图像矩阵进行处理 频域分析法是通过图像变换将图像从空域变换到频域 从另外一个角度来分析图像的特征并进行处理 频域分析法在图像增强 图像复原
  • Mysql错误日志、通用查询日志、慢日志的介绍和二进制日志的查看和备份恢复

    目录 一 日志 1 日志和备份的必要性 2 mysql的日志类型 1 错误日志 2 通用查询日志 3 二进制日志 4 慢日志 一 日志 1 日志和备份的必要性 在数据库保存数据时 有时候会因为误删除数据库 意外断电或程序意外终止 由于病毒造
  • openCV无法打开USB摄像头问题

    用Python OpenCV 打开USB摄像头时 出现如下提示 意思是 媒体类型不匹配 测试源代码 cap cv2 VideoCapture 0 while cap isOpened start time time is opened fr
  • 【msvcp100.dll下载】msvcp100.dll丢失修复

    遇到因msvcp100 dll文件丢失而无法正常运行软件或游戏程序的朋友 不用担心 根据小编整理的教程文章 将dll文件放在操作系统system32文件夹的适当位置可以解决这个问题 具体该如何操作呢 只需下载指定的dll文件即可提醒缺少哪个
  • 100道mysql的面试题问答

    1 MySQL 索引使用有哪些注意事项呢 可以从三个维度回答这个问题 索引哪些情况会失效 索引不适合哪些场景 索引规则 索引哪些情况会失效 查询条件包含or 可能导致索引失效 如何字段类型是字符串 where时一定用引号括起来 否则索引失效
  • 数学建模笔记(八):微分方程的应用(偏微分方程)

    文章目录 一 微分方程概述 1 什么是微分方程 2 求解方法 一 求精确解 二 求数值解 近似解 三 定性理论方法 3 建立微分模型的方法 一 根据定理规律列方程 二 微元分析法 三 模拟近似法 4 适用问题 5 常见动态模型 二 观众厅地
  • python3.7 连接sql server出现pymssql.OperationalError: (20009, b'DB-Lib error message 20009, severity 9:\...

    今天在使用python3 7中的pymssql 连接sqlserver的时候遇到的问题 pymssql OperationalError 20009 b DB Lib error message 20009 severity 9 nUnab
  • 区块链-公钥生成地址

    目录 https blog csdn net qq 40452317 article details 89646633 比特币 区块链 地址是一个由数字和字母组成的字符串 由公钥 一个同样由数字和字母组成的字符串 生成的比特币地址以数字 1
  • UE4/UE5 动画控制

    工程下载 https mbd pub o bread ZJ2cm5pu 蓝图控制sequence播放 倒播动画 设置开启鼠标指针 开启鼠标事件 在场景中进行过场动画制作 设置控制事件
  • 滚动页面触发相应位置动画 ---react

    需要实现的效果 滚动到内容区域触发 第一段内容移动效果 第二段内容淡入 第三段内容缩放 实现思路 滚动过的距离 当前窗口的高度 gt 元素到顶部窗口的距离 gt 则触发动画 整体代码 import React useRef useEffec