html 分级切换菜单_仿知乎顶部菜单自动变换效果

cedc8342f51adb2c30588b85128cd5c0.png
HTML部分:
<div id="fix-menu-warp">
  <div id="menu-scroll-div" style="top: 0px;">
    <div id="main-menu">主菜单</div>
    <div id="details-menu">详情菜单</div>
  </div>
</div>;




CSS部分:
#fix-menu-warp {
    position: fixed;
    width: 100%;
    height: 50px;
    z-index: 10000;
    box-shadow: 0 1px 3px rgba(26,26,26,.1);
    overflow: hidden;
}
#menu-scroll-div {
    position: relative;
    margin: 0;
    padding: 0;
    height: 100%;
    width: 100%;
    transition: 0.5s all ease;
}
#main-menu {
    height: 50px;
    width: 100%;
    background-color: brown;
    text-align: center;
    display: block;
    transition: 0.5s all ease;
    line-height: 50px;
    position: relative;
    top: 0;
    margin: 0;
    padding: 0;
}
#details-menu {
    height: 50px;
    width: 100%;
    background-color: pink;
    text-align: center;
    transition: 0.5s all ease;
    display: block;
    line-height: 50px;
    margin: 0;
    padding: 0;
}




JavaScript部分:
function changeTopMenu() {
    var oldScrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;
    var menutimeout;
    return function () {
        var newScrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;
        if (newScrollTop === 0) {
            //如果已经在最上面了却还要滑动,就显示主菜单;
            document.getElementById('menu-scroll-div').style.top = 0;
        } else if (newScrollTop < oldScrollTop) {
            //如果在往上滑,切换到主菜单;
            //切换到主菜单(防抖);
            if (menutimeout) {
                clearTimeout(menutimeout);
                menutimeout = setTimeout(() => {
                    document.getElementById('menu-scroll-div').style.top = 0;
                    oldScrollTop = newScrollTop;
                }, 100)
            } else {
                menutimeout = setTimeout(() => {
                    document.getElementById('menu-scroll-div').style.top = 0;
                    oldScrollTop = newScrollTop;
                }, 100)
            }
        } else if (newScrollTop > oldScrollTop) {
            //如果在往下滑,切换到详情菜单;
            //切换到详情菜单(防抖);
            if (menutimeout) {
                clearTimeout(menutimeout);
                menutimeout = setTimeout(() => {
                    document.getElementById('menu-scroll-div').style.top = -50;
                    oldScrollTop = newScrollTop;
                }, 100)
            } else {
                menutimeout = setTimeout(() => {
                    document.getElementById('menu-scroll-div').style.top = -50;
                    oldScrollTop = newScrollTop;
                }, 100)
            }
        } else {
            //没滑动就不干什么;
            oldScrollTop = newScrollTop;
        }
    }
}

window.onscroll = changeTopMenu();

8562e15a1631f047f0c0f9be0c59fb42.png
顶部菜单默认是这个样子

f910689ff72874eac4e3450db1a48108.png
将网页向下滑动,菜单会自动变成这样,并且有过渡效果

原理:

其实就是两个菜单上下排列,用一个大div包裹起来,大div的高度只有其中一个子菜单那么高,将溢出部分隐藏,这样就看起来只有一个子菜单显示出来。

监听页面的滚动,往上滚就把上面的显示出来,往下滚就把下面的显示出来。

山寨思路:

监听页面的滚动,判断网上滚还是往下滚,然后修改menu-scroll-div的top值来达到切换效果。

修改上面的菜单的margin-top值也可以。

成果:

仿照知乎的顶部导航菜单自动切换效果,增加了防抖功能。

a930986c1c58f1706874cf78a56b16a2.png
效果展示https://www.zhihu.com/video/1186884913671954432
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值