js运动应用

·  多个div变宽

	for(var i=0;i<aDiv.length;i++)
	{
		//定义一个div的属性timer定时器,这样每个定时器就是独立的,类似于定义index序号的思想
		aDiv[i].timer = null;
		aDiv[i].onmouseover = function()
		{
			startMove(this,500);
		};
		aDiv[i].onmouseout = function()
		{
			startMove(this,200);
		};
	}
·  多个div淡入淡出

window.onload = function ()
{
	var aDiv = document.getElementsByTagName('div');

	for(var i=0;i<aDiv.length;i++)
	{
		//多物体框架的所有东西不能公用,公用会出问题,所以定义一个div的属性alpha存放透明度
		aDiv[i].alpha = 30;
		aDiv[i].timer = null;
		aDiv[i].onmouseover = function ()
		{
			startMove (this,100);
		};
		aDiv[i].onmouseout = function ()
		{
			startMove (this,30)
		};
	}
};

function startMove (obj,iTarget)
{
	clearInterval(obj.timer);
	obj.timer = setInterval(function(){
		var speed = (iTarget-obj.alpha)/16
		speed = speed>0?Math.ceil(speed):Math.floor(speed);

		if(obj.alpha == iTarget)
		{
			clearInterval(obj.timer);
		}
		else
		{
			obj.alpha+=speed;

			obj.style.filter = 'alpha(opacity:'+obj.alpha+')';
			obj.style.opacity = obj.alpha/100;
		}
	},30);
};
·  变宽和变高,解决offsetWidth加入边框的BUG

window.οnlοad=function ()
{
	var oDiv1 = document.getElementById('div1');
	var oDiv2 = document.getElementById('div2');

	oDiv2.onmouseover = function ()
	{
		startMove(this,'width',600)
	};
	oDiv2.onmouseout = function ()
	{
		startMove(this,'width',200)
	};
	oDiv1.onmouseover = function ()
	{
		startMove(this,'height',600)
	};
	oDiv1.onmouseout = function ()
	{
		startMove(this,'height',200)
	};
};

//取非行间样式封装函数
function getStyle(obj,name)
{
	if(obj.currentStyle)
	{
		//只兼容IE
		return obj.currentStyle[name];
	}
	else
	{
		//不兼容IE,其他的可以
		return getComputedStyle(obj,false)[name];
	}
};

//传入三个参数,实现一个运动框架操作多个div不同的属性
function startMove(obj,attr,iTarget)
{
	clearInterval(obj.timer);
	obj.timer = setInterval(function(){
		
		//简化代码,用变量存储取到的非行间样式,并且把他变成整数
		var cur = parseInt(getStyle(obj,attr));
		var speed = (iTarget-cur)/6;
		speed = speed>0?Math.ceil(speed):Math.floor(speed);

		if (cur==iTarget)
		{
			clearInterval(obj.timer);
		}
		else
		{
			obj.style[attr] = cur+speed+'px';
		}
	},30);
};
·  任意值得运动框架
window.οnlοad=function ()
{
	var oDiv1 = document.getElementById('div1');
	var oDiv2 = document.getElementById('div2');
	var oDiv3 = document.getElementById('div3'); 

	oDiv2.onmouseover = function ()
	{
		startMove(this,'width',600)
	};
	oDiv2.onmouseout = function ()
	{
		startMove(this,'width',200)
	};
	oDiv1.onmouseover = function ()
	{
		startMove(this,'height',600)
	};
	oDiv1.onmouseout = function ()
	{
		startMove(this,'height',200)
	};
	oDiv3.onmouseover = function ()
	{
		startMove(this,'opacity',100)
	};
	oDiv3.onmouseout = function ()
	{
		startMove(this,'opacity',30)
	};
};

//取非行间样式封装函数
function getStyle(obj,name)
{
	if(obj.currentStyle)
	{
		//只兼容IE
		return obj.currentStyle[name];
	}
	else
	{
		//不兼容IE,其他的可以
		return getComputedStyle(obj,false)[name];
	}
};

//传入三个参数,实现一个运动框架操作多个div不同的属性
function startMove(obj,attr,iTarget)
{
	clearInterval(obj.timer);
	obj.timer = setInterval(function(){
		
		//简化代码,用变量存储取到的非行间样式,并且把他变成整数
		var cur = 0;
		if(attr=='opacity')
		{
			//对取出的opacity转化成小数然后乘以100然后四舍五入
			cur = Math.round(parseFloat(getStyle(obj,attr))*100);
		}
		else
		{
			cur =parseInt(getStyle(obj,attr));
		}

		var speed = (iTarget-cur)/6;
		speed = speed>0?Math.ceil(speed):Math.floor(speed);

		if (cur==iTarget)
		{
			clearInterval(obj.timer);
		}
		else
		{
			if(attr=='opacity')
			{
				//做浏览器兼容
				obj.style.filter = 'alpha(opacity:'+(cur+speed)+')';
				obj.style.opacity = (cur+speed)/100;
			}
			else
			{
			obj.style[attr] = cur+speed+'px';
			}
		}
	},30);
};
·  仿FLASH的图片轮换播放器

外部封装任意值运动框架move.js

//取非行间样式封装函数
function getStyle(obj,name)
{
	if(obj.currentStyle)
	{
		//只兼容IE
		return obj.currentStyle[name];
	}
	else
	{
		//不兼容IE,其他的可以
		return getComputedStyle(obj,false)[name];
	}
};

//传入三个参数,实现一个运动框架操作多个div不同的属性
function startMove(obj,attr,iTarget)
{
	clearInterval(obj.timer);
	obj.timer = setInterval(function(){
		
		//简化代码,用变量存储取到的非行间样式,并且把他变成整数
		var cur = 0;
		if(attr=='opacity')
		{
			//对取出的opacity转化成小数然后乘以100然后四舍五入
			cur = Math.round(parseFloat(getStyle(obj,attr))*100);
		}
		else
		{
			cur =parseInt(getStyle(obj,attr));
		}

		var speed = (iTarget-cur)/6;
		speed = speed>0?Math.ceil(speed):Math.floor(speed);

		if (cur==iTarget)
		{
			clearInterval(obj.timer);
		}
		else
		{
			if(attr=='opacity')
			{
				//做浏览器兼容
				obj.style.filter = 'alpha(opacity:'+(cur+speed)+')';
				obj.style.opacity = (cur+speed)/100;
			}
			else
			{
			obj.style[attr] = cur+speed+'px';
			}
		}
	},30);
};

JS代码

<script src="move.js"></script>
<script>

//灵活查找className封装成函数
function getByClass(oParent,sClass)
{
	var aEle = oParent.getElementsByTagName('*');
	var aResult = [];
	for (var i=0;i<aEle.length;i++)
	{
		if(aEle[i].className==sClass)
		{
			aResult.push(aEle[i]);
		}
	}
	return aResult;
};

window.οnlοad=function ()
{
	var oDiv=document.getElementById('playimages');
	var oBtnPrev=getByClass(oDiv,'prev')[0];
	var oBtnNext=getByClass(oDiv,'next')[0];
	var MarkLeft=getByClass(oDiv,'mark_left')[0];
	var MarkRight=getByClass(oDiv,'mark_right')[0];

	var oDivSmall=getByClass(oDiv,'small_pic')[0];
	var oUlSmall=oDivSmall.getElementsByTagName('ul')[0];
	var aLiSmall=oDivSmall.getElementsByTagName('li');

	var oUlBig = getByClass(oDiv,'big_pic')[0];
	var aLiBig = oUlBig.getElementsByTagName('li');

	//定义当前大图的层级
	var nowZIndex=2;
	
	//定义当前
	var now=0;

	//小图的父亲ul的宽等于小图li的个数乘以任意一个小图li的宽
	oUlSmall.style.width = aLiSmall.length*aLiSmall[0].offsetWidth+'px';

	//左右按钮隐藏显示
	oBtnPrev.οnmοuseοver=MarkLeft.οnmοuseοver=function ()
	{
		startMove(oBtnPrev,'opacity',100)
	};
	oBtnPrev.οnmοuseοut=MarkLeft.οnmοuseοut=function ()
	{
		startMove(oBtnPrev,'opacity',0)
	};
	oBtnNext.οnmοuseοver=MarkRight.οnmοuseοver=function ()
	{
		startMove(oBtnNext,'opacity',100)
	};
	oBtnNext.οnmοuseοut=MarkRight.οnmοuseοut=function ()
	{
		startMove(oBtnNext,'opacity',0)
	};
	
	//大图切换
	for (var i=0;i<aLiSmall.length;i++)
	{
		//给小图定义序号方便选出来
		aLiSmall[i].index=i
		aLiSmall[i].οnclick=function ()
		{
			//如果当前的序号就是now,就不执行下面的语句,就不会点当前会有动画
			if(this.index==now)return;
			now = this.index;

			//调用切换函数
			tab();
		};
		
		//鼠标移入移出小图透明度改变
		aLiSmall[i].οnmοuseοver=function ()
		{
			startMove(this,'opacity',100);
		};
		aLiSmall[i].οnmοuseοut=function ()
		{
			//鼠标移出的时候如果移出的小图不等于now才执行透明度变成60
			if(this.index!=now)
			{
			startMove(this,'opacity',60);
			}
		};
	}

	//定义函数切换的功能
	function tab()
		{
			//点击小图之后对应的序号大图的层级等于当前层级加一,大图就会显示出来
			aLiBig[now].style.zIndex=nowZIndex++;

			//先把所有的小图都设置成透明度60,再把当前的小图透明度设置100
			for(var i=0;i<aLiSmall.length;i++)
			{
				startMove(aLiSmall[i],'opacity',60);
			}
			startMove(aLiSmall[now],'opacity',100);
			
			//先把大图的高变成0,再用定时器把他变成原来的高,实现动画效果
			aLiBig[now].style.height = 0;
			startMove(aLiBig[now],'height',320);

			//如果当前是小图第一个,让父亲ul的左边距等于0,这样前面就不会空一个li
			if(now==0)
			{
				startMove(oUlSmall,'left',0);
			}
			//如果当前是小图的最后一个,就和倒数第二个移动的left相同,这样ul位置就不会变,后面就不会空一个li
			else if(now==aLiSmall.length-1)
			{
				startMove(oUlSmall,'left',-(now-2)*aLiSmall[0].offsetWidth)
			}
			//不是第一个也不是最后一个,左边距就移动(now-1)乘以小图的宽度
			else
			{
				startMove(oUlSmall,'left',-(now-1)*aLiSmall[0].offsetWidth)
			}
		};
	
	//左右按钮点击切换
	oBtnPrev.οnclick=function ()
	{
		now--;
		if(now==-1)
		{
			now=aLiSmall.length-1;
		}
		//调用切换函数
		tab();
	};
	oBtnNext.οnclick=function ()
	{
		now++;
		if(now==aLiSmall.length)
		{
			now=0;
		}
		//调用切换的函数
		tab();
	};

	
	
	// 鼠标进入/移出 ,div自动停止/播放
	var timer = setInterval(oBtnNext.onclick,7000);
	oDiv.onmouseover = function ()
	{
		clearInterval(timer);
	};
	oDiv.onmouseout = function ()
	{
		timer = setInterval(oBtnNext.onclick,7000);
	};

};
</script>
笔记:

·多物体运动框架
1.多个div,鼠标移入变宽:
加入边框会出现BUG
(1).参数的传递:物体,目标 
(2).使用单个定时器会出现问题不能同时运动,使用div[i].index的序号思想,给每个div加一个定时器div[i].timer
2.多个div淡入淡出:
(1).多物体框架所有东西不能公用,公用一般会出问题,比如alpha存放透明度
(2).把alpha放进属性,div[i].alpha


·任意值运动框架
1.变宽变高
(1).offsetWidth的Bug:加入边框会出问题
currentStyle getComputedStyle 取非行间样式
(2).传三个参数,一个运动框架控制多个div(任意值的运动框架)
(3).Math.round()四舍五入
(4).封装opacity小数的问题


·仿flash图片展示
(1)灵活查找className封装成函数
(2)大图层级问题定义nowZIndex
(3)定义当前的图片now
(4)函数封装,灵活的调用。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值