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

鼠标滚轮切换横竖滚动:轮播横向滚动结束后无法恢复垂直滚动求助

你的代码存在4个核心问题:

  • 第一,横向滚动终点判断逻辑的触发时机错误:你把判断代码放在了window.scroll对应的init_position回调中,当你给html加上.stop-overflow类后,页面垂直滚动被禁止,window.scroll事件不会再触发,这段判断逻辑根本没有运行的机会。你需要单独监听.main容器自身的scroll事件来检测横向滚动位置。
  • 第二,mousewheel事件重复绑定:每次init_position满足条件时都会调用init_mousewheel,会给document绑定多次鼠标滚轮事件,导致滚动行为异常,需要先解绑已有事件再绑定新事件,或者加状态标识避免重复绑定。
  • 第三,滚动位置全等判断容易失效:浏览器计算的元素宽度、滚动距离可能存在小数,==全等判断很容易匹配失败,建议用>=代替,或者对两侧值先做取整处理。
  • 第四,检测到滚动终点后没有做后续状态重置:你只是写了alert,没有移除.stop-overflow类,也没有解绑横向滚动的鼠标滚轮事件,自然无法恢复垂直滚动。

修正后的完整代码如下:

// 新增状态标识,避免重复绑定事件
let isHorizontalScrollActive = false;

jQuery(window).scroll(function() {
    init_position();
});

// 监听.main容器的横向滚动事件
jQuery('.main').on('scroll', function() {
    checkHorizontalScrollEnd();
});

var windowHeight = jQuery(window).height();
var sliderHeight = jQuery('.main__wrapper').outerHeight(true);
var distance = (windowHeight - sliderHeight) / 2;

function init_position() {
    var windowScroll = $(window).scrollTop();
    var sliderPosition = $('.main').offset().top - $(window).scrollTop();

    if (sliderPosition <= distance && !isHorizontalScrollActive) {
        console.log('进入横向滚动模式');
        $('html').addClass('stop-overflow');
        isHorizontalScrollActive = true;
        init_mousewheel();
        // 进入时先判断一次是不是已经到终点(避免异常情况)
        checkHorizontalScrollEnd();
    } else if (sliderPosition > distance && isHorizontalScrollActive) {
        // 向上滚动离开轮播区域时重置状态
        resetHorizontalScroll();
    }
}

// 单独抽离横向滚动终点检测逻辑
function checkHorizontalScrollEnd() {
    const main = $('.main');
    const wrapper = $('.main .main__wrapper');
    // 用>=代替==,避免小数问题
    if (main.scrollLeft() >= (wrapper.width() - main.width())) {
        console.log('横向滚动到底');
        resetHorizontalScroll();
        // 可选:滚动到底后自动让页面继续向下滚一点,避免停在轮播位置
        $(window).scrollTop($(window).scrollTop() + 10);
    }
}

function init_mousewheel() {
    // 先解绑已有事件,避免重复绑定
    $(document).off('mousewheel').on('mousewheel', function(e, delta) {
        $('#main')[0].scrollLeft -= (delta);
    }, { passive: false });
}

// 抽离横向滚动状态重置逻辑
function resetHorizontalScroll() {
    $('html').removeClass('stop-overflow');
    $(document).off('mousewheel');
    isHorizontalScrollActive = false;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:06:03