酷站(www.ku0.com)-致力于为互联网从业者提供专业的网络资源资讯

热门关键词:  企业  as  baidu  c4rp3nt3r  美女

JavaScript实现余额数字滚动效果

来源:互联网 作者:秩名 人气: 发布时间:2021-12-24
本篇文章主要介绍了JavaScript实现余额数字滚动效果,对大家的学习或者工作具有一定的参考学习价值,感兴趣的小伙伴们可以参考一下,也感谢大家对酷站(ku0.com)的支持。

1.实现背景

上周在一个完成任务领取红包的活动需求中,需要实现一个用户点击按钮弹出领取红包弹窗后,在关 闭弹窗返回原来的页面时,页面余额数字部分要展示一个每一位数字滚动后的效果。
因为之前没做过这样的效果,一开始也不知道要如何实现,本来想在GitHub上找一下相关的库,看到一个最高star的库,但发现它是依赖jQuery的,而且不可以npm包引入。感觉就很没有必要,本来项目是react框架的,就是要尽量少的操作DOM,为了解决这个滚动就要引入jQuery,感觉不太合适。所以我决定还是自己实现,先看了一下别人的思路,然后自己再去实现。

2.实现思路

其实就是将传入的带滚动的n位数字拆分成每一个要滚动的数,然后动态的创建装着滚动到每一位相应数字的容器,然后放入传入的目标容器中。滚动到每一位相应的数字的实现可以通过动态创建从0到相应数字的间隔数的div,div的内容分别为对应的数字,就像一个竖直写着从0-n的长纸条,然后拉着它在指定时间内从0上拉到目标数字。

3.实现过程

既然要封装,还是写成class的形式吧,话不多说,直接上代码吧

/**
 * 实现数字滚动的效果的类
 */
class DigitScroll {
  constructor(options) {
    //获取容器的DOM,没有则抛出错误
    this.container = document.querySelector(options.container);
    if (!this.container) {
      throw Error("no container");
    }
    this.container.style.overflow = "hidden";
    this.container.style.display = "flex";
    //可视容器高度 也是滚动间隔距离,容器要设置高度,否则默认30px
    this.rollHeight = parseInt(getComputedStyle(this.container).height) || 30;
    this.container.style.height = this.rollHeight + "px";
  }
  roll(num) {
    // 将传入的要滚动的数字拆分后初始化每一位数字的容器
    this.initDigitEle(num);
    const numEles = this.container.querySelectorAll(".single-num");
    // 遍历生成每一位数字的滚动队列,如滚动到7,则生成内容为0,1,2,3,4,5,6,7的7个div,用于滚动动画
    [...numEles].forEach((numEle, index) => {
      const curNum = 0;
      let targetNum = Number(this.numberArr[index]);
      if (curNum >= targetNum) {
        targetNum = targetNum + 10;
      }
      let cirNum = curNum;
      // 文档碎片,拼凑好后一次性插入节点中
      const fragment = document.createDocumentFragment();
      // 生成从0到目标数字对应的div
      while (targetNum >= cirNum) {
        const ele = document.createElement("div");
        ele.innerHTML = cirNum % 10;
        cirNum++;
        fragment.appendChild(ele);
      }
      numEle.innerHTML = "";
      numEle.appendChild(fragment);
      //重置位置
      numEle.style.cssText +=
        "-webkit-transition-duration:0s;-webkit-transform:translateY(0)";
      setTimeout(() => {
        numEle.style.cssText += `-webkit-transition-duration:1s;-webkit-transform:translateY(${
          -(targetNum - curNum) * this.rollHeight
        }px);`;
      }, 50);
    });
  }
  // 初始化容器
  initDigitEle(num) {
    // 数字拆分位数
    const numArr = num.toString().split("");
    // 文档碎片,拼凑好后一次性插入节点中
    const fragment = document.createDocumentFragment();
    numArr.forEach((item) => {
      const el = document.createElement("div");
      // 数字是要滚动的,非数字如.是不滚动的
      if (/[0-9]/.test(item)) {
        el.className = "single-num";
        el.style.height = this.rollHeight + "px";
        el.style.lineHeight = this.rollHeight + "px";
      } else {
        el.innerHTML = item;
        el.className = "no-move";
        el.style.verticalAlign = "bottom";
      }
      // el.style.float='left';
      fragment.appendChild(el);
    }, []);
    this.container.innerHTML = "";
    this.container.appendChild(fragment);
    // 存储滚动的数字
    this.numberArr = numArr.filter((item) => /[0-9]/.test(item));
  }
}

 

版权声明:本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 959677720#qq.cn(#换@) 举报,一经查实,本站将立刻删除。
原文链接:https://juejin.cn/post/7032552700147400712

相关文章

  • JavaScript实现余额数字滚动效果

    JavaScript实现余额数字滚动效果

    1.实现背景 上周在一个完成任务领取红包的活动需求中,需要实现一个用户点击按钮弹出领取红包弹窗后,在关 闭弹窗返回原来的页面时,页面余额数字部分要展示一个......
    12-24
  • JavaScript函数封装随机颜色验证码(完整代码)的介

    JavaScript函数封装随机颜色验证码(完整代码)的介

    数字或者字母或者数字字母混合的n位验证码带随机的颜色。下面是完整的代码,需要的自取哈! ? function verify(a = 6,b = num){ //定义三个随机验证码验证码库 var num =01234567......
    12-22
  • js实现数组的扁平化介绍

    js实现数组的扁平化介绍

    数组扁平化的方式 什么是数组扁平化? 数组扁平化:指将一个多维数组转化为一个一维数组。 例:将下面数组扁平化处理。 const arr = [1, [2, 3, [4, 5]]] // --- [ 1, 2, 3, 4, 5 ......
    12-11
  • JavaScript事件委托原理介绍

    JavaScript事件委托原理介绍

    一、什么是事件委托 事件委托也称为事件代理。就是利用事件冒泡,把子元素的事件都绑定到父元素上。如果子元素阻止了事件冒泡,那么委托就无法实现。 举个简单的......
    12-07
  • 使用react-color实现前端取色器的教程

    使用react-color实现前端取色器的教程

    我们可以通过react-color实现前端界面的取色器,效果如下图所示: 安装 npm i react-color -S 使用 import React, { Component, Fragment, createRef } from react; import { Popover } from antd; import {......
    11-12
  • React手写tab切换的介绍

    React手写tab切换的介绍

    父文件 import React, { useState } from react; // import Module1 from ./Module1; // import Module2 from ./Module2; // import Module3 from ./Module3; // import Module4 from ./Module4; import HeaderTtabs, { tagType } from......
    11-12
  • react路由Link配置的介绍

    react路由Link配置的介绍

    1、Link的to属性 (1)放置路由路径 (2)放置对象,且为规定格式 {pathname:/xx,search:?键值对,hash:#xxx,state:{键值对}}会自动将pathname、search、hash拼接在url路径上,state为传入的参数 可通......
    11-10
  • JavaScript实现橱窗展示的介绍

    JavaScript实现橱窗展示的介绍

    先搭架子: * { margin: 0; padding: 0; } .box { width: 800px; height: 190px; border: 1px solid #000; margin: 100px auto; } ul { list-style: none; display: flex; } ul img { vertical-align: top; } .progress { width: 100......
    11-08
  • 原型和原型链prototype和proto的区别介绍

    原型和原型链prototype和proto的区别介绍

    1、原型 原型是function对象下的属性,它定义了构造函数的共同祖先,也就是一个父子级的关系,子对象会继承父对象的方法和属性 prototype是函数下的属性,对象想要查看......
    10-31
  • Echats图表大屏自适应的实现方法介绍

    Echats图表大屏自适应的实现方法介绍

    使用图表结合数据可以很直观的视觉效应,大屏展示已经成为企业数据展示的常见场景,如何做到大屏自适应是我们需要解决的一个问题,下面是其中一种解决方案,利用......
    10-25