004_JS封装简单动画函数

前言:

        使用JavaScript,主要是用于完成一些页面上的特效,今天就带领大家一起,封装一个简单的函数。写好了之后,完全可以存起来,今后各种调用就好。






原理:

- 根据传入的位置(target),使对象(obj),按一定的速度(speed)去改变自                己的样式(attr),当该函数(move)执行完毕之后,调用回调函(callback)。






注意:

- 为了避免多次点击造成定时器的多次调用,在每一次调用定时器之前,应该关闭                上一次的定时器。

- 定时器应该加在对象的属性中,而不是全局变量。

- 移动的速度和目标和起点之间,可能不能整除,所以要手动的让对象最后刚好在                目标位置上。

- 动画执行完毕之后,应该手动的关闭定时器。

- 回调函数是选传,需要处理没有传入的情况。




代码:

/
/**
 * @desc:执行简单动画
 * @param {Object} obj:待执行动画的元素。
 * @param {String} attri:动画的元素(比如width,left)
 * @param {Number} target:终点值。
 * @param {Number} speed:动画的执行速度。
 * @param {Function} callback:动画完成之后的回调函数。
 */
function move(obj, attr, target, speed, callback) {
	//关闭上一个定时器(定时器是加在目标对象中的,多个对象调用move函数,不会被clearInterval)
	clearInterval(obj.timer);

	//获取元素目前的位置
	var current = parseInt(getStyle(obj, attr));

	//判断速度的正负值
	if(current > target) {
		//此时速度应为负值
		speed = -speed;
	}

	//开启一个定时器,用来执行动画效果
	//向执行动画的对象中添加一个timer属性,用来保存它自己的定时器的标识
	obj.timer = setInterval(function() {

		//获取box1的原来的left值
		var oldValue = parseInt(getStyle(obj, attr));

		//在旧值的基础上增加
		var newValue = oldValue + speed;

		//解决误差值
		//向左移动时,需要判断newValue是否小于target
		//向右移动时,需要判断newValue是否大于target
		if((speed < 0 && newValue < target) || (speed > 0 && newValue > target)) {
			newValue = target;
		}

		//设置新值
		obj.style[attr] = newValue + "px";

		//当元素移动到target时,使其停止执行动画
		if(newValue == target) {
			//达到目标,关闭定时器
			clearInterval(obj.timer);
			
			//动画执行完毕,调用回调函数,根据是否传参,决定是否执行
			callback && callback();
		}

	}, 30);
}

/*
 * 定义一个函数,用来获取指定元素的当前的样式
 * 参数:
 * 		obj 要获取样式的元素
 * 		name 要获取的样式名
 */
function getStyle(obj, name) {

	if(window.getComputedStyle) {
		//正常浏览器的方式,具有getComputedStyle()方法
		return getComputedStyle(obj, null)[name];
	} else {
		//IE8的方式,没有getComputedStyle()方法
		return obj.currentStyle[name];
	}

}


有了以上代码,就可以简单的实现一个二级菜单了:


 



完整源码下载:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值