解决ios移动端双滚动条导致滚动穿透问题

WHAT - 前端开发滚动条场景解析 滚动时触发大量scroll事件,频繁执行回调,导致卡顿、掉帧。尤其是回调中有 DOM 查询、布局重排(reflow/repaint)操作时,影响更大。问题场景解决思路滚动性能节流、防抖、虚拟滚动滚动监听监听正确元素,ResizeObserver移动端穿透禁止 body 滚动,touchmove prevent滚动条样式兼容隐藏/自定义滚动条吸顶与滚动加载sticky + 正确判断触底滚动位置管理手动记录恢复 scrollTop大数据卡顿虚拟列表技术iOS 滚动兼容。 阅读详情

解决方案1

在弹出层的touchstart事件中调用preventDefault

这种方法不可取,至少有3个缺点:

  1. 如果弹出层本身是有滚动(条)的话,将会导致弹出层无法滚动,此时用这种方法无异于饮鸩止渴。
  2. 一个很常见的场景,点击弹出层,弹出层消失掉,此时也无法触发弹出层的点击回调事件。
  3. 弹出层内的任何事件都执行不了了。

 

解决方案2

此解决方案是解决方案1的升级版。

在弹出层的touchmove(注意区别)事件中调用preventDefault

这种解决办法没有了第一种解决办法的 2, 3 缺点。适用于弹出层本身有没有滚动(条)。

 

解决方案3

设置body{overflow:hidden;}

缺点:经测试,在PC上支持良好,但是在IOS端,跟没有设置是一样的,完全不起任何作用!。

这种解决方案适用于PC端。

 

解决方案4

设置 html,body{overflow:hidden;}

在PC和移动端都能禁止掉下层的滚动。

缺点:

  1. 滚动位置丢失!页面会回到顶部!
  2. 页面的背景还是能够有滚的动的效果(这个我没遇到)。

可通过js来fix这个缺点,在弹出层出现时,记录页面的scrollTop,当弹出层消失时,把先前记录的scrollTop再次赋予页面。

 

终极完美解决方案

此解决方案能够避免上述所有缺点。堪称完美。

(这个方案会导致主页面display:flex 的元素在弹框打开后消失)

css

body.dialog-open {
  position: fixed;
  width: 100%;
}

javascript

(function(){

   var scrollTop = 0;

   // 显示弹出层
   open.onclick = function(){
      
      // 在弹出层显示之前,记录当前的滚动位置
      scrollTop = getScrollTop();
        
      // 使body脱离文档流
      document.body.classList.add('dialog-open'); 
      
      // 把脱离文档流的body拉上去!否则页面会回到顶部!
      document.body.style.top = -scrollTop + 'px';
    
      mask.style.display = 'block';
   }  

   // 隐藏弹出层
   close.onclick = function(){

     mask.style.display = 'none';
     
     // body又回到了文档流中(我胡汉三又回来啦!)
     document.body.classList.remove('dialog-open');
 
     // 滚回到老地方
     to(scrollTop);
   }

   function to(scrollTop){
     document.body.scrollTop = document.documentElement.scrollTop = scrollTop;
   }
   function getScrollTop(){
     return document.body.scrollTop || document.documentElement.scrollTop;
   }

 }()); 

 

解决滚动穿透的2个工具方法:

function fixedBody(){
    var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
    document.body.style.cssText += 'position:fixed;top:-'+scrollTop+'px;';
}

function looseBody() {
    var body = document.body;
    body.style.position = '';
    var top = body.style.top;
    document.body.scrollTop = document.documentElement.scrollTop = -parseInt(top);
    body.style.top = '';
}

 

阿里云大模型ACP认证模拟考试(一) 摘要:在阿里云大模型高级工程师 ACP 认证暂无真题题库的现状下,模拟题具有重要意义。其依照真实考试设计,涵盖题型、题量与分值分布,助力考生熟悉考试框架,合理分配答题时间精力,提升效率。同时,模拟题紧扣官方课程,能帮助考生精准定位知识盲点,如大模型架构原理和通义千问应用实践等重点内容,以便针对性完善知识体系。此外,通过练习模拟题,考生可掌握不同题型的解题思维与技巧,快速洞察复杂题目本质,提高答题准确率。 阅读详情

相关推荐

2024年全国大学生电子设计竞赛A题_AC-AC变换电路并联运行

AC-AC变换电路并联运行(A 题)【本科组】

qq_74395263的博客 7833

移动端滚动穿透问题

定义:移动端弹出fixed弹窗的话,在弹窗上滑动会导致下层的页面跟着滚动,这个叫 “滚动穿透” 解决方案1 在弹出层的touchstart事件中调用preventDefault 这种方法不可取,至少有3个缺点: 如果弹出层本身是有滚动(条)的话,将会导致弹出层无法滚动,此时用这种方法无异于饮鸩止渴。 一个很常见的场景,点击弹出层,弹出层消失掉,此时也无法触发弹出层的点击回调事件。 弹出...

u010537398的博客 925

C++ bitset总结

数据结构bitset 术语:某1位置位是置1,某一位复位是某一位清零。 文章目录数据结构bitset一、3种初始化方式二、位访问三、位操作四、 位集操作总结实战练习 一、3种初始化方式 bitset<32> tmp; //默认构造函数,默认全0。 bitset<32> tmp(-1); //从整形数构造 bitset<32> tmp("101"); //从包含1和0的字符串构造 二、位访问 bitset<32> tmp(256)

qq_43807092的博客 719

小程序之坑----ios弹窗滑动穿透

项目:taro3+vue3 场景:页面上有浮层,手势 滑动浮层,ios会穿透,页面也会滑动,如果页面上有地图,地图也会随之拖动 <view class="base-touch-layout" :catch-move="true" :animation="animationData"> <view class="base-touch-layout-in" @touchmove="touchMove" > <slo

hanchengmei的博客 4267

2023年全国赛C题《 电容电感测量装置》设计报告

参考下面网站的方案参考LCR测试仪,基本工作原理为给DUT加上正弦激励信号,然后测得该DUT两端的电压和流过DUT的电流,即可通过计算得到DUT的性质和参数。对于一个理想电容,电流相位应该超前电容两端电压90°。然而实际的电容存在损耗,可以等效为一个理想电容Cp​和一个理想电阻Rp​的并联,因此电流超前电压的相位将小于90°,这个角度差即为损耗角。假设DUT两端电压V˙Vcosωt,流过DUT的电流为I˙Isinωt−φ。

moerjie的博客 4808

2025反爬虫革命:京东商品接口的动态指纹认证与量子加密传输方案

在2025年,全球电商API接口面临的安全威胁呈现指数级增长:京东构建了基于硬件、软件、行为三重维度的设备指纹模型:京东构建了基于BB84+E91混合协议的量子密钥中继网络:

FB13713612741的博客 1648

解决H5页面在iOS系统中滑动回弹效果(橡皮筋效果)导致的穿透问题

移动端开发时,H5长页面在iOS系统中滑动时,当页面滑动到顶部或底部时,页面还能够上滑或下滑,手指离开屏幕后回弹,这就时橡皮筋效果,单纯来说这个效果并没有什么问题,但是它对H5页面却并不友好,会导致穿透,导致H5页面出现被截断的假象; 参考了很多文章之后,我采用了如下办法,亲测好用: 使用插件inobounce(但是只适用于ios系统,安卓不适用) 下载插件: npm install inobounce -s 在需要处理的页面上添加如下代码: <script> i...

一捆铁树枝的博客 6912

GD32F103VBT6串口OTA升级保姆级教程:当硬件没留Boot0引脚时,我是如何用Keil和Ymodem搞定的

本文详细介绍了GD32F103VBT6在无Boot0引脚情况下的串口OTA升级方案,通过Keil工程改造和Ymodem协议实现可靠固件更新。文章涵盖Bootloader配置、APP工程调整、Ymodem传输优化等关键步骤,为嵌入式开发者提供了一套完整的解决方案,特别适用于封闭式设备的远程更新需求。

weixin_28744613的博客 182

vue中mini-ui popup与picker结合在iphone手机穿透问题

背景 vue项目使用mint-ui组件中使用popup和picker在iphone手机上会出现在手机屏幕滑动时,使后面model层(灰色阴影部分)出现滚动效果。 解决方案 先看下代码,此代码挑选重点部分内容,请自行理解 &lt;template&gt; &lt;mt-popup style="width: 100%" v-model="popupVisible" position="botto...

黑星 2688

MacOS多次踩坑后成功安装Homebrew

来一次性成功安装Homebrew吧 官网提供的安装脚本无法成功安装Homebrew,原因大家都懂的,故采用脚本安装的方式。 下载homebrew的安装脚本brew_install 在Download路径下执行如下脚本 curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install >> brew_install 修改brew_install脚本 修改brew_install脚本。如果你的脚本打开之后是如下

weixin_41847116的博客 1980

【ChangeCLIP】Remote sensing change detection with multimodal vision-language representation learning

ChangeCLIP论文及代码使用详解。持续更新变化检测最新论文,欢迎订阅本专栏。

向上生长的程序媛的博客 1333

仿京东移动端分类页面解决ios滑动的卡顿问题(单页面双滚动条)

        在移动项目中遇到问题,单页面分左右两部分,分别可以滑动,类似于京东移动端的分类页面,右侧用定位fixed,左侧如果用relative定位或者不用定位的话可以实现滚动流畅,但是有问题是:滑动左边的部分照样会使右边滚动,而左侧用absolute进行定位,可实现单页面的双滚动条,彼此不影响。但是问题来了,这样写在安卓手机上是没有问题的,但是在ios手机上会出现滑动...

zuo-yiran的博客 1149

【异常】出现“‘git‘ 不是内部或外部命令,也不是可运行的程序”的错误

出现“‘git’ 不是内部或外部命令,也不是可运行的程序”的错误通常意味着 Git 没有被正确安装在你的系统上,或者其可执行文件的路径没有被添加到系统的环境变量中。

奶爸的编程之路,也就一周冷个三天 1388

解决移动端滚动穿透问题(兼容ios,android)

解决问题。 网上找了一圈大多都是; overflow: hidden 页面有弹出层时将overflow: hidden样式添加到 html 上,禁用 html 和 body 的滚动条,但是这个方案移动端根本无用!!!!,pc端也有两个缺点; 1.由于 html 和 body的滚动条都被禁用,弹出层后页面的滚动位置会丢失,需要用 js 来还原。 2.页面的背景还是能够有滚的动的效果。 ...

易之晓的博客 1299

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

h5 ios 滚动到底部_滚动穿透问题探索

在移动端开发中,模态(Modal)弹窗可以说是非常之常见了,作为正在看这篇文章的你,可能写过基于Vue或者小程序的统一弹窗Modal组件;可能处理 过定宽高或者不定宽高的情况等,看起来一个小小的模态框其实蕴藏了大大的知识点,本文就带你去探索模态框中的滚动穿透(scroll chaining)问题。背景俗话说,产品有三宝:弹窗、浮层加引导,足以见弹窗在产品同学心目中的地位。对任意一个刚入门...

weixin_32721919的博客 1111

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

这一次,彻底解决滚动穿透

什么是滚动穿透如图所示,有一层遮罩蒙层覆盖在body上时,当我们滚动遮罩层,它下面的内容也会跟着一起滚动,看起来好像是上面的滚动事件穿透到下面的DOM元素上一样,我们称之为滚动穿透。

男神的专栏 2294

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

移动端滚动穿透与滚动溢出解决方案

滚动穿透滚动穿透.gif问题描述在移动端 WEB 开发的时候(小程序也雷同),如上录屏所示,如果页面超过一屏高度出现滚动条时,在 fixed 定位的弹窗遮罩层上进行滑动,它下面的内容也会跟...

zz_jesse的博客 1503

完美解决移动端H5页面的滑动穿透问题

同事的分享,记录下来。 代码如下: css: body.modal-open { position: fixed; width: 100%; } js: // 兼容低版本 document.scrollingElement写法 (function () { if (document.scrollingElement) {...

weixin_30617797的博客 998

滚动穿透的6种解决方案【已自测】

在移动端中,如果我们使用了一个固定定位的遮罩层,且其下方的dom结构的宽度|高度超出屏幕的宽度|高度,那么即使遮罩层弹出后铺满了整个屏幕,其下方的dom结构依然可以滚动,这就是大家所说的“滚动穿透”。 而且经常是你在pc模拟器上没有问题,但是真机打开就一定会出现。 这个经典八阿哥也是面试时经常会被追问的问题。相信能看到这篇文章的你,已经是遇到了这个问题。我就不gif展示问题效果了。...

weixin_34228387的博客 2012

【总结】1823- 移动端滚动穿透与滚动溢出解决方案

滚动穿透问题描述在移动端 WEB 开发的时候(小程序也雷同),如上录屏所示,如果页面超过一屏高度出现滚动条时,在 fixed 定位的弹窗遮罩层上进行滑动,它下面的内容也会跟着一起滚动,看起来好像事件穿透到下面的DOM元素上一样,我们姑且称之为滚动穿透。问题原因能够猜想是文档(document)的滚动事件被触发了,如果能禁用滚动事件就好办了。案例伪代码<divclass="btn">点...

pingan8787 281

html判断是否有滚动条,JS 判断元素是否可以滚动

今天在解决 ios 移动端滚动穿透的问题时遇到一个问题,就是判断元素能否滚动,把这个过程记录下来。以下以纵向滚动为例,横向滚动同理。嫌麻烦的可以直接查看代码。基础概念Element.scrollHeightscrollHeight 是一个元素内容高度的度量,包括由于溢出导致的视图中不可见的内容,scrollHeight 的值等于元素在不能出现滚动条的时候展示出视图中所有内容所需要的最小高度。如果元...

weixin_30396777的博客 1766

优化移动端H5:常见问题与解决方案

移动端H5开发常遇问题:iOS滑动不流畅、页面缩放、软键盘归位、点击穿透、兼容性、性能优化、iOS长按选中、上下拉空白、日期转换NAN。提供相应CSS、JavaScript解决方案。

我码玄黄的博客 1511

滚动穿透问题解决方案详解

移动端滚动穿透问题是指当弹窗滚动到边界时,会触发底层页面滚动。解决方案包括:1)CSS的overflow:hidden简单但丢失滚动位置;2)动态固定定位法通过JS记录滚动位置;3)现代CSS属性overscroll-behavior兼容性有限但优雅;4)智能事件处理精确控制边界滚动。建议优先考虑overscroll-behavior,老浏览器使用动态定位,复杂场景可用第三方库。需注意真机测试和多平台兼容性。

油墨香^-^的博客 342
上一篇: 安装lessc以及在webstrom 中编译.less文件并生成css和css.map文件
下一篇: 进栈出栈规则
gz-郭小敏
博客等级 码龄9年 39粉丝 112原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值