zoukankan      html  css  js  c++  java
  • javascript动画

    javascript动画是js中比较重要的一环。本文是一个合集。既有对javascript动画的简介,入门等,又有对某个技术点的分析。

    简单的javascript动画

    不用任何javascript库,我们自己去实现一个类似jQuery的动画: 2s内容让元素宽高都从50px变成200px

    来看效果:2s内宽高从50px到200px

     

    function Animation(elem, properties, options){
    	var timer = null;
    	var core_pnum = /[+-]?(?:d*.|)d+(?:[eE][+-]?d+|)/.source;
    	var rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" );
    	var startTime = Date.now();
    	var tweens = [];
    	// 拼凑出动画需要改变的start, end, prop, unit属性
    	for(var index in properties){
    		var partsEnd = rfxnum.exec( properties[index] );
    		var partsStart = rfxnum.exec( elem.style[index] );
    		tweens.push({start: +partsStart[2], end: +partsEnd[2], prop:index, unit: partsStart[3]})
    	}
    	// 改变值
    	function run(percent){
    		var pos = easing[options.type](percent, percent*(options.duration), 0, 1, options.duration);
    		for(var i=0; i<tweens.length; i++){
    			elem.style[tweens[i].prop] = (tweens[i].start+(tweens[i].end-tweens[i].start)*pos)+ tweens[i].unit;
    		}
    	}
    	// 定时器回掉
    	function tick(){
    		var currentTime = Date.now();
    		var remaining = Math.max(0, options.duration + startTime - currentTime);
    		var percent = 1-remaining/options.duration;
    		if(percent === 1) clearInterval(timer)
    		run(percent);
    	}
    	// 开启定时器
    	function start(){
    		timer = setInterval(tick, 13);
    	}
    	start();
    }
    
    
    document.getElementsByTagName("input")[0].onclick = function(){
    		Animation(document.getElementsByTagName("div")[0], {
    			 "200px",
    			height: "200px"
    		}, {
    			type: "easeOutStrong",
    			duration: 1000
    		});
    	}

    这里我们用到了jquery Easing缓冲公式。

    var easing = {
    	// t: current time,  当前时间
    	// b: begInnIng value,  开始值
    	// c: change In value,  结束值
    	// d: duration, 动画时间
    	easeIn: function(x,t, b, c, d){  //加速曲线
    		return c*(t/=d)*t + b;
    	}
    }
     
    我们把总的时间设置成1(100%),开始自然是0,总时间duration已知,current time就是:duration * (1-(duration+startTime-nowTime)/duration)
    这样,开个定时器,元素的运动轨迹轻而易举的搞定。
     

    jQuery中的动画解读

    我们使用的jQuery版本是jQuery.2.0.3。
    想要分析它的实现,我们必然要对它的API非常熟悉。

    // Generate shortcuts for custom animations
    jQuery.each({
        slideDown: genFx("show"),
        slideUp: genFx("hide"),
        slideToggle: genFx("toggle"),
        fadeIn: { opacity: "show" },
        fadeOut: { opacity: "hide" },
        fadeToggle: { opacity: "toggle" }
    }, function( name, props ) {
        jQuery.fn[ name ] = function( speed, easing, callback ) {
            return this.animate( props, speed, easing, callback );
        };
    });

    jQuery.fn.extend({

    fadeTo: function( speed, to, easing, callback ) {},

    animate: function( prop, speed, easing, callback ) {},

    stop: function( type, clearQueue, gotoEnd ) {},

    finish: function( type ) {}

    })

    jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
        var cssFn = jQuery.fn[ name ];
        jQuery.fn[ name ] = function( speed, easing, callback ) {
            return speed == null || typeof speed === "boolean" ?
                cssFn.apply( this, arguments ) :
                this.animate( genFx( name, true ), speed, easing, callback );
        };
    });

    全部是拓展在jQuery的示例方法下。

    搞这么多接口实在是增加学习成本。我们只关注animate接口即可。

    调用animate()的流程图

    QQ20160308152803_thumb2

    jQuery动画拓展:贝塞尔曲线

    jQuery可以帮助我们实现基于时间的动画,路径规则我们可以自己定义。
    首先来看贝塞尔曲线的实现。
    天猫加入购物车的例子都很熟悉,我们来模拟一个。
    https://jsfiddle.net/sinbad/fkqjka2d/
  • 相关阅读:
    MVC与MVVM
    js正则删除字符串中的部分内容(支持变量和特殊符号)
    小程序之rpx适配方案
    表单元素内容禁用拼写检查
    vue组件实例的生命周期
    Windows下生成目录结构树命令
    DRF之解析器源码解析
    restful规范快速记忆
    python报错之OSError
    xlrd、xlwt
  • 原文地址:https://www.cnblogs.com/pfzeng/p/5254585.html
Copyright © 2011-2022 走看看