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

jQuery hover功能无论上下滚动均触发,仅向下滚动生效如何解决

问题根因

你的代码核心问题是事件绑定是永久累加的:只要触发过一次向下滚动,hover事件就会被绑定到nav元素上,后续哪怕滚动方向变为向上,已经绑定的事件也不会自动移除,因此无论滚动方向如何,hover逻辑都会触发。
另外scroll事件触发频率极高,每次向下滚动都重复绑定hover事件,还会导致内存泄漏,同一个hover逻辑会被重复执行多次。

修复方案

不要在scroll回调中绑定事件,把hover事件绑定提到全局,单独用变量存储最近一次滚动方向,hover触发时先判断方向再执行对应逻辑即可,修复后代码如下:

var lastScrollTop = 0;
var isLastScrollDown = false; // 存储最近一次滚动方向标识

// hover事件全局仅绑定一次
$("nav").hover(function() {
  // 仅最后一次为向下滚动时,执行导航展示逻辑
  if (isLastScrollDown) {
    $(this).css({
      'transform': 'translateY(0px)',
      'opacity': '100%'
    });
  }
}, function() {
  if (isLastScrollDown) {
    $(this).css({
      'transform': 'translateY(80px)',
      'opacity': '40%'
    });
  }
});

$(window).scroll(function() {
  var st = $(this).scrollTop();
  // scroll回调仅更新滚动方向标识,不做事件绑定
  isLastScrollDown = st > lastScrollTop;
  console.log(isLastScrollDown ? "down" : "up");
  lastScrollTop = st;
});

可选优化

如果你需要向上滚动时导航栏固定展示、不需要hover触发,可以在scroll的向上滚动分支补充导航状态重置逻辑:

$(window).scroll(function() {
  var st = $(this).scrollTop();
  if (st > lastScrollTop) {
    isLastScrollDown = true;
    console.log("down");
  } else {
    isLastScrollDown = false;
    // 向上滚动时直接固定展示导航
    $("nav").css({
      'transform': 'translateY(0px)',
      'opacity': '100%'
    });
    console.log("up");
  }
  lastScrollTop = st;
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:51:00