首页 > 代码库 > 弹性菜单 加了 透视效果 运动 小案例

弹性菜单 加了 透视效果 运动 小案例

/**弹性菜单 加了透视效果,类似滚动歌词的效果

*运动过程中,背景色和颜色都会改变,实现原理见 滚动歌词篇
* 小bug 当设置字体为 微软雅黑时,运动过程中菜单中的字体会有小抖动,修复方法,left值不能直接赋值,先存起来**/

  1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"  2 "http://www.w3.org/TR/html4/strict.dtd">  3   4 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">  5     <head>  6         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  7         <title>7.弹性菜单 + 透视效果 </title>  8         <meta name="author" content="Administrator" />  9         <!-- Date: 2014-12-13 --> 10         <style> 11             *{margin:0;padding:0;font-size:13px;font-family:microsoft yahei;text-align:center} 12             ul{margin:40px auto;position:relative;width:816px;} 13             li{list-style:none;float:left;width:100px;height:30px;text-align:center;line-height:30px;margin-right:5px;} 14             li.box{background:#DE4465;} 15             #mask{position:absolute;background:#2272BD; top:0; overflow:hidden} 16             #mask #ul2{width:816px; position: absolute;color:#fff;margin:0 auto;} 17               18         </style> 19         <script> 20         /**弹性菜单的目标点的获得: 21          * 目标点不是确定的,其实就是当前li的位置 22          * 小bug 当设置字体为 微软雅黑时,运动过程中菜单中的字体会有小抖动,修复方法,left值不能直接赋值,先存起来**/ 23             window.onload=function(){ 24                 var oUl=document.getElementById(menu); 25                 var oUl2=document.getElementById(ul2); 26                 var aLi=getByClassName(oUl,li,box); 27                 var oMask=document.getElementById(mask); 28                   29                 var timer=null; 30                 var timer2=null; 31                 var iSpeed=0; 32                 var left=0; 33                  34                 document.title = oMask.offsetLeft + - + aLi[0].offsetLeft; 35                   36                 for(var i=0;i<aLi.length;i++){ 37                       38                     aLi[i].onmouseover=function(){ 39                          clearInterval( timer2 );//清除timer2,让oMask不回到0 40                           bonce(this.offsetLeft);   41                      } 42                       43                      //当oMask运动到当前li上的时候,鼠标已经离开了li了 44                      aLi[i].onmouseout=function(){ 45                          timer2=setTimeout(function(){//加一个延时定时器,让 oMask 不立即回到0 46                              bonce( aLi[0].offsetLeft ) 47                          },100) 48                      } 49                 } 50  51               //在0 - 100 毫秒内,当鼠标在oMask上面的时候,关闭 延时定时器,那么oMask就不会回到0了 52                 oMask.onmouseover=function(){ 53                     clearInterval( timer2 ) 54                 }  55                  56                 //当鼠标离开oMask后,再让oMask回到0 57                 oMask.onmouseout=function(){ 58                     timer2=setTimeout(function(){//加一个延时定时器,让 oMask 不立即回到0 59                          bonce( aLi[0].offsetLeft ); 60                      },100) 61                 } 62                  63                 function bonce(iTarget){ 64                   65                  clearInterval(timer); 66                  timer=setInterval(function(){ 67                      iSpeed += (iTarget - oMask.offsetLeft)/6; 68                      iSpeed *= 0.75; 69                      if( Math.abs( iSpeed ) <= 1 && Math.abs( iTarget - oMask.offsetLeft ) <= 1 ){ 70                          clearInterval(timer); 71                          oMask.style.left = iTarget +px; 72                          oUl2.style.left = -iTarget +px; 73                          iSpeed = 0; 74                      }else{ 75                          left=oMask.offsetLeft + iSpeed; //运动过程中菜单中的字体会有小抖动,修复方法,left值不能直接赋值 76                          oMask.style.left = left +px; 77                          oUl2.style.left = -left + px; 78                          document.title=obj.offsetLeft+|+iTarget+|speed=+iSpeed; 79                      } 80                  },30) 81             } 82             } 83        84              85             /**通过class来获取元素**/ 86             function getByClassName(oParent,tagName,className){ 87                     var arr=[]; 88                     var als=oParent.getElementsByTagName(tagName); 89                     for(var i=0;i<als.length;i++){ 90                         var a1=als[i].className.split( ); 91                         for(var j=0;j<a1.length;j++){ 92                             if(a1[j]==className){ 93                                 arr.push(als[i]); 94                                 break; 95                             }  96                         }     97                     } 98                     return arr 99             }    100         </script>101     </head>102     <body>103         <ul id="menu">104             <li id="mask"><!--mask 相当于滚动歌词的div2-->105                 <ul id="ul2"><!--ul 相当于滚动歌词的div2的span-->106                     <li>首页</li>107                     <li>学员</li>108                     <li>课程</li>109                     <li>关于</li>110                     <li>留言</li>111                     <li>论坛</li>  112                 </ul>113             </li>114             <li class="box">首页</li>115             <li class="box">学员</li>116             <li class="box">课程</li>117             <li class="box">关于</li>118             <li class="box">留言</li>119             <li class="box">论坛</li>120         </ul>121     </body>122 </html>

 

弹性菜单 加了 透视效果 运动 小案例