筋斗云案例

<style>

* {

margin: 0;

padding: 0;

}

ul {

list-style: none;

}

body {

background-color: #000;

}

.nav {

width: 800px;

height: 42px;

background: #fff;

margin: 100px auto;

border-radius: 5px;

position: relative;

}

.cloud {

width: 83px;

height: 42px;

position: absolute;

top: 0;

left: 0;

background: url(/1.png) no-repeat;

}

.nav ul {

position: absolute;

top: 0;

left: 0;

}

.nav li {

float: left;

width: 88px;

height: 42px;

line-height: 42px;

text-align: center;

color: #000;

cursor: pointer;

}

</style>

</head>

<body>

<div class="nav" id="nav">

<span class="cloud" id="cloud"></span>

<ul id="box">

<li>首页资讯</li>

<li>周周师资</li>

<li>周周活动策划</li>

<li>企业文化</li>

<li>招聘信息</li>

<li>公司简介</li>

<li>成都校区</li>

<li>南充校区</li>

</ul>

</div>

<script>

var cloud = document.querySelector('#cloud')

var list = document.querySelectorAll('#box li') // list是一个伪数组

// 循环遍历list,但是普通for拿不到li的下标

// Array.from() 可以将类数组对象转换成数组

var arrList = Array.from(list)

console.log(list)

console.log(arrList)

var i = 0 // 默认云的位置在第0个

arrList.forEach((li, index) => {

// forEach每循环一次都是一个函数,每个函数里都有一个自己的index,所以可以直接使用

// var变量或者函数参数之于函数相当于let变量之于块级

li.onmouseenter = function () {

console.log(index)

// 让这朵云运动到当前li的坐标位置

move1(cloud, 'left', this.offsetLeft) // offsetLeft相对于父级元素的坐标

}

li.onclick = function(){

// 这里没有云的移动,这里只是负责记录点击的位置也就是下标

// 记录云所要回到的位置

i = index

}

li.onmouseleave = function (){

// 让cloud回到上一次点击的位置,按照click里面记录的下标来移动

move1(cloud, 'left', arrList[i].offsetLeft)

}

})

move1: function (ele, attr, end, fn) {

// 开启定时器之前把旧的先清除掉

clearInterval(ele.timer)

var start = parseInt(this.getStyle(ele, attr)) // getStyle(ele,attr)获取ele元素的位置

ele.timer = setInterval(function(){

// 计算剩下距离

var distance = parseInt(end) - start

// 计算当前这一步的速度,是剩下距离的十分之一

// speed就是当前这一步要往前走的距离

// 如果运动是负方向,distance小于0,speed也小于0,剩下最后几步负零点几的时候如果向上取整直接就得到0了,就不能运动到终点了

var speed = distance > 0 ? Math.ceil(distance / 10) : Math.floor(distance / 10)

// start得往前加上这一步要走的距离

start += speed

// 把更新之后的start赋值给属性

ele.style[attr] = start + 'px'

// 判断终点

// 由于缓冲运动最后是一像素一像素运动的,所以他一定能刚好达到终点

if(start === end){

clearInterval(ele.timer)

fn && fn()

}

},30)

}

</script>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值