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 相关文章推荐
IE无法设置短域名下Cookie
Sep 23 Javascript
原生Js实现按的数据源均分时间点幻灯片效果(已封装)
Dec 28 Javascript
jQuery boxy弹出层插件中文演示及使用讲解
Feb 24 Javascript
JavaScript插入动态样式实现代码
Feb 22 Javascript
深入理解JavaScript中的传值与传引用
Dec 09 Javascript
javascript等号运算符使用详解
Apr 16 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
Aug 10 Javascript
js Element Traversal规范中的元素遍历方法
Apr 19 Javascript
Vue自定义弹窗指令的实现代码
Aug 13 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
Sep 28 Javascript
vue实现侧边栏导航效果
Oct 21 Javascript
vue组件是如何解析及渲染的?
Jan 13 Vue.js
详解在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
php 在线打包_支持子目录
2008/06/28 PHP
PHP 动态生成静态HTML页面示例代码
2014/01/15 PHP
PHP URL参数获取方式的四种例子
2014/02/28 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
php中上传文件的的解决方案
2018/09/25 PHP
js cookies实现简单统计访问次数
2009/11/24 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
Python 装饰器深入理解
2017/03/16 Python
python 内置函数filter
2017/06/01 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
使用 Python 读取电子表格中的数据实例详解
2020/04/17 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
Python sorted对list和dict排序
2020/06/09 Python
浅析Python __name__ 是什么
2020/07/07 Python
详解python中的lambda与sorted函数
2020/09/04 Python
香港永安旅游网:Wing On Travel
2017/04/10 全球购物
英语专业推荐信
2013/11/16 职场文书
毕业生的自我评价
2013/12/30 职场文书
爷爷追悼会答谢词
2014/01/24 职场文书
欢迎横幅标语
2014/06/17 职场文书
于丹论语心得观后感
2015/06/15 职场文书
教你使用vscode 搭建react-native开发环境
2021/07/07 Javascript
详解SQL的窗口函数
2022/04/21 Oracle