如何用 React 实现滚动动画

数字沐星人
• 阅读 7464

如何用 React 实现滚动动画

简评:滚动动画让组件向下滚动时出现在页面上。这篇文章是介绍如何使用 React 和 CSS3 做到这一点。

如何用 React 实现滚动动画

这里将通过构建一个简单的例子来学习这个滚动动画。

首先构建 Header 组件。

***Header > index.js***
-----------------------
import React from 'react';
import './styles.css';
const Header = () => (
  <div className="header">
    <h1>Title</h1>
  </div>
)
export default Header;

添加样式。

***Header > styles.css***
-------------------------
.header {
   display: flex;
   justify-content: center;
   align-items: center;
   height: 100vh;
   width: 100vw;
}
.header h1 {
   font-size: 30px;
   color: white;
}

现在构建 App 组件.

***App > index.js***
--------------------
import React, { Component } from 'react';
import Header from '../Header';
class App extends Component {
   constructor() {
     super();
     this.state = {
        className: ''
     }
   }
   render() {
     return(
       <div>
         <Header />
       </div>
     )
   }
}
export default App;

我们的应用现在只渲染 Header 这个组件,在 Header 下面,我们将创建 About 组件来显示一个简单的 Text。当向下滚动的时候这个 Text 将从左边滑入。

我们还需要做一些操作:

  • 使用 state 来维护组件的 className。
  • 当用户滚动一定数量的像素时,则将状态设置为另一个类名。
  • 构建一个函数用户处理滚动操作。
***App > index.js***
--------------------
import React, { Component } from 'react';
import Header from '../Header';
class App extends Component {
   constructor() {
     super();
     this.state = {
        className: 'hidden'
     }
   }
   handleScroll() { 
    if (document.documentElement.scrollTop > 430) {
       this.setState({
         className: 'show'
       })
     } 
   }

   componentDidMount() {
     window.onscroll = () => this.handleScroll()
   }
   render() {
     return(
       <div>
         <Header />
       </div>
     )
   }
}
export default App;

如果不确定要显示多少像素,可以通过下面这段代码来查看:

console.log(document.documentElement.scrollTop);

当用户滚动的时候,handleScroll 函数被调用,当滚动超过 430 像素的时候,state 将设为 show 并匹配对应的 CSS。

现在来构建一个 About 组件。

***About > index.js***
-----------------------
import React, { Component } from 'react';
import './styles.css';
class About extends Component {
  render() {
    return(
      <div className="about-wrapper">
        <div className="about-text">
          <div className={this.props.className}>
            <h3>Title</h3>
            <p>This is a text that will appear.</p>
          </div>
         </div>
      </div>
     )
   }
}
export default About;

如果用户滚动没有超过 430 像素,包含 text 的 div 的类名将是 ‘hidden’,一旦超过 430 像素,类名将设为 ‘show’。并且匹配相应的 CSS,现在我们在 App 中导入 About 组件。

***App > index.js***
--------------------
import React, { Component } from 'react';
import About from '../About';
import Header from '../Header';
class App extends Component {
   constructor() {
     super();
     this.state = {
        className: 'hidden'
     }
   }
   handleScroll() { 
    if (document.documentElement.scrollTop > 430) {
       this.setState({
         className: 'show'
       })
     } 
   }
   componentDidMount() {
     window.onscroll = () => this.handleScroll()
   }
   render() {
     return(
       <div>
         <Header />
         <About className={this.state.className} />
       </div>
     )
   }
}
export default App;

给 About 组件添加样式。

***About > styles.css***
------------------------
.about-wrapper {
   height: 30em;
   width: 100vw;
}
.about-text {
   position: relative;
   width: 30em;
   height: 20em;
}
.show {
   position: absolute;
   left: -30em;
   width: 30em;
   height: 20em;
   -webkit-animation: slide-in 1s forwards;
   animation: slide-in 1s forwards;
}
@-webkit-keyframes slide-in {
  100% { left: 0 }
}
@keyframes slide-in {
  100% { left: 0 }
}

到此就完成了所有的操作,最后来看看 demo 效果。

如何用 React 实现滚动动画

英文原文:Scroll Animations with Rea
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
记 flip 简单的动画思路
flip一种简单的动画思路无意间看到某博主文章,介绍关于filp如何制作动画,觉得有趣,便自己动手将dome实现了一遍,FLIPffirst记录动画开始前的位置、大小等信息(translateY(0px))llast记录动画结束时的位置、大小等信息(translateY(100px))iinvert对动画前后数据信息
VUE 实现一个简易老虎机
今天突然要做一个竖直滚动老虎机,可以设置中奖位置,以及中奖回调,然后再带点常规的滚动动画,还是有点意思,和之前的转盘抽奖有点类似,有兴趣可以看下。简单分析下UI,ui的话,就简单点,三个列表从下往上滚动,搞个框罩住css的活,应该简单。动画,老规矩,我们采用之前的方案,动态设置css,可以搞定。设置中奖位置,我们可以想传递
Stella981 Stella981
3年前
Safari 快捷键
一标签和网页导航快捷键8个切换到下一个标签页–ControlTab切换到上一个标签页–ControlShiftTab向下滚动一屏–空格向上滚动一屏–Shift空格焦点移到地址栏– !(http://static.oschina.net/uploads/img/201503/2423192
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(