什么是楼梯特效?

什么是楼梯特效?

如果各大网站点击按钮本页面跳转对应的板块的功能就是楼梯效果

UTOOLS1588058562130.png

思路

大家可以看到左侧的按钮和右侧的内容板块是一一对应的,所以我们需要知道右侧每个板块在当前页面的位置在可以通过左侧的楼梯去控制右侧的板块内容的跳转。试想,右侧每一个板块都会距离页面顶端距离,只需要点击左侧按钮让对应位置的楼梯跳转到对应板块的高度位置即可。接下来具体代码实现.

js核心代码
    // 梯子对象
    function Stairs(options) {

        this.options = options;
        this.init();
    }
    Stairs.prototype = {
        constructor: Stairs,
        init: function () {
            // 计算每一个内容元素的高度的数组
            this.content_ele_offset_top_list = [];
            // 获取元素的偏移量
            $(this.options.content_selector).offset(function (index, cords) {
                // 将每一个元素的高度值放入发哦度列表之中
                this.content_ele_offset_top_list.push(cords.top);
                return cords;
            }.bind(this));

            // 计算最小高和最大高
            let _length = this.content_ele_offset_top_list.length;

            this.min_top = this.content_ele_offset_top_list[0];
            this.max_top = this.content_ele_offset_top_list[_length - 1] + $(this.options.content_selector).last().height();
            // 同样我们吧这个最高的值放入数组中之后的计算需要使用
            this.content_ele_offset_top_list.push(this.max_top);
            // 每一次页面刷新的时候需要先计算一下梯子的位置
            // 获得数据
            let scrollTop = $("body, html").scrollTop();
            // 计算下标
            this.calcStairsIndex(scrollTop);
            this.bindEvent();
        },
        bindEvent: function () {
            let $body_html = $("body,html");

            let instance = this;
            // 滚动事件监听
            // 函数节流的变量
            let t = null;
            $(document).scroll(function () {
                if (typeof t === "number") {
                    return false;
                }
                t = setTimeout(() => {
                    t = null;
                    // 获得数据
                    let scrollTop = $body_html.scrollTop();
                    // 计算下标
                    this.calcStairsIndex(scrollTop);
                }, 200)
            }.bind(this));

            // 点击右侧楼梯的我们需要滚动至对应的位置 绑定事件
            $(this.options.stairs_selector).click(function () {
                // 先得到点击事件元素在数组中的下标 通过这个下标找到对应的板块
                let index = $(this).index(instance.options.stairs_selector);
                instance.changeStairsIndex(index);
            })
        },
        calcStairsIndex: function (st) {
            // 如果小于最小的高度和最大的高度我们直接结束下面的函数
            if (st < this.min_top || st > this.max_top) {

                this.index = -1;
                this.changeStairsBtn();
                return false;
            }
            let _list = this.content_ele_offset_top_list;
            // 数据一直在这个范围之内我们就不在重复计算了
            if (st >= _list[this.index] && st < _list[this.index + 1]) {
                return false;
            }
            // 遍历记录滚入的楼梯的下标
            for (let i = 0; i < _list.length; i++) {
                if (st >= _list[i] && st < _list[i + 1]) {
                    this.index = i;
                    break;
                }
            }
            this.changeStairsBtn();
        },
        /**
         * 改变梯子的选中状态
         */
        changeStairsBtn: function () {
            if (this.index === -1) {
                $(this.options.stairs_selector).removeClass("cur");
                return false;
            }
            // 如果不熟index===-1 说明要选中对应下标的楼梯
            $(this.options.stairs_selector).eq(this.index).addClass("cur").siblings().removeClass("cur");
        },
        /**
         * 改变梯子选中的下标的
         * @param {点击的梯子的下标} index 
         */
        changeStairsIndex: function (index) {

            // 通过这个index我们去scroll对应的板块
            $("body,html").scrollTop(this.content_ele_offset_top_list[index]);
            $(document).trigger("scroll");
        }
    }
html+css代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>

        .container {
            width: 900px;
            margin: 200px auto;
            position: relative;
        }
        .floor {
            height: 900px;
            background-color: aqua;
        }
        .f2 {
            background-color: yellowgreen;
        }
        .f3 {
            background-color: teal;
        }
        .f4 {
            background-color: burlywood;
        }
        .stairs {
            position: fixed;
            top: 50%;
            left: 13%;
            width: 60px;
            height: 100px;
            margin-top: -50px;
            border: 1px solid #eeeeee;
            text-align: center;
            cursor: pointer;
        }
        .stairs div {
            padding: 5px 0;
        }
        .stairs .cur{
            color: #ffffff;
            background-color: #f10e30;
            border-radius: 4px;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="floor f1">第一层楼梯</div>
        <div class="floor f2">第二层楼梯</div>
        <div class="floor f3">第三层楼梯</div>
        <div class="floor f4">第四层楼梯</div>
        <div class="stairs">
            <div class="s cur">第一层</div>
            <div class="s">第二层</div>
            <div class="s">第三层</div>
            <div class="s">第四层</div>
        </div>
    </div>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.0/jquery.min.js"></script>
    <script src="./js/Stairs.js"></script>
    <script>
        $(function(){

            new Stairs({
                content_selector : ".floor", // 与楼梯对应的板块盒子
                stairs_selector : ".stairs .s" // 每一个楼梯
            })
        });
    </script>
</body>
</html>

如何使用

首先我们需要引入jQuery代码<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.0/jquery.min.js"></script>,然后引入楼梯核心代码的js文件<script src="./js/Stairs.js"></script>,调用对象

    <script>
        $(function(){

            new Stairs({
                content_selector : ".floor", // 与楼梯对应的板块盒子
                stairs_selector : ".stairs .s" // 每一个楼梯
            })
        });
    </script>
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • “惟有潜离与暗别,彼此甘心后无期。 荣枯事过都成梦,忧喜心忘便是禅。” 但我无法克制自己的...
    虞姬娘娘阅读 2,669评论 0 0
  • 继承作用:代码重用、代码复用单继承子类只能继承一个父类父类可以有多个子类不继承构造方法私有静态子类对象父类对象和子...
    ssttIsme阅读 1,306评论 0 0
  • # Summary of papers in VLN > Created by Binghui Xie [TOC]...
    Freesoul_7a7e阅读 1,414评论 0 0
  • 初始化项目 在一个空文件夹下,shell 中执行 根据提示选择对应选项生成composer.json,也可以选择手...
    sorry510阅读 1,031评论 0 0

友情链接更多精彩内容