[聚合文章] 【JavaScript从入门到精通】第十五课

JavaScript 2017-11-26 18 阅读

第十五课 JS运动基础

这节课开始我们来讲解JS的运动。在前面关于定时器的内容里,我们已经对JS运动有了一定的了解,接下来几节课我们将慢慢深入,逐渐解析JS运动的知识和原理。

运动基础

我们列举一个我们已经写过的最简单的例子:

function startMove(){<br />    var oDiv=document.getElementById('div1');<br />    setInterval(function(){<br />      oDiv.style.left=oDiv.offsetLeft+10+'px';<br />    },30);<br />  }

现在我们希望这个运动可以停下来,因此我们加入以下判断:当div1的offsetLeft等于300时,我们将定时器关掉。

function startMove(){<br />    var oDiv=document.getElementById('div1');<br />    timer=setInterval(function(){<br />      if(oDiv.offsetLeft==300)<br />      {<br />        clearInterval(timer);<br />      }<br />      oDiv.style.left=oDiv.offsetLeft+10+'px';<br />    },30);<br />}

效果如下:

这里我们可以用一个变量储存定时器的时间,通过修改变量的值,可以改变div块的运行速度,但修改变量的值(比如修改为7),我们会发现div块有可能不会在我们规定的位置停下,原因是我们判断关闭定时器的条件是oDiv.offsetLeft==300,但有些数值并不能整除300,因此不会判断定时器关闭。所以这里,我们将条件改为

oDiv.offsetLeft>=300,就可以解决这个问题。

运动停止后我们尝试多次点击开始运动按钮,可以发现每点击一次按钮,div块都会前进一步,这是因为每次点击都会执行一遍定时器里的函数,而关闭定时器是从下一次开始执行的,当前函数还会完整执行一次。为了避免这种情况,我们将运动的代码也加入判断:当oDiv.offsetLeft>=300时,关闭定时器,<300时执行运动效果。

function startMove(){<br />    var oDiv=document.getElementById('div1');<br />    timer=setInterval(function(){<br />      if(oDiv.offsetLeft==300)<br />      {<br />        clearInterval(timer);<br />      }<br />      else {<br />        oDiv.style.left=oDiv.offsetLeft+10+'px';<br />      }<br />    },30);<br />}

当物体还在运动时,我们如果点击按钮,会发现,随着点击次数的增加,div块的运动速度会越来越快。试想,当我们每点击一次按钮,就会开一个定时器,随着点击次数的增多同时打开的定时器也会增加并且效果叠加,自然速度会变快。因此,我们有必要保证同一时刻只有一个定时器在工作。达成这个目的非常简单,在定时器运行之前,我们将之前所有定时器关掉即可。

function startMove(){<br />    var oDiv=document.getElementById('div1');<br />    clearInterval(timer);<br />    timer=setInterval(function(){<br />      if(oDiv.offsetLeft==300)<br />      {<br />        clearInterval(timer);<br />      }<br />      else {<br />        oDiv.style.left=oDiv.offsetLeft+10+'px';<br />      }<br />    },30);    <br />}

现在,我们就拥有了一套比较完整的运动程序,在我们以后设计运动的时候,都要考虑到这几个可能会出现bug的因素:

  • 不会停止
  • 速度取某些值会无法停止
  • 到达位置后再点击还会运动
  • 重复点击速度加快

运动框架及应用之侧边栏

我们将刚才那一套完整的运动程序成为运动框架,使用运动框架的流程基本上可以搞定大部分的运动,在后面的学习中我们会不断地完善运动框架。在运动框架中,主要遵循这么两个原则:

  • 在开始运动时,关闭已有定时器(避免定时器同时工作)
  • 把运动和停止隔开(if/else)(后者到达终点以后执行,前者到达终点前执行)

在有了一个简单的运动框架后,我们就可以做一个小例子了。这里我们试着写一个在网页上随处可见的例子——侧边栏。其具体功能为,当我们将鼠标移入侧边栏的提示时侧边栏逐渐出现,鼠标移出时侧边栏逐渐消失。

我们依旧是从布局开始分析,我们在网页中放入一个div块并在里面放入一个span标签,并添加文字提示内容。css布局如下:

#div1 {width:150px; height:200px; background:green; position:absolute;}<br />#div1 span {position:absolute; width:20px; height:60px; line-height:20px; background:blue; right:-20px; top:70px;}

为了让这个侧框动起来,我们需要用到定时器。在一开始的时候,这个div应该是在左侧隐藏起来的,因此还需要在css里添加其left值将其隐藏(-150px)。接下来运用我们前面的运动框架,鼠标移入时,使div块向右运动,鼠标移出时,使得div块向左运动(可以通过参数的形式将这两个函数合并):

window.onload=function ()
{
	var oDiv=document.getElementById('div1');
	oDiv.onmouseover=function ()
	{
		startMove(0);
	};
	oDiv.onmouseout=function ()
	{
		startMove(-150);
	};
};
var timer=null;
function startMove(iTarget)
{
	var oDiv=document.getElementById('div1');
	clearInterval(timer);
	timer=setInterval(function (){
		var speed=0;
		if(oDiv.offsetLeft>iTarget)
		{
			speed=-10;
		}
		else
		{
			speed=10;
		}
		if(oDiv.offsetLeft==iTarget)
		{
			clearInterval(timer);
		}
		else
		{
			oDiv.style.left=oDiv.offsetLeft+speed+'px';
		}
	}, 30);
}

效果如下:

运动框架及应用之淡入淡出

淡入淡出也是网页的常见功能,我们希望在鼠标移入时,图片变得清晰,鼠标移出时,图片变得透明。大家应该都知道,在css里,控制透明度使用的是filter属性(IE)以及opacity属性(chrome)。使用透明度属性配合运动框架,就可以实现我们想要的淡入淡出效果了。

<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<style>
#div1 {width:200px; height:200px; background:red; filter:alpha(opacity:30); opacity:0.3;}
</style>
<script>
window.onload=function ()
{
	var oDiv=document.getElementById('div1');
	oDiv.onmouseover=function ()
	{
		startMove(100);
	};
	oDiv.onmouseout=function ()
	{
		startMove(30);
	};
};
var alpha=30;
var timer=null;
function startMove(iTarget)
{
	var oDiv=document.getElementById('div1');
	clearInterval(timer);
	timer=setInterval(function (){
		var speed=0;
		if(alpha<iTarget)
		{
			speed=10;
		}
		else
		{
			speed=-10;
		}
		if(alpha==iTarget)
		{
			clearInterval(timer);
		}
		else
		{
			alpha+=speed;
			oDiv.style.filter='alpha(opacity:'+alpha+')';
			oDiv.style.opacity=alpha/100;
		}
	}, 30);
}
</script>
</head>
<body>
<div id="div1"></div>
</body>
</html>

效果如下:

其中,我们用alpha变量储存透明度的值,并通过判断alpha的值来决定是关闭定时器还是执行运动,实际上图片透明度的变化是由alpha值的变化而产生。

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。