JS原生模拟楼层导航

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }
        
        .somecontent {
            width: 1000px;
            height: 1232px;
            margin: 0 auto;
            background-color: #ccc;
        }
        
        .floor {
            width: 1000px;
            margin: 0 auto;
            height: 400px;
            background: yellowgreen;
            margin-bottom: 10px;
        }
        
        .f1 {
            height: 433px;
        }
        
        .f2 {
            height: 352px;
        }
        
        .leftNav {
            position: fixed;
            bottom: 110px;
            left: 10px;
            width: 60px;
        }
        
        .leftNav ul {
            list-style: none;
        }
        
        .leftNav ul li {
            width: 60px;
            height: 60px;
            background-color: #ccc;
        }
        
        .leftNav ul li a {
            display: block;
            width: 60px;
            height: 60px;
            line-height: 60px;
            text-align: center;
            text-decoration: none;
            font-size: 14px;
        }
        
        .leftNav ul li a.number {
            display: block;
        }
        
        .leftNav ul li a.chinese {
            display: none;
            color: white;
        }
        
        .leftNav ul li.cur a.number {
            display: none;
        }
        
        .leftNav ul li.cur a.chinese {
            display: block;
        }
        
        .leftNav ul li.cur {
            background-color: rgb(111, 0, 0);
        }
    </style>
</head>

<body>
    <div class="somecontent"></div>

    <div class="leftNav" id="leftNav">
        <ul>
            <li>
                <a href="javascript:;" class="number">1F</a>
                <a href="javascript:;" class="chinese">百货</a>
            </li>
            <li>
                <a href="javascript:;" class="number">2F</a>
                <a href="javascript:;" class="chinese">男装</a>
            </li>
            <li>
                <a href="javascript:;" class="number">3F</a>
                <a href="javascript:;" class="chinese">女装</a>
            </li>
            <li>
                <a href="javascript:;" class="number">4F</a>
                <a href="javascript:;" class="chinese">裤子</a>
            </li>
            <li>
                <a href="javascript:;" class="number">5F</a>
                <a href="javascript:;" class="chinese">童装</a>
            </li>
            <li>
                <a href="javascript:;" class="number">6F</a>
                <a href="javascript:;" class="chinese">运动</a>
            </li>
            <li>
                <a href="javascript:;" class="number">7F</a>
                <a href="javascript:;" class="chinese">电子</a>
            </li>
        </ul>
    </div>

    <div class="floor f1"></div>
    <div class="floor f2"></div>
    <div class="floor f3"></div>
    <div class="floor f4"></div>
    <div class="floor f5"></div>
    <div class="floor f6"></div>
    <div class="floor f7"></div>
    <div class="somecontent"></div>

    <script>
        // 获取DOM元素
        var leftBtnList = document.getElementById('leftNav').getElementsByTagName('li');
        // 声明楼层数组,楼层高度数组
        var floorArr = [];
        var floorOffsetTopArr = [];
        // 将所有楼层与楼层高度添加进数组
        for (var i = 0; i < document.body.childNodes.length; i++) {
            if (document.body.childNodes[i].nodeType == '1' && document.body.childNodes[i].className.indexOf('floor') != -1) {
                floorArr.push(document.body.childNodes[i]);
                floorOffsetTopArr.push(document.body.childNodes[i].offsetTop);
            }
        }
        // 声明当前楼层,初始没有进入任何楼层
        var nowFlool = NaN;

        // 数组超标给楼层高度数组添加一个假楼层高度
        floorOffsetTopArr.push(floorOffsetTopArr[floorOffsetTopArr.length - 1] + floorArr[floorArr.length - 1].clientHeight);
        // 添加滚动监听
        window.onscroll = function() {
            // 获取当前卷去位置
            var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
            // 判读是否进入当前楼层
            for (var i = 0; i < floorOffsetTopArr.length; i++) {
                if (scrollTop >= floorOffsetTopArr[i] - 200 && scrollTop < floorOffsetTopArr[i + 1] - 200) {
                    // 如果在当前楼层不执行DOM操作
                    if (nowFlool != i) {
                        // 如果是原楼层不存在则不执行DOM操作
                        !isNaN(nowFlool) && (leftBtnList[nowFlool].className = "");
                        nowFlool = i;
                        // 当前楼层添加
                        leftBtnList[nowFlool].className = "cur";
                    }
                    // 如果进入楼层就退出,如果没有退出就是没有在任何楼层
                    break;
                }
            }
            console.log(i);
            // 不在任何楼层 i == floorOffsetTopArr.length
            if (i == floorOffsetTopArr.length) {
                !isNaN(nowFlool) && (leftBtnList[nowFlool].className = "");
                nowFlool = NaN;
            }
        }

        // 给按钮添加监听
        for (var i = 0; i < leftBtnList.length; i++) {
            leftBtnList[i].index = i;
            leftBtnList[i].onclick = function() {
                scrollAnimate(floorOffsetTopArr[this.index], 600)
            }
        }

        // 定义滚动动画
        function scrollAnimate(target, time) {
            var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
            // 定义动画间隔
            var interval = 10;
            // 获取总帧率
            var allFrame = time / interval;
            // 获取总距离
            var distance = target - scrollTop;
            // 定义当前帧率
            var currentFrame = 0;

            // 定时器
            var timer = setInterval(function() {
                // 设置卷曲值
                document.body.scrollTop = document.documentElement.scrollTop = Liear(currentFrame, scrollTop, distance, allFrame);
                currentFrame++;
                if (currentFrame == allFrame) {
                    clearInterval(timer)
                }
            }, interval)
        }

        // 随便定义一个缓动公式
        function Liear(t, b, c, d) {
            return t * c / d + b;
        }
    </script>

</body>

</html>

 

posted on 2020-02-20 10:05  素心~  阅读(549)  评论(0编辑  收藏  举报

导航