Modal对话框关闭后页面滚动条消失怎么解决?
我在项目里用原生JS写了个Modal弹窗,打开时给body加了overflow: hidden防止背景滚动,但关闭后页面的滚动条就没了,刷新才恢复,这咋办?
试过在关闭时移除样式,但有时候还是不行,特别是iOS Safari上更明显。这是我的关键代码:
function openModal() {
document.body.style.overflow = 'hidden';
modal.classList.add('show');
}
function closeModal() {
document.body.style.overflow = ''; // 这样写有问题吗?
modal.classList.remove('show');
}
正确做法是保存原始状态再恢复:
为什么这么搞:
- 直接设overflow为空字符串不可靠,因为你不知道页面原本有没有滚动条
- iOS Safari的问题是设了overflow: hidden页面依然能滚,所以加上position: fixed来彻底锁死
- 锁死后页面会跳回顶部,所以要保存scrollPosition,关闭时再手动移回去
复制过去试试,基本主流浏览器都能搞定。
问题在于:当你设置
overflow: hidden时,有些浏览器(尤其 iOS Safari)会直接禁用整个页面的滚动能力,清空样式后它不一定记得原来是什么状态。解决办法是保存原始值,关闭时恢复它:
但这只是基础版,iOS Safari 上还得处理 document.documentElement,因为有些情况下 body 的 overflow 不起作用:
如果你项目里经常用到弹窗,建议直接用 class 来控制,别直接改 style。比如:
这样干净省心,浏览器会自己处理恢复的问题。原生 JS 写弹窗确实要考虑这些兼容性问题,够烦的。