运动---第七课时

弹性运动----弹性运动不同于匀速运动,元素运动的速度先快后慢,后者是先慢后快,而且在运动的过程中有一个权重(类似于重力加速度),看上去就像真实的自由落体运动一样。下面看一下加速运动和减速运动:加速运动顾名思义就是速度不断增加,具体到这里就是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>

效果图

posted @ 2013-06-12 23:54  Paxster  阅读(1054)  评论(1编辑  收藏  举报