zoukankan      html  css  js  c++  java
  • 动画函数MTween.js

    实现各种各样的动画效果

    使用方法:MTween(init);

    参数:init:(是个对象){

                        el:obj,//元素

                        target:{attr:val},//元素属性及对应的目标点(是个对象,也就是可以设置多个属性及其值)!注意:如果是设置透明度和scale系列放大缩小的时候,比如想要把元素放大为原来的2倍,就要写为200,同理,透明度设置为1,就要写为100

                        time:1000,//时间(此时为1s)

                        type:"linear",//动画类型

                        callBack:fn,//回调函数(即,整个动画执行完之后要执行的函数)

                        callIn:fn//同步函数(即,动画在执行过程中同步执行的函数)

                    }

    前四个参数是必选参数,后两个是可选参数

    动画类型的可选值有:

    linear、easeIn、easeOut、easeBoth、easeInStrong、easeOutStrong、easeBothStrong、
    elasticIn、elasticOut、elasticBoth、backIn、backOut、backBoth、bounceIn、bounceOut、bounceBoth

    下面是我们封装的函数(因为下面的封装函数,里面涉及的知识点我已经在其他函数中详细解释了,所以,下面没写注释)

    如果有什么疑问,可以看cssTransform,以及css函数封装,里面有注释,当然如果你只是要用这个函数的话,知道怎么用就可以,那直接把下面的引入你的代码中,然后直接使用即可

    var Tween = {
    linear: function (t, b, c, d){
    return c*t/d + b;
    },
    easeIn: function(t, b, c, d){
    return c*(t/=d)*t + b;
    },
    easeOut: function(t, b, c, d){
    return -c *(t/=d)*(t-2) + b;
    },
    easeBoth: function(t, b, c, d){
    if ((t/=d/2) < 1) {
    return c/2*t*t + b;
    }
    return -c/2 * ((--t)*(t-2) - 1) + b;
    },
    easeInStrong: function(t, b, c, d){
    return c*(t/=d)*t*t*t + b;
    },
    easeOutStrong: function(t, b, c, d){
    return -c * ((t=t/d-1)*t*t*t - 1) + b;
    },
    easeBothStrong: function(t, b, c, d){
    if ((t/=d/2) < 1) {
    return c/2*t*t*t*t + b;
    }
    return -c/2 * ((t-=2)*t*t*t - 2) + b;
    },
    elasticIn: function(t, b, c, d, a, p){
    if (t === 0) {
    return b;
    }
    if ( (t /= d) == 1 ) {
    return b+c;
    }
    if (!p) {
    p=d*0.3;
    }
    if (!a || a < Math.abs(c)) {
    a = c;
    var s = p/4;
    } else {
    var s = p/(2*Math.PI) * Math.asin (c/a);
    }
    return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
    },
    elasticOut: function(t, b, c, d, a, p){
    if (t === 0) {
    return b;
    }
    if ( (t /= d) == 1 ) {
    return b+c;
    }
    if (!p) {
    p=d*0.3;
    }
    if (!a || a < Math.abs(c)) {
    a = c;
    var s = p / 4;
    } else {
    var s = p/(2*Math.PI) * Math.asin (c/a);
    }
    return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
    },
    elasticBoth: function(t, b, c, d, a, p){
    if (t === 0) {
    return b;
    }
    if ( (t /= d/2) == 2 ) {
    return b+c;
    }
    if (!p) {
    p = d*(0.3*1.5);
    }
    if ( !a || a < Math.abs(c) ) {
    a = c;
    var s = p/4;
    }
    else {
    var s = p/(2*Math.PI) * Math.asin (c/a);
    }
    if (t < 1) {
    return - 0.5*(a*Math.pow(2,10*(t-=1)) *
    Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
    }
    return a*Math.pow(2,-10*(t-=1)) *
    Math.sin( (t*d-s)*(2*Math.PI)/p )*0.5 + c + b;
    },
    backIn: function(t, b, c, d, s){
    if (typeof s == 'undefined') {
    s = 1.70158;
    }
    return c*(t/=d)*t*((s+1)*t - s) + b;
    },
    backOut: function(t, b, c, d, s){
    if (typeof s == 'undefined') {
    s = 2.70158; //回缩的距离
    }
    return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
    },
    backBoth: function(t, b, c, d, s){
    if (typeof s == 'undefined') {
    s = 1.70158;
    }
    if ((t /= d/2 ) < 1) {
    return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
    }
    return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
    },
    bounceIn: function(t, b, c, d){
    return c - Tween['bounceOut'](d-t, 0, c, d) + b;
    },
    bounceOut: function(t, b, c, d){
    if ((t/=d) < (1/2.75)) {
    return c*(7.5625*t*t) + b;
    } else if (t < (2/2.75)) {
    return c*(7.5625*(t-=(1.5/2.75))*t + 0.75) + b;
    } else if (t < (2.5/2.75)) {
    return c*(7.5625*(t-=(2.25/2.75))*t + 0.9375) + b;
    }
    return c*(7.5625*(t-=(2.625/2.75))*t + 0.984375) + b;
    },
    bounceBoth: function(t, b, c, d){
    if (t < d/2) {
    return Tween['bounceIn'](t*2, 0, c, d) * 0.5 + b;
    }
    return Tween['bounceOut'](t*2-d, 0, c, d) * 0.5 + c*0.5 + b;
    }
    };
    function css(element, attr , val){
    if(attr == "scale"||attr == "scaleX"
    ||attr == "scaleY"||attr == "scaleZ"
    ||attr == "rotateX"||attr == "rotateY"
    ||attr == "rotateZ"||attr == "rotate"
    ||attr == "skewX"||attr == "skewY"
    ||attr == "translateX"||attr == "translateY"
    ||attr == "translateZ") {
    return cssTransform(element, attr, val);
    }
    if(arguments.length == 2){
    var val = getComputedStyle(element)[attr];
    if(attr=='opacity'){
    val = Math.round(val*100);
    }
    return parseFloat(val);
    }
    if(attr == "opacity") {
    element.style.opacity= val/100;
    } else {
    element.style[attr]= val + "px";
    }
    }
    function cssTransform(element, attr, val){
    if(!element.transform){
    element.transform = {};
    }
    if(typeof val === "undefined"){
    if(typeof element.transform[attr] === "undefined"){
    switch(attr){
    case "scale":
    case "scaleX":
    case "scaleY":
    case "scaleZ":
    element.transform[attr] = 100;
    break;
    default:
    element.transform[attr] = 0;
    }
    }
    return element.transform[attr];
    } else {
    element.transform[attr] = val;
    var transformVal = "";
    for(var s in element.transform){
    switch(s){
    case "scale":
    case "scaleX":
    case "scaleY":
    case "scaleZ":
    transformVal += " " + s + "("+(element.transform[s]/100)+")";
    break;
    case "rotate":
    case "rotateX":
    case "rotateY":
    case "rotateZ":
    case "skewX":
    case "skewY":
    transformVal += " " + s + "("+element.transform[s]+"deg)";
    break;
    default:
    transformVal += " " + s + "("+element.transform[s]+"px)";
    }
    }
    element.style.WebkitTransform = element.style.transform = transformVal;
    }
    }
    function MTween(init){
    var t = 0;
    var b = {};
    var c = {};
    var d = init.time / 20;
    for(var s in init.target){
    b[s] = css(init.el, s);
    c[s] = init.target[s] - b[s];
    }
    clearInterval(init.el.timer);
    init.el.timer = setInterval(
    function(){
    t++;
    if(t>d){
    clearInterval(init.el.timer);
    init.callBack&&init.callBack.call(init.el);
    } else {
    init.callIn&&init.callIn.call(init.el);
    for(var s in b){
    var val = Number((Tween[init.type](t,b[s],c[s],d)).toFixed(2));
    css(init.el, s, val);
    }
    }
    },
    20
    );
    }

    ————————————————
    版权声明:本文为CSDN博主「冰雪为融」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/lhjuejiang/java/article/details/80538044

  • 相关阅读:
    Windows安装深度学习框架Tensorflow GPU版本
    Genymotion3.0.4(with VirtualBox 个人免费版)安装及使用
    09.Python基础--迭代器
    08.Python基础--面向对象深入
    07.Python基础--面向对象
    06.Python基础--函数深入
    05.Python基础--函数
    04.Python基础--深入流程控制
    03.Python基础--流程控制
    02.Python基础--数据类型
  • 原文地址:https://www.cnblogs.com/2019gdiceboy/p/12977445.html
Copyright © 2011-2022 走看看