老师,案例中原来的代码有点问题

老师,案例中原来的代码有点问题

点击旁边导航条中其中一个li的时候页面拉动到对应的位置但是li的样式没有加进去,我让点击之后页面拉动的值加1,使其拉动的位置大一些,点击之后样式就有了。应该是点击拉动的offsetTop的值没有进到所在楼层的offsetTop值的区间。

https://img1.sycdn.imooc.com//climg/617e014b09ef9ef407500171.jpg

<!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>
        *{
            padding: 0;
            margin: 0;
        }
        .content-part{
            width: 1000px;
            margin: 0 auto;
            margin-bottom: 30px;
            background-color: #777;
            color: aliceblue;
            font-size: 26px;
        }
        nav.floornav{
            position: fixed;
            top: 50%;
            margin-top: -60px;
            right: 30px;
            width: 80px;
            height: 115px;
            background-color: yellow;
            padding-top: 5px;
        }
        ul{
            list-style: none;
            margin: 0 auto;
        }
        ul li{
            width: 80px;
            text-align: center;
            color: #000;
        }
        .floornav ul li.current{
            background-color: purple;
            color: white;
        }
    </style>
</head>
<body>
    <nav class="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: 500px;" data-n="科技">
        科技栏目
    </section>
    <section class="content-part" style="height: 400px;" data-n="体育">
        体育栏目
    </section>
    <section class="content-part" style="height: 450px;" data-n="新闻">
        新闻栏目
    </section>
    <section class="content-part" style="height: 600px;" data-n="娱乐">
        娱乐栏目
    </section>
    <section class="content-part" style="height: 500px;" data-n="视频">
        视频栏目
    </section>
    <script>
        var list = document.getElementById('list');
        var contentParts = document.querySelectorAll('.content-part');
        var lis = document.querySelectorAll("#list li");
        console.log(lis);
        list.onclick=function(e){
            if(e.target.tagName.toLowerCase()=='li'){
                var n = e.target.getAttribute("data-n");
                var contentPart = document.querySelector("section[data-n="+n+"]");
                document.documentElement.scrollTop = contentPart.offsetTop+1;
            }
        }

        // 遍历所有的contentPart,将他们的净位置推入数组
        var offsetTopArr = [];
        for(var i = 0; i<contentParts.length ; i++){
            offsetTopArr.push(contentParts[i].offsetTop);
        }
        offsetTopArr.push(Infinity);
        console.log(typeof offsetTopArr[1])

        // 当前所在楼层
        var nowfloor = -1;

        // 窗口的卷动
        window.onscroll=function(){
            // 得到当前窗口的卷动值
            var scrollTop = document.documentElement.scrollTop;

            // 遍历offsetTop数组,判断scrollTop的值位于哪两个楼层之间
            for(var i=0;i<offsetTopArr.length;i++){
                if(scrollTop>=offsetTopArr[i]&&scrollTop<=offsetTopArr[i+1]){
                    break;
                }
            }
            // 退出循环的时候i是几就表示当前楼层是几
            // 如果当前所在的楼层不是i,表示换楼了
            if(nowfloor!=i){
                console.log(i);
                nowfloor=i;
                for(var j = 0 ; j<lis.length ; j++){
                    if(j==i){
                        lis[j].className = "current";
                    }else{
                        lis[j].className = "";
                    }
                }
            }
        }
    </script>
</body>
</html>


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

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

1回答
好帮手慕慕子 2021-10-31 11:08:26

同学你好,粘贴的代码,判断scrollTop的值位于哪两个楼层之间的条件多写了一个等号,导致需要将offsetTop值加一才可以实现效果。

建议修改:去掉判断条件中的等号,就不需要加一了。示例:

https://img1.sycdn.imooc.com//climg/617e089f09d1ac0f09350726.jpg

祝学习愉快~

  • 提问者 dawn_eve #1

    为什么我改了之后还是有几个li项有问题,点击样式没上去,滚动条再往下滑点样式才上去

    2021-10-31 11:41:36
  • 提问者 dawn_eve #2

    用Chrome浏览器和火狐浏览器试了,两个浏览器有问题的li不一样的

    2021-10-31 11:43:39
  • 好帮手慕慕子 回复 提问者 dawn_eve #3

    同学你好,老师这边分别在Chrome和Firefox浏览器中,测试修改后的代码,效果实现是对的呀,同学可以查看下避坑指南,https://class.imooc.com/lesson/1965#mid=46715 查看下页面是否存在缩放等问题,调整后再测试下。

    如果还有问题,可以将你修改后的代码粘贴过来,图文结合详细描述下具体问题,便于帮助同学准确的定位与解决问题。

    祝学习愉快~

    2021-10-31 11:54:56
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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