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

  • 相关阅读:
    【反射】Java反射机制
    Composer教程之常用命令
    Composer教程之基础用法
    Composer教程之初识Composer
    Composer 的结构详解
    现代 PHP 新特性系列(七) —— 内置的 HTTP 服务器
    现代 PHP 新特性系列(一) —— 命名空间
    现代 PHP 新特性系列(二) —— 善用接口
    现代 PHP 新特性系列(三) —— Trait 概览
    现代 PHP 新特性系列(四) —— 生成器的创建和使用
  • 原文地址:https://www.cnblogs.com/2019gdiceboy/p/12977445.html
Copyright © 2011-2022 走看看