我点选楼层跳转,页面跳转对了,但是第一个楼层和第二个楼层高亮一样,都显示第一个楼层高亮,其他的都能对应上,而且用滚动的话就都可以对应上,这是什么问题?

我点选楼层跳转,页面跳转对了,但是第一个楼层和第二个楼层高亮一样,都显示第一个楼层高亮,其他的都能对应上,而且用滚动的话就都可以对应上,这是什么问题?

css部分

<style>

        * {

            margin0;

            padding0;

        }


        body{

            height2000px;

        }


        .content-part {

            width800px;

            margin0 auto;

            margin-bottom30px;

            background-color#bbb;

            font-size64px;

            padding30px;

            text-aligncenter;

        }


        nav {

            width80px;

            height200px;

            background-colororange;

            positionfixed;

            right30px;

            top50%;

            margin-top-100px;

        }


        nav ul {

            list-stylenone;

        }


        nav ul li {

            width80px;

            height40px;

            text-aligncenter;

            line-height40px;

            cursorpointer;

        }


        nav ul li.current {

            background-colorpurple;

            colorwhite;

        }

    </style>




<!-- 楼层导航 -->

    <nav id="floornav">

        <ul id="list">

            <li data-n="新闻" class="current">新闻</li>

            <li data-n="娱乐">娱乐</li>

            <li data-n="科技">科技</li>

            <li data-n="体育">体育</li>

            <li data-n="视频">视频</li>

        </ul>

    </nav>

    <section class="content-part" style="height: 952px;" data-n="新闻">新闻栏目</section>

    <section class="content-part" style="height: 960px;" data-n="娱乐">娱乐栏目</section>

    <section class="content-part" style="height: 930px;" data-n="科技">科技栏目</section>

    <section class="content-part" style="height: 970px;" data-n="体育">体育栏目</section>

    <section class="content-part" style="height: 900px;" data-n="视频">视频栏目</section>

    <script>

        // 利用时间委托添加事件监听

        var list = document.getElementById('list');

        var contentParts = document.querySelectorAll('.content-part');

        var lis = document.querySelectorAll('#list li');

        list.onclick = function (e) {

            if (e.target.tagName.toLowerCase() == 'li') {

                // 利用getAttribute()获取不符合w3c标准的属性值

                var n = e.target.getAttribute('data-n');

                // 可以利用属性选择器(方括号选择器)来寻找带有相同data-n的content-part

                // 变量n为字符串,所以采用字符串拼接,此处字符串共有三部分

                var contentPart = document.querySelector('.content-part[data-n = ' + n + ']');

                // console.log(contentPart.offsetTop);

                document.documentElement.scrollTop = contentPart.offsetTop;

            }

        }

        // 在所有页面加载完成之后,将所有的content-part盒子的offsetTop值推入数组中

        var offsetTopArr = [];

        // 遍历所有的contentParts,将他们的净位置推入数组

        for (var i = 0i < contentParts.lengthi++) {

            offsetTopArr.push(contentParts[i].offsetTop);

        }

        // 为了最后一项方便比较,推入一个无穷大

        offsetTopArr.push(Infinity);

        console.log(offsetTopArr);

        // 定义一个全局变量作为当前楼层号      节流,减小浏览器压力

        var nowFloor = 0;


        // 窗口卷动

        window.onscroll = function () {

            var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;

            // 遍历offsetTopArr数组,看看当前的scroolTop在哪两个楼层之间

            for (var i = 0 ; i < offsetTopArr.length ; i++){

                if (scrollTop >= offsetTopArr[i] && scrollTop < offsetTopArr[i+1]){

                    break;

                }

            }

            console.log(scrollTop)

            // 遍历结束后,i是几就在哪个楼层

            // 如果当前所在楼层不是i,表示换楼了

            if (nowFloor != i){

                console.log(i)

                nowFloor = i ;

                // 设置下标为i的项有current

                for (var j = 0 ; j < lis.length ; j++){

                    // 让全局变量改变为当前楼层号

                    if (j == i){

                        lis[j].className = 'current';

                    } else {

                        lis[j].className = '';

                    }

                }

            }

        }

    </script>




正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕然然 2021-09-26 15:14:08

同学你好,应该是卷动高度scrollTop的精度问题导致的,在老师的电脑上,页面正常显示的话(缩放比为100%),效果是没问题的,如图

https://img1.sycdn.imooc.com//climg/61501b6209e5315c17510525.jpg

如果将页面放大的话(缩放比为110%),就会出现同学所说的问题:因为获取到的scrollTop的精度出现问题,不在正确的范围内,如图

https://img1.sycdn.imooc.com//climg/61501bc6090c23c218180652.jpg

建议:可以给scrollTop加1修正一下,让scrollTop在正确的范围内即可,如图

https://img1.sycdn.imooc.com//climg/61501c7509fcd6ff09400440.jpg

祝学习愉快!

  • 提问者 不一样6781674 #1

    问题解决了,但是为啥+1就好使了呀

    2021-09-26 17:41:25
  • 好帮手慕然然 回复 提问者 不一样6781674 #2

    同学你好,如图所示:卷动高度scrollTop的值与数组offsetTopArr中对应的值相比较,可以看出它们的误差都在1px以内,所以scrollTop+1就可以修正误差

    https://img1.sycdn.imooc.com//climg/615042900982f9e000000000.jpg

    祝学习愉快!

    2021-09-26 17:56:06
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师