运动---第七课时

弹性运动----弹性运动不同于匀速运动,元素运动的速度先快后慢,后者是先慢后快,而且在运动的过程中有一个权重(类似于重力加速度),看上去就像真实的自由落体运动一样。下面看一下加速运动和减速运动:加速运动顾名思义就是速度不断增加,具体到这里就是iSpeed++,每一次都加1,实现累加。累减的过程刚好相反,假设变量iSpeed的初始值为20,然后速度递减iSpeed--,也就是累减。加速运动和减速运动的结合体就构成了弹性运动。

加速运动

 1 <script>

 2 var iSpeed=0;

 4 function startMove()

 5 {

 6     var oDiv=document.getElementById('div1');

 8     setInterval(function (){

 9         iSpeed++;

11         oDiv.style.left=oDiv.offsetLeft+iSpeed+'px';

12     }, 30);

13 }

14 </script>

减速运动:当元素的速度减到为0时,速度继续减小,然后变为负值,会往反方向运动。这个还蛮有意思的。

 1 <script>

 2 var iSpeed=20;

 3 function startMove()

 4 {

 5     var oDiv=document.getElementById('div1');

 7     setInterval(function (){

 8         iSpeed--;

 9         oDiv.style.left=oDiv.offsetLeft+iSpeed+'px';

10     }, 30);

11 }

12 </script>

 简单的弹性运动:当点击按钮的时候,元素左右摆动,但是因为没有加权,所以运动起来弹性似乎没有。速度iSpeed++的写法有很多种,iSpeed++其实就是iSpeed=ispeed+1;为了改进速度的加权,所以把iSpeed++改为iSpeed+=(300-oDiv.offsetLeft)/50;让速度有一个变化的趋势

 1 <style>

 2     #div1{width:100px;height:100px;background:#000;}

 3 </style>

 4 <script>

 5     var iSpeed=0;

 6 

 7     function startMove()

 8     {

 9         var oDiv=document.getElementById('div1');//不知道为神马出不来效果,把点击事件给按钮也没有反应

10         var oBtn=document.getElementById('btn1');

11         

12         oBtn.onclick=setInterval(function (){

13             if(oDiv.offsetLeft<300)

14             {

15                 iSpeed++;//就是累加1

16                 //iSpeed+=(300-oDiv.offsetLeft)/50;

17             }

18             else

19             {

20                 iSpeed--;//就是累减1

21                 //iSpeed-=(oDiv.offsetLeft-300)/50;

22             }

23             //iSpeed+=(300-oDiv.offsetLeft)/50;其实也就是这一句话,加速和减速化简后式子相等

24             oDiv.style.left=oDiv.offsetLeft+iSpeed+'px';

25         }, 30);

26     }

27 </script>

28 </head>

29 

30 <body>

31 <input type="button" value="开始运动" id="btn1"/>

32 <div id="div1"></div>

33 <div style="position:absolute;left:300px;top:0;background:#333;width:1px;height:500px;"> </div>

34 </body>

弹性+摩擦:弹性就是改变元素的Left值,摩擦就是让元素的速度越来越慢,直到停止。当iSpeed累乘以一个小于1的数的时候,速度就开始越来越慢了,知道元素停止运动。把累乘和累加结合起来就实现了元素的弹性运动,并且在需要的时候停止运动。

 1 <script>

 2 var iSpeed=0;

 3 function startMove()

 4 {

 5     var oDiv=document.getElementById('div1');

 6     setInterval(function (){

 7         iSpeed+=(300-oDiv.offsetLeft)/5;

 8         iSpeed*=0.7;

 9         oDiv.style.left=oDiv.offsetLeft+iSpeed+'px';

10     }, 30);

11 }

12 </script>

滑动的菜单----在结构上多设置了一个li,用来隐藏和显示红色背景,这个li只起到这么一个作用。把它定位到其他li的下面,形成下划线的效果。oBg是li的最后一个,所以获取他就要在长度上减1;同时在做循环的时候,最后一个li不需要添加事件,所以同样是length-1;startMove函数改变oBg的offsetLeft来实现下划线的不同位置。为了避免样式不支持小数点,所以把left值赋值给一个变量,因为变量可以接受小数点,所以就可以避免小数点带来的问题。清楚定时器的条件要满足两个:一是速度在-1到1之间的时候,距离在-1到1的时候。因为倒数第二个li会存在一个像素的误差,所以强制性的设置它的left为目标值,即obj.style.left=iTarget+'px'。这个例子有点伤脑筋,慢慢斟酌:)

 1 <style>

 2 * { padding: 0; margin: 0; }

 3 li { list-style: none; }

 4 

 5 ul { width: 400px; height: 30px; position: relative; margin: 100px auto 0; }

 6 li { float: left; width: 98px; height: 28px; line-height: 28px; border: 1px solid #ccc; text-align: center; z-index: 2; position: relative; cursor: pointer; }

 7 .bg { width: 100px; height: 5px; overflow: hidden; background: red; border: none; position: absolute; top: 24px; left: 0; z-index: 1; }

 8 </style>

 9 <script type="text/javascript">

10 window.onload=function ()

11 {

12     var oUl=document.getElementById('ul1');

13     var aLi=oUl.getElementsByTagName('li');

14     var oBg=aLi[aLi.length-1];

15     var i=0;

16     

17     for(i=0;i<aLi.length-1;i++)

18     {

19         aLi[i].onmouseover=function ()

20         {

21             startMove(oBg, this.offsetLeft);

22         };

23     }

24 };

25 var iSpeed=0;

26 var left=0;

27 

28 function startMove(obj, iTarget)

29 {

30     clearInterval(obj.timer);

31     obj.timer=setInterval(function (){

32         iSpeed+=(iTarget-obj.offsetLeft)/5;

33         iSpeed*=0.7;

34         

35         left+=iSpeed;

36         

37         if(Math.abs(iSpeed)<1 && Math.abs(left-iTarget)<1)

38         {

39             clearInterval(obj.timer);

40             

41             obj.style.left=iTarget+'px';

42             

43             //alert('关了');

44         }

45         else

46         {

47             obj.style.left=left+'px';

48         }

49     }, 30);

50 }

51 </script>

52 </head>

53 <body>

54 <ul id="ul1">

55     <li>首页</li>

56     <li>关于我们</li>

57     <li>产品</li>

58     <li>联系方式</li>

59     <li class="bg"></li>

60 </ul>

61 </body>

效果图

你可能感兴趣的:(运动)