弹出弹窗后,如何禁止底层的body滚动,适用于超长的页面

移动端 滚动穿透 滚动穿透 阅读详情

常见场景

在许多填写表单的页面中,都会弹出一个选择器,让你在弹窗中选择项目。有时,弹窗本身容纳不下内容,需要让它不断滚动来展示,但因为事件是冒泡的,有时就会造成底部(body 的Z-index肯定是在下面的 )的内容也在滚动。这内外一起滚,就有点尴尬了。

举例,下面两张图里,都有类似的问题。那么怎么解决呢?

这里写图片描述

这里写图片描述

从event. target入手

一种思路就是从事件入手,如果事件对象不是弹窗的话,就让它什么都不做。

(其实这里有个疑惑,为什么不能通过阻止冒泡来阻止外层的body滚动呢?换了好几个事件类型都不行,不管是scroll还是touchmove,很奇怪。
实践发现,touchmove事件的确不会冒泡了,但body仍然在滚动。。。那我不就不知道事件实现的机制到底是什么了,而且用浏览器模拟的移动端,也不知道是不是模拟有误。。。
总之,event.stopPropagation() 方法在这里不是很管用。。。
)。

比如图一中的每一栏滚动条,classname为listcol,而弹窗为.listcol,那么可以这么做:

			$('.box--listcol').on('touchmove', function(event) {

				if(event.target.className.indexOf('listcol') === -1){

					event.preventDefault() 
				}
				
			});
// 忽略奇怪的缩进,直接从代码里粘贴出来的

还是直接干body吧

从event入手虽好,但那样一来,每一个弹窗都要单独绑一个事件,而且!!!很恶心的是,如果有个反人类的操作,比如内容明明无需滚动,却绑了事件,就仍然会在滚内容的时候带动外层滚动。。。。(此时内容是不会滚的,因为高度足够容纳了)。

可能表述的不是很清晰,图二中,滚动区域的classname 为 jobscrollcontainer, 弹窗本身为box–job。


		$('.box--job').on('touchmove',function(e){

			if(!$(e.target).parents().filter('.jobscrollcontainer').length){

				e.preventDefault()
			}

		})

正常操作的时候是可以的。但如果不能滚动硬滚,那就抓瞎了。

所以,还是要从根子抓起,比如,就固定body不让它滚!

function toggleBody(isPin){

	if(isPin){

		document.body.style.height = '100vh'

		document.body.style['overflow-y'] = 'hidden'
	}

	else{

		document.body.style.height = 'unset'

		document.body.style['overflow-y'] = 'auto'

	}
}

toggleBody(1)  //在跳出弹窗的时候
toggleBody(0)  //弹窗消失的时候

超长的页面怎么办呢(2018-11更新)

上面直接限制body固然有效,但如果一个页面很长很长,超出了100vh,而我正好滚到中间时弹出弹窗。此时若直接限制body的overflow: hidden则会让页面一下弹到顶部,显然不是好的做法。那么,又该怎么做呢?

对移动端,可以引入touch-action,限制为none,在弹窗消失时再变回auto。但ios的safari上不支持该属性(可以去caniuse上查查,起码2018.11的时候还不支持)。如果我们的app在ios上用的是safari内核,就起不到效果了。

补充:最近看css-secrets,有个从svg来的属性event-points也可以起到类似的效果,而且虽然是非官方属性,但浏览器支持还不错。可以试试给body设置event-points: none。

这时候,就需要结合event.preventDefault属性来用了。注意在绑定addEventListener的时候,需要多传一个options,强调这个事件不是passive的,否则谷歌等新版浏览器会报错。同时最好也指定capture: true,这样可以早点禁止该事件。

报错是Unable to preventDefault inside passive event listener due to target being treated as passive.。这是因为谷歌从chrome51之后引入的新优化。事实上,谷歌建议一般情况下,将 passive 标志添加到每个没有调用 preventDefault() 的 wheel、mousewheel、touchstart 和 touchmove 事件侦听器。但是,对于这种禁止了默认事件的eventListener,在这种情况下,反而是要强调它不是消极监听的。因为滚动都不能滚了,无所谓什么优化了。

代码如下(vue版本的):

 watch: {
    show(v) {
      this.toggleContainerTouchAction(v)
      if (v) {
        document.body.addEventListener('touchmove', this.stopTouch, { passive: false, capture: true })
      } else {
        document.body.removeEventListener('touchmove', this.stopTouch, { capture: true })
      }
    },
  },
  methods: {
    toggleContainerTouchAction(v) {
      const container = document.querySelector('.container')
      if (!container) {
        return
      }
      container.style['touch-action'] = v ? 'none' : 'auto'
    },
    stopTouch(e) {
      e.preventDefault()
    },

conclusion

直接锁定body在移动端和web都适用,但如果是从事件入手的话,就要根据需要选择到底是用touch 还是 mousewheel 了。

酌情使用吧,如果一个页面中有很多不同的弹窗,那么对每一个弹窗的蹦出和消失都加上toggleBody事件也是挺烦的。。。也要考虑到用什么工具做的页面,如果是框架的话,在组件里绑会相对简洁一些。。。

微信小程序Web-View开发实战:从技术选型到性能优化全解析 在移动应用开发中,混合开发技术通过结合原生应用与Web技术的优势,为开发者提供了更灵活的解决方案。其核心原理是在原生容器中嵌入Web视图,实现动态内容加载与跨平台代码复用。这种架构的技术价值在于能够快速迭代业务模块、复用现有Web资产,并规避部分平台审核限制。在微信小程序生态中,Web-View组件正是这一理念的典型实现,广泛应用于活动运营页、复杂H5应用集成等场景。通过合理配置业务域名、建立稳定的双向通信机制,并实施资源压缩、骨架屏等优化策略,开发者可以打造体验流畅的内嵌页面。本文聚焦微信小程序Web-V 阅读详情

相关推荐

亚马逊协议三实战通关:视频化政策响应机制

亚马逊卖家合规运营的核心在于准确理解并即时响应平台政策,其中‘协议三’(Seller Performance Policy)作为账户健康与商品上架的刚性依据,直接影响流量分配与账号存续。其本质并非静态条款汇编,而是由主干政策、类目细则与实时公告构成的动态执行体系,需结合后台操作路径、系统级交互逻辑与视觉化反馈进行落地。视频通关模式通过真实界面录屏、鼠标轨迹引导与错误弹窗还原,将抽象政策转化为可识别、可触发、可验证的动作节点,显著提升UN38.3报告上传、图像合规检查、申诉信撰写等高频场景的执行准确率与响应速

weixin_30896511的博客 404

easyui combobox java_[Java教程]EasyUI combobox

[Java教程]EasyUI combobox02016-12-23 11:00:05高度自适应data-options="required:true,editable:false,panelHeight:'auto',panelMaxHeight:170"加上panelHeight:'auto'即可取值问题例子:在对其取值的时候?//不能使用 $('#cc').val()//正确应该//取ID...

weixin_42560067的博客 287

腾讯系生态适配实战:接口变更与技术主权保卫战

在超级平台主导的移动互联网生态中,'平台即基础设施'已成为创业者的普遍现实。理解微信JS-SDK、QQ浏览器Web API等客户端能力的演进逻辑,是掌握前端适配原理的基础;而接口废弃、内核升级、审核规则收紧等变化,本质上是对技术架构弹性和组织响应能力的系统性考验。其技术价值在于倒逼微前端架构、PlatformAdapter中间件、跨平台能力矩阵等工程实践落地,显著降低底层能力替代带来的重构成本。典型应用场景覆盖小程序/H5多端分发、支付与分享链路稳定保障、私域用户资产沉淀等关键环节。本文聚焦可复用的适配策略

lanmh的专栏 395

vue弹窗后如何禁止滚动条滚动

1、在有弹出框的页面中,加上以下方法,弹出框出现时调用禁止滚动方法stopScroll(),弹出框去掉是调取允许滚动方法canScroll()即可,代码如下。

qq_48294048的博客 4844

HBuilderX实战:快速将网站打包成原生体验APP的完整指南

在移动开发领域,跨平台技术始终是平衡开发效率与应用性能的关键。其核心原理在于通过统一的代码库,利用中间层桥接技术,调用不同操作系统的原生能力,最终编译生成多端应用。这种方案的技术价值在于大幅降低了开发成本与维护复杂度,尤其适合需要快速验证或拥有成熟Web产品的团队。典型的应用场景包括内容展示、企业工具、电商及信息类应用。本文聚焦于使用HBuilderX与uni-app生态,将现有网站快速转化为功能完备的APP。通过其提供的增强型WebView与JS Bridge,开发者能便捷地调用摄像头、地理位置等原生模块

weixin_30617797的博客 433

LM Studio Windows 本地部署实战指南:零命令行启动大模型

本地大模型部署正从开发者专属走向通用生产力工具,其核心在于降低使用门槛、保障运行确定性与适配主流硬件环境。LM Studio 作为专为 Windows 优化的桌面级大模型运行平台,通过图形化界面封装模型加载、上下文管理、API 暴露与提示词调试等关键能力,让非技术用户也能快速验证提示词效果、演示文案生成或离线调试知识库问答。它不替代 llama.cpp 等底层引擎,而是构建在 GGUF 模型格式与量化技术(如 Q4_K_M)之上的工程友好层,天然支持 Phi-3、Qwen2 等轻量高性能模型,并可无缝对接

aiman5818的博客 385

禁止页面Body在后台滚动

我最讨厌的一种情况, 是在滚动弹出框的时候, 后台的 <body> 也跟着一起滚了。你可能也碰到过这种情况: 想滚动一下对话框, 却看到底层的页面也跟着一起滚动? 这真是种糟糕的用户体验, 很杯具、呵呵。 那么怎样才算是比较好的处理方式? 监听 scroll 事件并且执行 preventDefault 和/或 stopP...

weixin_33676492的博客 321

飞书+扣子+DeepSeek三件套:5分钟搞定公众号文章批量改写(附完整配置截图)

本文详细介绍了如何利用飞书、扣子和DeepSeek三款工具,无需编程即可搭建一个高效的公众号文章批量改写自动化工作流。通过飞书多维表格管理链接与成果,扣子平台串联整个流程,并调用DeepSeek智能体进行内容润色与改写,实现从内容抓取到智能处理的完整自动化,大幅提升新媒体运营效率。

python9snake的博客 207

禁用body滚动条的兼容写法

注意,这种方法只是禁用了 body 元素的滚动条,而不是禁用整个页面的滚动条。如果需要禁用整个页面的滚动条,可以将上述代码中的 document.body 改为 document.documentElement。在禁用滚动条时,将 position 属性设置为 fixed,并且将 scrollTop 设置为 0,就可以禁用滚动条。在启用滚动条时,将 position 属性和 top 属性设置回原来的值就可以了。

weixin_44283589的博客 488

从零到一:基于DESeq2的转录组差异表达分析实战指南

本文详细介绍了基于DESeq2的转录组差异表达分析实战指南,涵盖数据准备、标准化处理、差异分析及结果解读等关键步骤。DESeq2凭借其稳定性和对低表达基因的友好处理,成为转录组数据分析的首选工具。文章还提供了常见问题排查和优化建议,帮助研究者高效完成从分析到发表的完整流程。

weixin_26759093的博客 269

YOLOv11 改进策略:引入 NWD 损失函数提高小目标检测精度

YOLO(You Only Look Once)是一种实时目标检测算法,能够有效地预测图像中多个物体的边界框和类别概率。其高效性使它成为自动驾驶、视频监控等领域的理想选择。NWD 是一种基于 Wasserstein 距离的损失函数,其通过归一化处理,更好地评估预测框和真实框之间的几何偏差。这种方法不仅仅关注重叠区域,而且考虑中心点和尺度信息,提高了对小目标的敏感度。

走向CTO的路上... 2001

页面不随浮层滚动 解决思路

1. 浮层弹层设置溢出隐藏; js控制滑动事件 2. 相关文章 弹出弹窗后,如何禁止底层的body滚动,适用于超长的页面(2018.11更新) 移动端弹出层滚动时禁止body滚动 深入研究-webkit-overflow-scrolling:touch及ios滚动 移动端设置了overflow:hidden页面还会滚动的禁止方法 转载于:https://www.cnblog...

weixin_30827565的博客 215

30.Labview如何读懂别人程序、修改程序?

之前写过一次教大家的文章,这次教大家如何学习别人的程序,和如何搭建一套适合自己的程序框架。这里事先说明一下:要想搭好程序框架,一定要先把自己的系统,逻辑是什么!这非常重要,是决定你程序的关键因素。废话不多扯,直接说重点。

关注我,更多技术问题欢迎私聊~ 2445

vue禁止页面滚动条_vue弹窗后如何禁止滚动条滚动?

常见场景在许多填写表单的页面中,都会弹出一个选择器,让你在弹窗中选择项目。有时,弹窗本身容纳不下内容,需要让它不断滚动来展示,但因为事件是冒泡的,有时就会造成底部(body 的Z-index肯定是在下面的 )的内容也在滚动。这内外一起滚,就有点尴尬了。举例,下面两张图里,都有类似的问题。那么怎么解决呢? 从event. target入手一种思路就是从事件入手,如果事件对象不是弹窗的话,就让它什么...

weixin_39692037的博客 2076

巡检类机器人电池容量计算方法论(原理+算法+真实案例)

摘要:本文系统阐述了巡检机器人电池容量的计算方法,重点解析了;能量平衡;核心原理和三种主流算法。通过光伏电站履带式巡检机器人的真实案例,详细演示了从工况拆解、功耗采集到容量计算的完整流程。文章指出:室内轻载场景可采用静态平均功耗法,户外常规工况推荐动态负载积分法,而复杂环境需采用融合估算算法。特别强调需考虑温度修正(冬季容量衰减20%)、冗余系数(1.2-1.5)和放电深度(磷酸铁锂DoD取80%)等关键参数。

start_up_go的博客 241

Oracle EBS AP发票被预付款核算创建会计科目时间超长

在客户职能部门的水电、通信和物业等费用统一管理或对接部门报销时,用户将所有费用分摊到各个末级部门,导致AP发票行数高达上千行。这引发了以下问题:1)用户过账时,创建会计科目的请求执行超过20小时未完成,只能手动取消;2)取消请求后,系统一直处于回滚状态;3)通过SQL脚本分析,发现预付发票核销分配行表记录数量庞大,单笔AP发票记录高达90多万条,类似发票共有5笔。

陈显平的专栏-Oracle EBS 350

vue弹窗后如何禁止滚动条滚动?

原文地址 常见场景 在许多填写表单的页面中,都会弹出一个选择器,让你在弹窗中选择项目。有时,弹窗本身容纳不下内容,需要让它不断滚动来展示,但因为事件是冒泡的,有时就会造成底部(body 的Z-index肯定是在下面的 )的内容也在滚动。这内外一起滚,就有点尴尬了。 举例,下面两张图里,都有类似的问题。那么怎么解决呢? 从event. targe...

weixin_30622181的博客 1891

【YoloV11改进策略】基于流形约束超连接(mHC)增强YoloV11全局特征提取能力|独家复现|梁文峰署名论文

论文标题:流形约束超连接 (Manifold-Constrained Hyper-Connections, mHC)核心问题:针对超连接 (Hyper-Connections, HC) 扩展残差流宽度时破坏恒等映射、引发训练不稳定性和高内存开销的问题,提出一种约束性框架。目标:恢复残差连接的稳定性与可扩展性,同时保持HC的性能增益。基准模型:基于DeepSeek-V3的MoE架构,进行了3B、9B、27B模型的实验验证。论文图示mHC 是一个通用的HC扩展框架。

m0_47867638的博客 1344

vue滚动条禁止_vue弹窗后如何禁止滚动条滚动?

常见场景在许多填写表单的页面中,都会弹出一个选择器,让你在弹窗中选择项目。有时,弹窗本身容纳不下内容,需要让它不断滚动来展示,但因为事件是冒泡的,有时就会造成底部(body 的Z-index肯定是在下面的 )的内容也在滚动。这内外一起滚,就有点尴尬了。举例,下面两张图里,都有类似的问题。那么怎么解决呢?从event. target入手一种思路就是从事件入手,如果事件对象不是弹窗的话,就让它什么都不...

weixin_39909366的博客 889

全网唯一OpenCyphal/UAVCAN教程(8)libcanard介绍

当Cyphal里,这个结构体代表一条完整的Cyphal消息,之后我们会根据metadata里提供的元信息,其实就是消息ID,调用对应的反序列化函数,将payload还原成具体的Cyphal消息。用于构造一个新的发送队列,原则上一个can物理接口需要分配一个发送队列,如果它们的MTU大小一致,是可以共用一条的。这个库不包含IO层,是平台无关的,意义是没有实现具体的数据收发,仅提供将发送出去的Cyphal消息转成can帧,以及将收到的can帧转成Cyphal消息。返回值是这条消息拆解成的can帧的数目。....

二进制君 2404

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

智能体测开Day29

浏览器基本操作;iframe处理;下拉框操作;弹窗处理;三种等待机制;页面截图。定位方式背诵内容。

weixin_53860197的博客 221

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Vue 完整版系统知识文档

《Vue全栈开发实战手册》摘要 本手册系统整合Vue2/Vue3全栈知识体系,涵盖基础语法、组件开发、状态管理、工程化等核心内容,适合从入门到精通的完整学习路径。主要特点: 基础核心 详解MVVM架构和响应式原理(Vue2的Object.defineProperty vs Vue3的Proxy) 完整模板语法规则与16种内置指令解析 组件系统核心:通信机制(8种方案)、插槽、动态组件、递归组件 进阶实战 状态管理:Vuex/Pinia完整解决方案 路由开发:动态路由、权限控制、懒加载 工程化:Webpack

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 400

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Sqribble文档自动化系统:模板驱动的结构化出版流水线

结构化数字文档生产是技术内容创作者、教育者与营销人员的核心需求,其本质在于将非设计人员的文本内容,通过确定性规则与预设模板,高效转化为专业级PDF等交付物。该过程依赖于云原生架构、模块化渲染引擎与可执行出版协议(即模板),而非通用AI生成或自由式设计工具。关键技术价值在于消除格式错误、保障跨设备一致性、支持团队协作版本控制,并天然适配电子书、白皮书、SOP手册等高频场景。Sqribble正是以‘模板为引擎、规则为骨架、云为底座’的典型代表,将出版流程压缩为点选、粘贴与一键生成的确定性流水线。

weixin_30386713的博客 295
上一篇: linux下node.js 查版本号和更新 how to update node
下一篇: 利用ES6 的generators 化异步为同步
十方魔
博客等级 码龄10年 202粉丝 93原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值