微信小程序实现数字滚动动画

实现数字滚动动画需要用到小程序中的 animationsetData 方法,具体步骤如下:

1. 页面结构

在 wxml 文件中,需要准备一个数字占位符,以及一个用于显示数字的文本框。

<view class="number-placeholder">{{ number }}</view>
<view class="number-display">{{ displayNumber }}</view>

其中,.number-placeholder 类用于占位置,.number-display 类用于显示数字。为了让文本框看起来更美观,可以给它添加一些样式:

.number-display {
  font-size: 32px;
  color: #ff6886;
  font-weight: bold;
}

2. 动画实现

在 js 文件中,定义一个 animation 对象,并设置初始状态。同时,定义一个用于显示的数字和一个计时器,初始值都为 0。

Page({
  data: {
    number: 1234567890,
    displayNumber: 0,
    timer: null,
    animationData: null,
  },

  onLoad: function () {
    // 初始化 animation 对象
    let animation = wx.createAnimation({
      duration: 1000,
      timingFunction: "linear",
    });
    this.setData({
      animationData: animation.export(),
    });
  },
});

接下来,在 onShow 方法中启动计时器,每隔一段时间更新显示数字。

onShow: function () {
  this.startTimer();
},

startTimer: function () {
  let that = this;
  let step = 7890;
  let count = 0;

  that.setData({ displayNumber: 0 });

  let timer = setInterval(function () {
    count++;
    if (count > step) {
      clearInterval(that.data.timer);
      return;
    }
    let newNumber = Math.ceil(that.data.number * (count / step));
    that.setData({ displayNumber: newNumber });
  }, 10);

  that.setData({ timer: timer });
},

在计时器中,我们首先将显示数字 displayNumber 设为 0,然后每隔 10 毫秒更新一次数字,更新的值为原始数字乘以 0 到 1 之间的比例。这样,则会让显示数字从 0 逐渐增加到原始数字。

接下来,我们将动画与数字绑定,实现数字的滚动效果。在计时器中,添加如下代码:

  let animation = wx.createAnimation({
    duration: 1000,
    timingFunction: "linear",
  });
  animation
    .top("-60rpx")
    .step()
    .top("0")
    .step({ duration: 0 });
  that.setData({
    animationData: animation.export(),
  });

此段代码首先创建一个 animation 对象,并设置动画效果为线性。然后,我们在 1 秒钟内将文本框向上移动 60 像素,并将动画段的状态保存到 animationData 中。动画结束后,将文本框移回原位置,duration: 0 表示这是一个瞬间完成的动画。

3. 示例说明

示例一:带有参数的动画函数

在实际开发中,可以封装一个带有参数的动画函数,方便复用。下面是一个示例:

    function animateNumber(number, duration) {
      let that = this;
      let step = duration / 10;
      let count = 0;
      let animation = wx.createAnimation({
        duration: duration,
        timingFunction: "linear",
      });

      that.setData({ displayNumber: 0 });

      let timer = setInterval(function () {
        count++;
        if (count > step) {
          clearInterval(that.data.timer);
          return;
        }
        let newNumber = Math.ceil(number * (count / step));
        that.setData({ displayNumber: newNumber });
      }, 10);

      animation
        .top("-60rpx")
        .step()
        .top("0")
        .step({ duration: 0 });
      that.setData({
        animationData: animation.export(),
      });

      that.setData({ timer: timer });
    }

    // 调用 animateNumber 函数
    animateNumber.call(this, 9876543210, 2000);

可以看到,这个函数接收两个参数,分别是目标数字和动画时长。在函数体中,我们重复了之前计时器的逻辑部分,但是将初始数字和计时器清理都从数据里面移到了函数外部。在计时器结束后,执行和之前一样的动画效果,实现数字滚动效果。

示例二:使用插件实现滚动数字

如果你不想手写动画,也可以使用现成的数字滚动插件,并修改样式适应自己的需求。下面是一个示例:

<view class="number-display">
  <text class="number-text">{{ number }}</text>
  <number-scrolling duration="{{ duration }}" class="number-scrolling" wx:if="{{ useScrolling }}"></number-scrolling>
  <number-text duration="{{ duration }}" class="number-scrolling" wx:else></number-text>
</view>

在 wxml 文件中,我们引入了一个名叫 number-scrolling 的插件,然后根据需要选择是否使用。如果使用,则插件会产生滚动数字的效果;如果不使用,则直接显示目标数字。同时,我们将样式分离到 .number-text.number-scrolling 两个类中,以便样式调整。

.number-text {
  font-size: 32px;
  color: #ff6886;
  font-weight: bold;
  text-align: center;
}

.number-scrolling {
  height: 40px;
  overflow: hidden;
  position: relative;
}

.number-scrolling .number-scrolling-item {
  position: absolute;
  top: 0px;
}

js 文件中,我们需要导入插件,并设置插件参数:

const numberScrollingBehaviors = require('../../behaviors/number-scrolling');

Page({
  behaviors: [numberScrollingBehaviors],

  data: {
    number: 1234567890,
    duration: 2000,
    useScrolling: true,
  },
});

注意,在 js 文件中,我们需要导入 number-scrolling 插件的行为,以便使用插件提供的方法和属性。

完整代码及效果请参考示例

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序实现数字滚动动画 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JS如何操作DOM基于表格动态展示数据

    操作DOM基于表格动态展示数据是Web开发中常用的技术。JavaScript是DOM操作的主力军。下面是操作DOM基于表格动态展示数据的完整攻略: 1. 数据渲染 在JavaScript中,可以通过插值表达式、DOM操作等方式将数据渲染到HTML页面。下面我们将介绍两个渲染数据的示例。 1.1 使用innerHTML渲染表格 使用innerHTML属性,可以…

    JavaScript 2023年6月10日
    00
  • Dwr3.0纯注解(纯Java Code配置)配置与应用浅析一之零配置文件化

    Dwr3.0纯注解(纯Java Code配置)配置与应用浅析一之零配置文件化 什么是Dwr3.0纯注解配置 Dwr(Direct Web Remoting) 是一种轻量级的远程框架,它可以实现web端的无刷新操作、异步处理,极大地提高了web应用的用户体验。 需要说明的是,这里提到的Dwr3.0纯注解配置,与使用传统的dwr.xml配置文件的方式相对。 Dw…

    JavaScript 2023年5月28日
    00
  • 浅谈Javascript面向对象编程

    下面是“浅谈Javascript面向对象编程”的完整攻略,包括了面向对象编程的基本概念、Javascript中面向对象编程的实现方式以及示例说明。 基本概念 面向对象编程(OOP)是一种编程范式,它将程序中的数据和操作封装在一起,通过对象之间互相交互实现程序的功能。在面向对象编程的范式中,对象是程序的基本单位,每个对象拥有自己的属性和方法。 面向对象编程通过…

    JavaScript 2023年5月27日
    00
  • js中作用域的实例解析

    JS中作用域的实例解析 在JavaScript中,作用域(Scope)是指访问变量、函数等标识符的范围。JavaScript的作用域基于函数(Function)而非块级作用域(Block Scope),这意味着变量的作用域在代码块 {} 中没有意义,而是在它们所在的函数中定义的。本篇攻略将通过实例来详细讲解JS中作用域的概念。 一、全局作用域 全局作用域(G…

    JavaScript 2023年6月10日
    00
  • 在JavaScript中实现链式调用的实现

    实现链式调用,可以让代码更加简洁、易读、易维护,主要分为两个步骤:实现方法的返回值为对象本身,实现链式调用调用下一个方法。 实现方法的返回值为对象本身 在JavaScript中,方法可以返回对 对象实例本身 的引用,这样就可以在同一个对象上多次调用不同的方法了。在方法的末尾,使用 return this 将当前对象实例返回即可。 下面是一个简单示例: con…

    JavaScript 2023年6月11日
    00
  • JavaScript中filter的用法实例分析

    我们来详细讲解一下“JavaScript中filter的用法实例分析”。 什么是filter? 在JavaScript中,filter()是Array对象的一个方法,它用于过滤数组中的元素,根据指定的条件筛选出符合条件的元素组成一个新数组并返回,原数组不会改变。 filter()方法接收一个函数作为参数,这个函数会被逐个考察数组中的元素,只有在符合特定条件时…

    JavaScript 2023年5月27日
    00
  • JS SetInterval 代码实现页面轮询

    JS的setInterval()方法可以用来循环定时执行某个函数或代码块,实现页面轮询功能。以下是实现步骤。 步骤1:创建计时器 我们可以使用setInterval()方法创建一个计时器,输入参数有两个,第一个是要执行的函数或代码块,第二个是执行的时间间隔(单位毫秒)。 以下是一个示例: setInterval(function(){ console.log…

    JavaScript 2023年6月11日
    00
  • 在React中this容易遇到的问题详解

    在React中this容易遇到的问题详解 在React开发中,this这个关键字非常常用,但同时也很容易引起问题。接下来,本文将详细讲解在React中this容易遇到的问题,并提供相应的解决方法。 问题1:函数调用时this指向问题 在React中,我们一般使用bind绑定this来确保函数中的this指向正确。但是,有时我们会在组件渲染时动态传递数据,这时…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部