高亮显示错误
问题描述:为什么不加1的话用鼠标点击导航条高亮定位错误,offsetTop的值是整数,scrollTop的值却是有很多小数的,导致高亮显示错误。我在第111行加了1
相关代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> *{ margin: 0; padding: 0; } .content-part{ width: 700px; background-color: rgba(0,0,0,.6); margin: 0px auto; margin-bottom: 30px; text-align: center; font-size: 40px; } .part1{ height: 400px; } .part2{ height: 430px; } .part3{ height: 480px; } .part4{ height: 530px; } .part5{ height: 670px; } nav{ width: 60px; height: 150px; background-color: orange; position:fixed; right: 10px; top: 50%; margin-top: -75px; } nav ul{ width: 60px; list-style: none; } nav ul li{ height: 30px; line-height: 30px; text-align: center; cursor: pointer; } nav ul li.cur{ background-color: purple; } </style> </head> <body> <!-- 要使用到绝对定位和data-自定义属性 --> <!-- offsetTop属性,此元素定位祖先元素的垂直距离,祖先元素就是离自己最近的且拥有定位属性的元素 --> <!-- 1、楼层导航 --> <!-- 每个内容区域和导航条是通过data-n属性来建立连接 --> <!-- 2、窗口卷动到哪个位置,导航条对应位置有高光 --> <nav> <ul id="list"> <li data-n="新闻">新闻</li> <li data-n="娱乐">娱乐</li> <li data-n="天气">天气</li> <li data-n="图片">图片</li> <li data-n="视频">视频</li> </ul> </nav> <!-- 每个单独板块 --> <section class="content-part part1" data-n="新闻">新闻</section> <section class="content-part part2" data-n="娱乐">娱乐</section> <section class="content-part part3" data-n="天气">天气</section> <section class="content-part part4" data-n="图片">图片</section> <section class="content-part part5" data-n="视频">视频</section> <script> //获取ul元素 var list=document.getElementById('list'); //获取section元素 var section = document.querySelectorAll('.content-part'); //获取li元素 var liS = document.querySelectorAll('#list li'); //获取每个内容区域距离顶部值,并存入数组 var offsetTopArr = []; for(var i =0;i<section.length;i++){ offsetTopArr.push(section[i].offsetTop); } //给数组的最后一项推入无穷大值,防止楼层出错,因为用户可能从后面往前翻,如果当前滚动到的值为5,就会出错 //li标签也给不了.cur的选择器 offsetTopArr.push(Infinity); console.log(offsetTopArr); var contentPart; //list的事件监听用的是事件委托,采用冒泡阶段 list.onclick=function(e){ //源元素的标签名字是li时 if(e.target.tagName.toLowerCase()=='li'){ //获取非w3c标准的属性名用getAttribute var n =e.target.getAttribute('data-n'); //使用属性选择器来获取带有某个data-n属性的标签,方括号指带有某种属性元素 contentPart=document.querySelector('.content-part[data-n='+n+']'); //用document.documentElement.scrollTop来设置距离页面顶部的位置 //不加1鼠标点击li标签高亮定位错误,(点击楼层3,高亮在楼层2) document.documentElement.scrollTop = contentPart.offsetTop + 1; console.log(document.documentElement.scrollTop); } } var floor = -1; //建立页面滚动事件监听,楼层从0-4 window.onscroll=function(){ var scrollTop =document.documentElement.scrollTop; //for循环offsetTop数组,判断滚动的距离是否介于哪两项之间 for(var i = 0;i<offsetTopArr.length;i++){ if( scrollTop>=offsetTopArr[i] && scrollTop<=offsetTopArr[i+1]){ break; } } //var一个floor变量,意思为当前楼层,防止一直在输出楼层,当当前楼层和滚动到的不一致时,才输出i //记得把当前楼层赋值给floor变量 if(floor != i){ console.log('当前楼层时'+ i +'滚动值' + scrollTop); floor = i; for(var j =0;j<liS.length;j++){ if(i==j){ liS[j].className = 'cur'; }else{ liS[j].className = ''; } } } } </script> </body> </html>
13
收起
正在回答
1回答
同学你好,解答如下:
1、这边测试代码chrome版本是
滚动值不是小数
可能是chrome版本导致的显示小数,建议用Math.round()方法包裹转化一下。
2、代码中加1才能让右侧高亮显示正确
是因为第一楼不需要滚动,也不会进入onscroll事件中,所以第一层导航没有高亮。建议将加1去掉,在第一层导航元素上添加类
3、在滚动的时候,不需要等于下一楼的值,避免导航不准,小于即可
祝学习愉快!
相似问题
登录后可查看更多问答,登录/注册
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星