Javascript特效:导航栏楼层效果

本文介绍了一种使用JavaScript实现的楼层导航与页面内容互动效果。通过监听滚动事件和点击事件,动态更新导航条的高亮状态,同时平滑滚动到指定楼层。代码中详细展示了如何获取元素位置、设置样式以及实现平滑滚动。

知识点

  1. 多个事件有冲突的时候,需要设置flag判断是什么事件,进而进行后续操作。
  2. 楼层效果就是判断scrollTop和offsetTop的关系
  3. 引入工具库工具库

运行效果

导航与界面实现互动
在这里插入图片描述
在这里插入图片描述

代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{margin: 0;padding: 0;list-style: none;border:0;}
        html, body, ul{width: 100%;height: 100%;}
        #ul li{
            width: 100%;
            height: 100%;
            text-align: center;
            font-size: 30px;
            /*background-color: red;*/
            color: #fff;
        }

        #ol{
            width: 80px;
            background-color: #ccc;
            position: fixed;
            left: 50px;
            top: 200px;
            border: 1px solid #fff;
        }

        #ol li{
            text-align: center;
            line-height: 30px;
            border-bottom: 1px solid #fff;
            color: #fff;
            cursor: pointer;
        }

        #ol li.current{
            background-color: orangered;
        }
    </style>
</head>
<body>
   <!--导航-->
   <ol id="ol">
       <li class="current">1</li>
       <li>2</li>
       <li>3</li>
       <li>4</li>
       <li>5</li>
   </ol>
   <!--楼层-->
   <ul id="ul">
       <li>1层内容</li>
       <li>2层内容</li>
       <li>3层内容</li>
       <li>4层内容</li>
       <li>5层内容</li>
   </ul>

<script src="../../00MyTools/MyTools.js"></script>
<script>
    window.addEventListener('load', function (ev) {
         // 1. 获取标签
        var ol = myTool.$('ol'), ul = myTool.$('ul');
        var ulLis = ul.children;
        var olLis = ol.children;

        // 是否是点击产生的滚动
        var isClick = false;

        // 2. 上色
        var colorArr = ['red', 'green', 'blue', 'purple', 'yellow'];
        for (var i = 0; i < colorArr.length; i++) {
            ulLis[i].style.backgroundColor = colorArr[i];
        }

        // 3. 监听导航点击
        for (var j = 0; j < olLis.length; j++) {
            var olLi = olLis[j];
            (function (index) {
                olLi.addEventListener('click', function () {
                    isClick = true;
                    for (var i = 0; i < olLis.length; i++) {
                        olLis[i].className = '';
                    }
                    this.className = 'current';
                    // document.documentElement.scrollTop = index * myTool.client().height;

                    myTool.slowMoving(document.documentElement, {'scrollTop': index * myTool.client().height}, function () {
                        isClick = false;
                    });
                });
            })(j)
        }

        // 4. 监听滚动
        var roll = 0;
        window.addEventListener('scroll', function (ev1) {
            if(!isClick){
                // 4.1 获取头部滚动偏移的高度
                roll = Math.ceil(Number(myTool.scroll().top));

                // 4.2 遍历
                for (var i = 0; i < ulLis.length; i++) {
                    // 4.3 判断
                    if(roll >= ulLis[i].offsetTop){
                        for (var j = 0; j < olLis.length; j++) {
                            olLis[j].className = '';
                        }
                        olLis[i].className = 'current';
                    }
                }
            }
        })
    });
</script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaiSarH

如果觉得文章不错,可以支持下~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值