数字滚动效果(插件)实现——VUE + 原生


        平时在工作中可能会遇到实现数字滚动效果,作者将个人用到过得几个插件和实现方法进行了整理,有简便的vue插件,也有原生的应用,仅供参考(也可应用于 大屏项目)。

VUE 插件

一、vue-count-to

        vue-count-to是一个无依赖,轻量级的vue组件,可以设置 startValendVal,自行覆盖easing、Fn,自动判断计数或倒计时等。

  1. 使用方法
安装使用:npm install vue-count-to
使用代码:
<template>
  <count-to :startVal='startVal' :endVal='endVal' :duration='3000'></count-to>
</template>
<script>
  import countTo from 'vue-count-to';
  export default {
    components: { CountTo },
    data () {
      return {
        startVal: 0,
        endVal: 2020
      }
    }
  }
</script>
  1. 选项配置
PropertyDescriptiontypedefault
startVal开始值Number0
endVal结束值Number2020
duration持续时间,以毫秒为单位Number3000
autoplay自动播放Booleantrue
decimals要显示的小数位数Number0
decimal十进制分割Number*
separator分隔符String*
prefix前缀String*
suffix后缀String*
useEasing使用缓和功能Booleantrue
easingFn缓和回调Function*
mountedCallback挂载以后返回回调Function*
start开始计数Function*
pause暂停计数Function*
reset重置countToFunction*

二、vue-animate-number

  1. 使用方法
安装使用:npm install vue-animate-number
使用代码:
<template>
  <animate-number from="0" to="10000" duration="3000"  :formatter="formatter"></animate-number>
  <!--  或  -->
  <animated-number :value="showValue" 
  		:formatValue="formatter" :duration="showValueTime">
  </animated-number>
</template>
<script>
 import AnimatedNumber from "animated-number-vue"
  export default {
    components: { AnimatedNumber },
    data () {
      return {
        showValue: 10000,
        showValueTime: 3000
      }
    },
    methods: {
	  formatter(value) {
         // toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。
         return ` ${value.toFixed(2)}`;
	  },
	}
  }
</script>
  1. 选项配置
PropertyDescriptiontypedefault
value (required)number that will be animatedNumber, String10000
duration (optional)the duration of animationNumber3000
round (optional)remove decimals by rounding the valueNumber*
delay (optional)the delay of animationNumber*
easing (optional)you can found all valid values hereNumber*
formatValueA function that will manipulate the animated valueFunction*

原生写法

注:以下仅提供作者的具体代码,实际项目中以个人需求为主,自行调整。
在这里插入图片描述

  1. HTML部分
<div class="total-area">
    <span class="area-name">管辖总面积</span>
    <span id="areaNumber" class="area-number"></span>
    <span class="area-unit">km²</span>
</div>
  1. CSS部分(less写法)
.total-area {
      display: flex;
      flex-direction: row;
      color: #fff;
      font-size: 0.285rem;
      cursor: pointer;
      z-index: 100;
      .area-name {
          line-height: 0.6rem;
          margin-right: 0.125rem;
      }
      .area-number {
          position: relative;
          font-size: 0.4875rem;
          text-align: center;
          color: #fff;
          writing-mode: vertical-lr;
          text-orientation: upright;
          /*文字禁止编辑*/
          -moz-user-select: none; /*火狐*/
          -webkit-user-select: none; /*webkit浏览器*/
          -ms-user-select: none; /*IE10*/
          -khtml-user-select: none; /*早期浏览器*/
          user-select: none;
          /*滚动数字设置*/
          .number-item {
              width: 0.475rem;
              height: 0.6rem;
              list-style: none;
              margin-right: 0.125rem;
              background: #ffa529;
              border-radius: 0.05rem;
              border: 1px solid #ffa529;
              & > span {
                  position: relative;
                  display: inline-block;
                  margin-right: 0.075rem;
                  width: 100%;
                  height: 100%;
                  writing-mode: vertical-rl;
                  text-orientation: upright;
                  overflow: hidden;
                  & > i {
                      font-style: normal;
                      position: absolute;
                      top: 0.025rem;
                      left: 50%;
                      transform: translate(-50%, 0);
                      transition: transform 1s ease-in-out;
                      letter-spacing: 0.125rem;
                  }
              }
          }
      }
      .area-unit {
          display: flex;
          flex-direction: column;
          justify-content: flex-end;
          font-size: 0.275rem;
      }
  }
  1. JS部分
// 创建渲染数字DOM元素
function createDom(){
    let orderNum = ["0", "0", "0", "0"];
    let str = '';
    for (let i = 0; i < orderNum.length; i++) {
        if (!isNaN(orderNum[i])) {
            str += '<li class="number-item">' + 
            '<span><i class="numberItem">0123456789</i></span>' + 
            '</li>'
        } else {
            str += '<li>' + 
            '<span class="comma">' + orderNum[i] +'</span>' + 
            '</li>'
        }
    }
    document.getElementById("areaNumber").innerHTML = str;
    setTimeout(function(){
        initDigitalScroll(1079);
    }, 400)
}
// 数字格式化处理
function initDigitalScroll(num) {
    num = num.toString();
    // 把数字变成字符串
    if (num.length < 4) {
        num = "0" + num; // 如未满四位数,添加"0"补位
        initDigitalScroll(num); // 递归添加"0"补位
    } else if (num.length === 4) {
        orderNum = num.split(""); // 将其便变成数据,渲染至滚动数组
    }
    setNumberTransform(orderNum);
}
// 结合CSS 对数字字符进行滚动,显示数量
function setNumberTransform(orderNum) {
    const numberItems = document.getElementsByClassName("numberItem"); // 计算元素数量
    const numberArr = orderNum.filter(item => !isNaN(item));
    for (let index = 0; index < numberItems.length; index++) {
        const elem = numberItems[index];
        elem.style.transform = `translate(-50%, -${numberArr[index] * 10}%)`;
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值