tumbling

0.0.3 • Public • Published

English Document

<a href="./README-EN.md">English Document</a>

Tumbling

Simple and Powerful Library for Number Changing with zero dependencies

Demos »

Contents

安装

  • 通过 npm安装(推荐):

    $ npm install tumbling

    Tumbling支持es:next规范,支持tree-shaking

  • 或者直接在html中引入

      <script src="https://path-to-project/dist/timnbling.min.js"></script> 

使用

new DomNumberTumbling(selector,options)(数值动画类)
import {DomNumberTumbling} from 'tumbling';
import 'tumbling/index.css';
const domNumberTumbling = new DomNumberTumbling(el,options);
domNumberTumbling.start();
setInterval(()=>{
    domNumberTumbling.update(Math.floor(domNumberTumbling.value + Math.random() * 100),{
    })
},3000)
new DomCountdownTumbling(selector,options)(倒计时动画类)
import {DomCountdownTumbling,FlipEffect} from 'tumbling';
import 'tumbling/index.css';
const domCountdownTumbling = new DomCountdownTumbling(el,{
    transitionTime:800,
    effect:FlipEffect,
    rotateDirection:FlipRender.VERTICAL, //水平翻转还是垂直翻转
    value:formatDt(new Date()),
})
domCountdownTumbling.start();
setInterval(()=>{
    domCountdownTumbling.update(formatDt(new Date()))
},1000)
new DomRawTumbling(selector,options)(无限滚动类)
import {DomRawTumbling} from 'tumbling';
import 'tumbling/index.css';
new DomRawTumbling(el,{
    transitionTime:3000,
    value:10,//十个坑位 或者 传入数组 [{step:步长,maxValue:最大值}]
    onStop:(value)=>{
        
    }
});

selector(Dom选择符)

selector -- pass String | HTMLElement,可以传dom选择符,也可以直接传入目标dom

options(配置)

  • effect(default TumblingEffect) -- pass Class 效果接口,Tumbling还提供FlipEffect,开发者可以自定义,类似实现如下
 
class AnyEffect{
    constructor(context,options){
        const _this = this;
        _this.context = context; //context 就是DomCountdownTumbling,DomNumberTumbling,DomRawTumbling
        _this.renderItem = options.renderItem;
        ...
    }
    mount(wrapper){  //必须有的方法,挂载dom
        ...
    }
    render(diffDistance,changeY){ //必须有的方法,改变dom样式
    }
}

具体可参考FlipEffect的实现

  • transitionTime(default 300) -- pass Number 动画时间
  • value -- pass Number 要显示的数值
  • thousand -- pass 'Boolean' 是否显示千分位
  • tween(default linear) -- pass String | Function 支持传缓动函数名,也支持开发者自己实现function( t//当前耗时, b//起始位置, c//最终位置, d//动画时长)
  • renderItem -- pass Function 单项渲染函数,函数签名function(value),value未当前值,value小于0表示站位符,填9(因为它最宽)
  • disappearAnimation -- pass Function 单项消失动画函数,函数签名function(wrapper,ratio),wrapper为单项的根Dom元素,ratio为动画进度
  • appearAnimation -- pass Function 同disappearAnimation一样,只不过是出现动画
  • onStop -- pass Function DomRawTumbling独有的回调

tween所有的缓动函数

{
    linear:function( t, b, c, d) {
      return (- b) * (/ d) + b;
    },
    easeInQuad: function( t, b, c, d) {
      return c * (/= d) * t + b;
    },
    easeOutQuad: function( t, b, c, d) {
      return -* (/= d) * (- 2) + b;
    },
    easeInOutQuad: function( t, b, c, d) {
      if ((/= d / 2) < 1) return c / 2 * t * t + b;
      return -/ 2 * ((--t) * (- 2) - 1) + b;
    },
    easeInCubic: function( t, b, c, d) {
      return c * (/= d) * t * t + b;
    },
    easeOutCubic: function( t, b, c, d) {
      return c * ((= t / d - 1) * t * t + 1) + b;
    },
    easeInOutCubic: function( t, b, c, d) {
      if ((/= d / 2) < 1) return c / 2 * t * t * t + b;
      return c / 2 * ((-= 2) * t * t + 2) + b;
    },
    easeInQuart: function( t, b, c, d) {
      return c * (/= d) * t * t * t + b;
    },
    easeOutQuart: function( t, b, c, d) {
      return -* ((= t / d - 1) * t * t * t - 1) + b;
    },
    easeInOutQuart: function( t, b, c, d) {
      if ((/= d / 2) < 1) return c / 2 * t * t * t * t + b;
      return -/ 2 * ((-= 2) * t * t * t - 2) + b;
    },
    easeInQuint: function( t, b, c, d) {
      return c * (/= d) * t * t * t * t + b;
    },
    easeOutQuint: function( t, b, c, d) {
      return c * ((= t / d - 1) * t * t * t * t + 1) + b;
    },
    easeInOutQuint: function( t, b, c, d) {
      if ((/= d / 2) < 1) return c / 2 * t * t * t * t * t + b;
      return c / 2 * ((-= 2) * t * t * t * t + 2) + b;
    },
    easeInSine: function( t, b, c, d) {
      return -* Math.cos(/ d * (Math.PI / 2)) + c + b;
    },
    easeOutSine: function( t, b, c, d) {
      return c * Math.sin(/ d * (Math.PI / 2)) + b;
    },
    easeInOutSine: function( t, b, c, d) {
      return -/ 2 * (Math.cos(Math.PI * t / d) - 1) + b;
    },
    easeInExpo: function( t, b, c, d) {
      return (== 0) ? b : c * Math.pow(2, 10 * (/ d - 1)) + b;
    },
    easeOutExpo: function( t, b, c, d) {
      return (== d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;
    },
    easeInOutExpo: function( t, b, c, d) {
      if (== 0) return b;
      if (== d) return b + c;
      if ((/= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (- 1)) + b;
      return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;
    },
    easeInCirc: function( t, b, c, d) {
      return -* (Math.sqrt(1 - (/= d) * t) - 1) + b;
    },
    easeOutCirc: function( t, b, c, d) {
      return c * Math.sqrt(1 - (= t / d - 1) * t) + b;
    },
    easeInOutCirc: function( t, b, c, d) {
      if ((/= d / 2) < 1) return -/ 2 * (Math.sqrt(1 - t * t) - 1) + b;
      return c / 2 * (Math.sqrt(1 - (-= 2) * t) + 1) + b;
    },
    easeInElastic: function( t, b, c, d) {
      var s = 1.70158; var p = 0; var a = c;
      if (== 0) return b; if ((/= d) == 1) return b + c; if (!p) p = d * .3;
      if (< Math.abs(c)) {
        a = c; var s = p / 4; 
      } else var s = p / (2 * Math.PI) * Math.asin(/ a);
      return -(* Math.pow(2, 10 * (-= 1)) * Math.sin( (* d - s) * (2 * Math.PI) / p )) + b;
    },
    easeOutElastic: function( t, b, c, d) {
      var s = 1.70158; var p = 0; var a = c;
      if (== 0) return b; if ((/= d) == 1) return b + c; if (!p) p = d * .3;
      if (< Math.abs(c)) {
        a = c; var s = p / 4; 
      } else var s = p / (2 * Math.PI) * Math.asin(/ a);
      return a * Math.pow(2, -10 * t) * Math.sin( (* d - s) * (2 * Math.PI) / p ) + c + b;
    },
    easeInOutElastic: function( t, b, c, d) {
      var s = 1.70158; var p = 0; var a = c;
      if (== 0) return b; if ((/= d / 2) == 2) return b + c; if (!p) p = d * (.3 * 1.5);
      if (< Math.abs(c)) {
        a = c; var s = p / 4; 
      } else var s = p / (2 * Math.PI) * Math.asin(/ a);
      if (< 1) return -.5 * (* Math.pow(2, 10 * (-= 1)) * Math.sin( (* d - s) * (2 * Math.PI) / p )) + b;
      return a * Math.pow(2, -10 * (-= 1)) * Math.sin( (* d - s) * (2 * Math.PI) / p ) * .5 + c + b;
    },
    easeInBack: function( t, b, c, d, s) {
      if (== undefined) s = 1.70158;
      return c * (/= d) * t * ((+ 1) * t - s) + b;
    },
    easeOutBack: function( t, b, c, d, s) {
      if (== undefined) s = 1.70158;
      return c * ((= t / d - 1) * t * ((+ 1) * t + s) + 1) + b;
    },
    easeInOutBack: function( t, b, c, d, s) {
      if (== undefined) s = 1.70158; 
      if ((/= d / 2) < 1) return c / 2 * (* t * (((*= (1.525)) + 1) * t - s)) + b;
      return c / 2 * ((-= 2) * t * (((*= (1.525)) + 1) * t + s) + 2) + b;
    },
    easeInBounce: function( t, b, c, d) {
      return c - Tween.easeOutBounce( d - t, 0, c, d) + b;
    },
    easeOutBounce: function( t, b, c, d) {
      if ((/= d) < (1 / 2.75)) {
        return c * (7.5625 * t * t) + b;
      } else if (< (2 / 2.75)) {
        return c * (7.5625 * (-= (1.5 / 2.75)) * t + .75) + b;
      } else if (< (2.5 / 2.75)) {
        return c * (7.5625 * (-= (2.25 / 2.75)) * t + .9375) + b;
      } else {
        return c * (7.5625 * (-= (2.625 / 2.75)) * t + .984375) + b;
      }
    },
    easeInOutBounce: function( t, b, c, d) {
      if (< d / 2) return Tween.easeInBounce( t * 2, 0, c, d) * .5 + b;
      return Tween.easeOutBounce( t * 2 - d, 0, c, d) * .5 + c * .5 + b;
    }
};

本地开发

npm install
npm run dev

Readme

Keywords

Package Sidebar

Install

npm i tumbling

Weekly Downloads

1

Version

0.0.3

License

ISC

Last publish

Collaborators

  • sheweichun