JS之筋斗云案例

需求1:鼠标放到哪个li上面,span对应移动到该li上,移开后,回到原位置
需求2:鼠标点击哪个li记录该li标签,移开的时候span回到该记录的li标签上

注意点:记录标签要用到计数器,筋斗云运动的时候,要用到缓动动画

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
    <title>筋斗云案例</title>
<style type="text/css">
*{
    padding:0;
    margin: 0;
}
body{
    background: #464545;
}
ul{
    list-style:none;
    position: absolute;
}
li{
    float: left;
     85px;
    line-height: 40px;
    text-align: center;
    padding-right: 10px;

}
.box{
     800px;
    height: 40px;
    background: #fff url("../images/wifi.png") right center no-repeat;
    margin: 200px auto;
    border-radius: 10px;
    position: relative;
}
span{
     85px;
    height: 40px;
    background: url("../images/cloud.gif") no-repeat;
    position: absolute;/*要移动的话,就必须定位*/
    left: 0px;
}
</style>
</head>
<body>
<div class="box">
<span></span>
<ul>
<li>首页新闻</li>
<li>活动策划</li>
<li>企业文化</li>
<li>招聘信息</li>
<li>公司简介</li>
<li>上海校区</li>
<li>广东校区</li>
<li>山东校区</li>
</ul>

</div>
<script type="text/javascript">
window.onload=function(){
    //需求1:鼠标放到哪个li上面,span对应移动到该li上,移开后,回到原位置
    //需求2:鼠标点击哪个li记录该li标签,移开的时候span回到该记录的li标签上
    //步骤:
    //1.获取数据源和相关元素
    //2.绑定事件’
    //3.书写驱动程序
    //让计数器记录li标签
    
    var liArr = document.getElementsByTagName("li");
    var liWidth = liArr[0].offsetWidth;
    var span = document.getElementsByTagName("span")[0];
        //for循环绑定事件
        //需求1
    for (var i = 0; i < liArr.length; i++) {
        //自定义属性,然后绑定index属性为索引值
        liArr[i].index = i ;
        //定义一个计数器
         var count = 0;
        //鼠标移入的时候,span进入
        liArr[i].onmouseover = function(){
            //让span运动到该li的索引值的位置
            //图片运动需要用到封装的方法
            animate(span,this.index*liWidth);
        }
        //鼠标移开的时候,span恢复原位
        liArr[i].onmouseout = function(){
            animate(span,count*liWidth);
        }
        //点击事件,记录功能
        liArr[i].onclick = function(){
            //需要一个计数器,每次点击以后把所有值记录下来
            //因为onmouseout事件要用到这个计数器,所以应该是一个全局变量
            count = this.index;
            animate(span,count*liWidth);
        }
    }

    function animate(ele,target){
    //要用定时器,先清定时器
    clearInterval(ele.timer);
    ele.timer=setInterval(function(){
    //缓动动画
    //步长=(目标位置-自身位置)的十分之一
    //因为offset本身就带有四舍五入的功能,所以值会有误差
    //   解决方案:最后10px,要1px 1px的往前移动,这样就能达到指定位置
    var steep = (target - ele.offsetLeft)/10;
    // steep = Math.ceil(steep);//将步长向上取整,这样步长就不会是小数点的值了
    steep = target>ele.offsetLeft?Math.ceil(steep):Math.floor(steep);
    //盒子未来的位置=盒子当前位置+步长
    ele.style.left = ele.offsetLeft + steep +"px";
    //跳出条件:目标位置-当前位置的绝对值,小于步长
    if (Math.abs(target-ele.offsetLeft)<Math.abs(steep)) {
        clearInterval(ele.timer);
                               }
        },15);
    }

}
    


</script>
</body>
</html>
原文地址:https://www.cnblogs.com/creazybeauty/p/8135550.html