You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在max-width:786px断点禁用滚动触发导航并显示菜单?

实现响应式导航菜单的滚动显示/隐藏逻辑

没问题,这个需求完全可以实现,咱们分两步来搞定:先通过CSS处理小屏幕下菜单始终显示的样式,再调整JavaScript逻辑,让滚动触发的功能只在大屏幕下生效。

1. CSS 样式调整

首先修改你的CSS,添加媒体查询,确保在屏幕宽度≤786px时,导航菜单始终显示:

/* 默认状态下隐藏导航 */
nav {
  display: none;
}

/* 滚动时显示导航的类 */
.show {
  display: block;
}

/* 小屏幕断点:始终显示导航 */
@media (max-width: 786px) {
  nav {
    display: block !important;
    /* 用!important确保优先级足够,也可以通过给nav加专属类名来提升选择器权重替代 */
  }
}

这样一来,小屏幕下不管JavaScript有没有给nav添加show类,菜单都会保持显示状态。

2. JavaScript 逻辑优化

接下来修改你的JS代码,让滚动触发的逻辑只在大屏幕(宽度>786px)时生效,同时监听窗口大小变化,确保窗口 resize 时逻辑能及时切换:

方案一:监听 scroll + resize 事件(简单直接)

$(window).on("scroll resize", function() {
  const currentWidth = $(window).width();
  
  // 仅在大屏幕下执行滚动显示/隐藏逻辑
  if (currentWidth > 786) {
    if ($(window).scrollTop() > 0) {
      $('nav').addClass('show');
    } else {
      $('nav').removeClass('show');
    }
  } else {
    // 小屏幕下清理show类(避免冗余,不影响CSS的显示效果)
    $('nav').removeClass('show');
  }
});

方案二:使用 matchMedia API(更高效)

如果想避免resize事件频繁触发带来的性能损耗,可以用浏览器原生的matchMedia API监听媒体查询状态,只在断点切换时调整逻辑:

// 创建媒体查询对象,匹配大屏幕(宽度≥787px)
const largeScreenQuery = window.matchMedia('(min-width: 787px)');

// 定义导航逻辑处理函数
function handleNavVisibility(query) {
  if (query.matches) {
    // 大屏幕下,绑定滚动事件,用toggleClass简化逻辑
    $(window).on("scroll", function() {
      $('nav').toggleClass('show', $(window).scrollTop() > 0);
    });
  } else {
    // 小屏幕下,解绑滚动事件,清理show类
    $(window).off("scroll");
    $('nav').removeClass('show');
  }
}

// 页面加载时执行一次初始逻辑
handleNavVisibility(largeScreenQuery);
// 监听媒体查询状态变化(窗口大小跨断点时触发)
largeScreenQuery.addEventListener('change', handleNavVisibility);

这个方案的优势是,只有当窗口大小跨越786px断点时才会触发逻辑调整,比监听resize事件更高效。

内容的提问来源于stack exchange,提问作者Kenneth Valinote

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:53:16