0

0

如何防止移动端导航菜单展开时页面背景滚动

碧海醫心

碧海醫心

发布时间:2026-02-04 21:13:03

|

955人浏览过

|

来源于php中文网

原创

如何防止移动端导航菜单展开时页面背景滚动

react 应用中实现侧滑导航菜单时,常因 position: fixed 元素未阻断触摸事件传递,导致用户滑动菜单仍可滚动背后内容。本文提供零跳转、无闪屏的纯 css + javascript 解决方案,兼容主流移动浏览器

当移动端导航菜单(如 80vw 宽度的 fixed 侧栏)展开时,用户滑动菜单区域仍可触发底层页面滚动——这并非 bug,而是浏览器对 touchmove 事件的默认冒泡行为。单纯给

添加 overflow: hidden 会重置滚动位置(跳回顶部),破坏用户体验;而仅设置 position: fixed 或 z-index 无法阻止事件穿透。

推荐方案:CSS + JavaScript 协同控制

1. CSS 层面:锁定 body 滚动,保持当前位置
不使用 overflow: hidden(会重置 scrollY),改用 overscroll-behavior: none 配合 position: fixed 的精巧组合:

/* 锁定 body,但保留当前滚动偏移 */
body.no-scroll {
  position: fixed;
  width: 100%;
  top: calc(-1 * var(--scroll-y, 0px)); /* 抵消滚动位移 */
  overscroll-behavior: none;
}

/* 确保所有子元素不触发滚动链 */
body.no-scroll * {
  overscroll-behavior: none;
}

2. JavaScript 层面:记录并恢复滚动位置
在 React 组件中管理导航状态时,动态注入滚动偏移量:

import { useEffect, useRef } from 'react';

export function usePreventBodyScroll(isOpen: boolean) {
  const scrollYRef = useRef(0);

  useEffect(() => {
    if (isOpen) {
      // 记录当前滚动位置
      scrollYRef.current = window.scrollY;
      // 添加内联样式锁定 body
      document.body.style.cssText = `
        position: fixed;
        width: 100%;
        top: ${-scrollYRef.current}px;
        overscroll-behavior: none;
      `;
      document.body.classList.add('no-scroll');
    } else {
      // 恢复滚动位置(无跳动)
      document.body.style.cssText = '';
      document.body.classList.remove('no-scroll');
      window.scrollTo(0, scrollYRef.current);
    }
  }, [isOpen]);
}

// 在组件中使用
function MobileNav({ isOpen }: { isOpen: boolean }) {
  usePreventBodyScroll(isOpen);
  return (
    
  );
}

3. 补充增强:阻止 touchmove 冒泡(iOS 兜底)
针对 iOS Safari 对 overscroll-behavior 支持较晚(iOS 16+),添加轻量级事件拦截:

useEffect(() => {
  const handleTouchMove = (e: TouchEvent) => {
    if (isOpen && e.target === document.body) {
      e.preventDefault(); // 阻止默认滚动
    }
  };

  if (isOpen) {
    document.body.addEventListener('touchmove', handleTouchMove, { passive: false });
  }
  return () => {
    document.body.removeEventListener('touchmove', handleTouchMove);
  };
}, [isOpen]);

⚠️ 注意事项

腾讯AI 开放平台
腾讯AI 开放平台

腾讯AI开放平台

下载
  • 避免全局 document.body.style.overflow = 'hidden' —— 它会强制重置 scrollTop;
  • top: calc(-1 * var(--scroll-y)) 方案比 transform: translateY() 更稳定,避免 Safari 渲染抖动;
  • 若应用使用了 html { overflow-x: hidden },需同步为 html.no-scroll { overflow: hidden };
  • 在服务端渲染(SSR)场景下,确保 useEffect 逻辑仅在客户端执行。

该方案已在 iOS 15+/Android Chrome 110+ 实测通过,滑动菜单时背景完全静止,关闭后无缝恢复原滚动位置,无视觉跳变,符合 WCAG 可访问性要求。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

884

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

760

2023.11.06

CSS position定位有几种方式
CSS position定位有几种方式

有4种,分别是静态定位、相对定位、绝对定位和固定定位。更多关于CSS position定位有几种方式的内容,可以访问下面的文章。

81

2023.11.23

overflow什么意思
overflow什么意思

overflow是一个用于控制元素溢出内容的属性,当元素的内容超出其指定的尺寸时,overflow属性可以决定如何处理这些溢出的内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1775

2024.08.15

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

296

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

1757

2023.08.22

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2055

2023.09.19

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

277

2023.10.18

抖音网页版入口与视频观看指南 抖音官网视频在线访问
抖音网页版入口与视频观看指南 抖音官网视频在线访问

本专题汇总了抖音网页版的入口链接、官方登录页面以及视频观看入口,帮助用户快速访问抖音网页版,提供免登录访问方式和直接进入视频播放页面的方法,确保顺利浏览和观看抖音视频。

61

2026.02.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.2万人学习

CSS教程
CSS教程

共754课时 | 27.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号