jquery的animate动画效果函数用JS代码是如何实现的

众所周知,jquery是一个封装了很多函数的JS代码库,页面上要做的很多的东西如果用JS代码实现是很费时费力的,所以才有了jquery这种封装好的代码库,帮助程序员快速开发web实现交互,其中有一个很常见的函数animate,只需要传入一些属性和属性需要改变的值以及回调函数等就可以实现很难的动画效果。调用起来很容易,但JS代码是如何实现的呢,下面我就贴上我封装好的一个JS代码的函数,可以实现同animate差不多的效果

我做了一个demo,实现了鼠标放上去飞机就向上移动并且逐渐透明然后从下面回来的效果,不是调用的jquery的animate,而是采用手打的JS代码来实现。

下面是具体代码:

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>动画案例</title>
	<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
	<div id="box">
		<ul>
			<li><div><img src="images/1.png"></div><p>出行</p></li>
			<li><div><img src="images/1.png"></div><p>出行</p></li>
			<li><div><img src="images/1.png"></div><p>出行</p></li>
			<li><div><img src="images/1.png"></div><p>出行</p></li>
			<li><div><img src="images/1.png"></div><p>出行</p></li>
			<li><div><img src="images/1.png"></div><p>出行</p></li>
			<li><div><img src="images/1.png"></div><p>出行</p></li>
			<li><div><img src="images/1.png"></div><p>出行</p></li>
		</ul>
	</div>
	
<script type="text/javascript" src="script.js"></script>
</body>
</html>

style.css:

#box{
	width: 280px;
	height: 300px;
	margin:0 auto;
	background-color: #aaa;
	text-align: center;

}
ul{
	list-style: none;
	display: block-inline;
	height: 100%;
	padding:0;
}
ul li{
	margin: 10px 10px;
	list-style: none;
	display: block-inline;
	float: left;
	width: 50px;
	height: 50px;
	background-color: #fff;
	text-align: center;
	padding:0;
}
ul li div{
	width: 100%;
	height: 30px;
	margin: 0px; 
	padding: 0px; 
	display: block-inline;
	opacity: 1;
}
ul li p{
	margin: 2px 0;
	font-size: 10px;	
	font-family: '楷体';
	color: #aaa;
}

script.js:

window.onload = function () {
	var  box = document.getElementById('box');
	var aList = box.getElementsByTagName('li');
	for (var i = 0; i < aList.length; i++) {
		
		aList[i].onmouseover = function () {
			var _this = this.getElementsByTagName('img')[0];
			startMove(_this,{'margin-top':-25,'opacity':0},function () {
				_this.style.marginTop = 50+'px';
				startMove(_this,{'margin-top':2,'opacity':100},false);
				}
			);
		};
		
	}
};

/**
 * [startMove description] 封装好的缓冲方式改变元素某个方向上的值
 * @param  {[type]} obj    [description]	要改变的元素
 * @param  {[type]} target [description]	元素要改变成的目标值
 * @param  {[type]} attr   [description]	元素需要改变的属性
 * @return {[type]}        [description]
 */
// function startMove(obj,{attr1:target1,attr2:target2},fn)
// 使用json格式接收参数可以接收多对参数,实现同时运动
function startMove(obj,json,fn) {
	// 定义变化的速度
	var speed;
	clearInterval(obj.timer);
	// 及时反映当前属性的变化
	var length;
	// 判断是否所有属性都到达了目标值的标杆
	var flag;
	obj.timer = setInterval(function () {
		flag = true;
		for(var attr in json){
			if(attr == 'opacity'){
				//如果传进来的属性是不透明度,需要使用以下代码获取其值
				length = Math.round(parseFloat(getStyle(obj,attr))*100);
			} else {
				// length = obj.offsetWidth;//使用对象的offsetWidth属性取得对象的宽度
				length = parseInt(getStyle(obj,attr));
			}
			//计算速度
			speed = (json[attr] - length)/2;//计算出一个可以变化的速度,距离目标越近速度越小,反之则越大
			speed = speed>0?Math.ceil(speed):Math.floor(speed);//防止速度出现-1到0和0到1的情况,出现则向上(正数)或向下取整(负数)
			//判断停止还是运行
			if(length != json[attr]){
				flag = false;
			}
			length += speed;
			if(attr == 'opacity'){
				//针对IE浏览器
				obj.style.filter = 'alpha(opacity:'+length+')';
				obj.style.opacity = length/100;
			}else{
				// 等于obj.style.attr = length+'px'; attr表示某个属性例如width
				obj.style[attr] = length+'px';
			}
		}
		if(flag){
			clearInterval(obj.timer);
			// 当停止后执行,形成链式运动
			if(fn){
				fn();
			}
		}
		
	}, 50);

}

//用于获取对象元素样式的值
function getStyle (obj,attr) {
    //IE使用currentStyle,火狐使用getComputedStyle
    if(obj.currentStyle){
        return obj.currentStyle[attr];
    }  else {
        return getComputedStyle(obj,false)[attr];
    }
}

images/1.png:这是飞机的图片








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值