react 不用插件实现数字滚动的效果示例


Posted in Javascript onApril 14, 2020

突然要实现个数字滚动效果,网上一搜,一大堆都是用组件的。我只是想实现个简单的效果而已,决定还是自己搞搞吧。

先来看看效果吧

react 不用插件实现数字滚动的效果示例

也不多说了,实现起来不难,但是有点细节问题需要自己好好琢磨一下

大概思路,

1.一开始为0,获取第一次数据,记录下来

2.和前一次数据进行对比

3.然后transform

4.最后收工

好了,附上代码、

export default class Number extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      prev: "000000",//初始化6位数
      next: "000000",
      inits: 0,
      listAll: [[0],[0],[0],[0],[0],[0]],
      contrlAnimationWay: false
    }
    this.key1 = 0
  }

  componentWillUnmount() {
  }
  componentDidMount() {
    setTimeout(()=>{
      this.run()
    })
    // this.setTimer()
  }


  // 获取数据
  getNumber() {
    let { inits } = this.state
    let random = Math.floor(Math.random() * (100000 - 1) + 1);
    let prev = this.addZero(inits, 6)
    let next = this.addZero(inits + 1235, 6)
    this.setState({
      inits: inits + 1235
    })
    console.log(99, prev);
    console.log(99, next);
    this.getData(prev, next)
  }
  // 数字补零
  addZero(num, n) {
    let len = num.toString().length;
    while (len < n) {
      num = "0" + num;
      len++;
    }
    return num;
  }
  // 对比数据前后变化
  getData(prev, next) {
    let { listAll } = this.state
    listAll = [];
    let prevArray = prev.toString().split("");
    let nextArray = next.toString().split("");
    console.log(11, prevArray);
    console.log(22, nextArray);
    let listInit = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

    for (let i = 0; i < prevArray.length; i++) {
      let prevNumber = parseInt(prevArray[i]);
      let nextNumber = parseInt(nextArray[i]);
      let start = -1;
      let end = -1;

      for (let j = 0; j < listInit.length; j++) {
        if (listInit[j] === prevNumber) {
          start = j;
        }
        if (start !== -1 && listInit[j] === nextNumber) {
          end = j;
          break;
        }
      }
      listAll.push(listInit.slice(start, end + 1));
      console.log(listAll);
    }
    this.setState({
      listAll
    })
  }
  run() {
    this.getNumber()
    this.key1++
  }
  setTimer() {
    setInterval(() => {
      setTimeout(()=>{
        this.run()
      }, 0);
    }, 1000 * 4)
  }

  render() {
    let { listAll } = this.state;
    return <div className="new-tmall911">
      {/* 数字滚动 */}
      <div className="box-number">
        <div onClick={this.setTimer.bind(this)}>累计</div>
        {
          listAll.map((list, i) => {
            return <div key={i} className="list-wrap">
              <div className={`roll roll_${list.length - 1}`} key={this.key1++}>
                {
                  list.map((item, index) => {
                    return <div key={index}>
                      {item}
                    </div>
                  })
                }
              </div>
            </div>
          })
        }
        <div>人已参与</div>
      </div>
      {/* 数字end */}
    </div>
  }
}

css

/* 数字滚动 */
.box-number {
  /* background: green; */
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
  color: rgb(36, 35, 35);
  height: 100px
 }

 .list-wrap {
  height: 3rem;
  width: 3rem;
  text-align: center;
  overflow: hidden;
  margin: 0.1rem;
  border: 2px rgb(19, 19, 18) solid;
  border-radius: 2px;
 }

 .roll div {
  font-size: 2rem;
  line-height: 3rem;
 }

 .roll_1 {
  -webkit-animation: roll_1 2s forwards; /* Safari 与 Chrome */
 }
 .roll_2 {
  -webkit-animation: roll_2 2s forwards; /* Safari 与 Chrome */
 }

 .roll_3 {
  -webkit-animation: roll_3 2s forwards; /* Safari 与 Chrome */
 }

 .roll_4 {
  -webkit-animation: roll_4 2s forwards; /* Safari 与 Chrome */
 }

 .roll_5 {
  -webkit-animation: roll_5 2s forwards; /* Safari 与 Chrome */
 }

 .roll_6 {
  -webkit-animation: roll_6 2s forwards; /* Safari 与 Chrome */
 }

 .roll_7 {
  -webkit-animation: roll_7 2s forwards; /* Safari 与 Chrome */
 }

 .roll_8 {
  -webkit-animation: roll_8 2s forwards; /* Safari 与 Chrome */
 }
 
 /*省略roll_2——roll_8*/

 .roll_9 {
  -webkit-animation: roll_9 2s forwards; /* Safari 与 Chrome */
 }

 @-webkit-keyframes roll_1 /* Safari 与 Chrome */
 {
  0% {
   transform: translate3d(0, 0, 0);
  }
  100% {
   transform: translate3d(0, -3rem, 0);
  }
 }

 @-webkit-keyframes roll_2 /* Safari 与 Chrome */
 {
  0% {
   transform: translate3d(0, 0px, 0);
  }
  100% {
   transform: translate3d(0, -6rem, 0);
  }
 }
 @-webkit-keyframes roll_3 /* Safari 与 Chrome */
 {
  0% {
   transform: translate3d(0, 0px, 0);
  }
  100% {
   transform: translate3d(0, -9rem, 0);
  }
 }
 @-webkit-keyframes roll_4 /* Safari 与 Chrome */
 {
  0% {
   transform: translate3d(0, 0px, 0);
  }
  100% {
   transform: translate3d(0, -12rem, 0);
  }
 }
 @-webkit-keyframes roll_5 /* Safari 与 Chrome */
 {
  0% {
   transform: translate3d(0, 0px, 0);
  }
  100% {
   transform: translate3d(0, -15rem, 0);
  }
 }
 @-webkit-keyframes roll_6 /* Safari 与 Chrome */
 {
  0% {
   transform: translate3d(0, 0px, 0);
  }
  100% {
   transform: translate3d(0, -18rem, 0);
  }
 }
 @-webkit-keyframes roll_7 /* Safari 与 Chrome */
 {
  0% {
   transform: translate3d(0, 0px, 0);
  }
  100% {
   transform: translate3d(0, -21rem, 0);
  }
 }
 @-webkit-keyframes roll_8 /* Safari 与 Chrome */
 {
  0% {
   transform: translate3d(0, 0px, 0);
  }
  100% {
   transform: translate3d(0, -24rem, 0);
  }
 }
 @-webkit-keyframes roll_9 /* Safari 与 Chrome */
 {
  0% {
   transform: translate3d(0, 0px, 0);
  }
  100% {
   transform: translate3d(0, -27rem, 0);
  }
 }

到此这篇关于react 不用插件实现数字滚动的效果示例的文章就介绍到这了,更多相关react 数字滚动内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Javascript 相关文章推荐
HTML Dom与Css控制方法
Oct 25 Javascript
上传文件返回的json数据会被提示下载问题解决方案
Dec 03 Javascript
javascript实现tab切换的四种方法
Nov 05 Javascript
Bootstrap每天必学之导航
Nov 26 Javascript
详解WordPress开发中get_current_screen()函数的使用
Jan 11 Javascript
jQuery实现简单倒计时功能的方法
Jul 04 Javascript
json定义及jquery操作json的方法
Oct 03 Javascript
js 获取今天以及过去日期
Apr 11 Javascript
JQuery获取可视区尺寸和文档尺寸及制作悬浮菜单示例
May 14 jQuery
详解小程序中h5页面onShow实现及跨页面通信方案
May 30 Javascript
vue使用map代替Aarry数组循环遍历的方法
Apr 30 Javascript
vue实现简单跑马灯效果
May 25 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
Apr 14 #Javascript
编写一个javascript元循环求值器的方法
Apr 14 #Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
Apr 14 #Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
Apr 14 #Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
Apr 14 #Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
Apr 13 #Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
Apr 13 #Javascript
You might like
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
js获取html文件的思路及示例
2013/09/17 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
2016/02/03 Javascript
javascript每日必学之多态
2016/02/23 Javascript
JavaScript实现in-place思想的快速排序方法
2016/08/07 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
js实现json数组分组合并操作示例
2019/02/12 Javascript
jquery实现进度条状态展示
2020/03/26 jQuery
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
python实现基本进制转换的方法
2015/07/11 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
python目录与文件名操作例子
2016/08/28 Python
Python文件操作基本流程代码实例
2017/12/11 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
Django 开发环境配置过程详解
2019/07/18 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
python实现银行实战系统
2020/02/26 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
我的求职计划书
2014/01/10 职场文书
合伙购房协议样本
2014/10/06 职场文书
考试作弊检讨
2015/01/27 职场文书
刘公岛导游词
2015/02/05 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
电影焦裕禄观后感
2015/06/09 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
2019年最新借条范本!
2019/07/08 职场文书
Python开发五子棋小游戏
2022/05/02 Python