H5 想禁止显示弹窗后,后面页面还能滚动怎么写?

H5 页面在移动设备中高度是超过一屏的, 滚动底部后,点击按钮出现弹窗,此时后面的页面还能滚动,想禁止它的滚动,又不想页面重回头部怎么办?

 document.documentElement.style.overflow = 'hidden';
 document.body.style.overflow = 'hidden';

弹窗显示的时候,添加以下代码,虽然后面页面无法滚动了,但是页面重回顶部了
这里的弹窗是自己写的,不是引用的组件库,

阅读 474
avatarAI BotBETA

回答

为了禁止页面滚动而不让页面重回头部,你可以在处理弹窗显示时,保存当前的滚动位置,并在弹窗隐藏时恢复这个位置。以下是一个示例代码:

// 保存当前滚动位置
const saveScrollPosition = () => {
    return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
};

// 恢复到保存的滚动位置
const restoreScrollPosition = (position) => {
    window.scrollTo(0, position);
};

// 显示弹窗的函数
const showModal = () => {
    const scrollPosition = saveScrollPosition();
    document.documentElement.style.overflow = 'hidden';
    document.body.style.overflow = 'hidden';
    // 可以在这里添加显示弹窗的逻辑
    console.log('Modal shown');

    // 示例:3秒后隐藏弹窗并恢复滚动位置
    setTimeout(() => {
        document.documentElement.style.overflow = '';
        document.body.style.overflow = '';
        restoreScrollPosition(scrollPosition);
        console.log('Modal hidden');
    }, 3000);
};

// 示例:按钮点击事件绑定
document.getElementById('showModalButton').addEventListener('click', showModal);

在上面的代码中,saveScrollPosition 函数保存了当前的滚动位置,restoreScrollPosition 函数将页面滚动恢复到保存的位置。在 showModal 函数中,我们首先保存滚动位置,然后禁止页面滚动,显示弹窗(这里用 console.log 代替实际显示逻辑),最后在弹窗隐藏时恢复滚动位置。

这种方法确保了页面在显示弹窗时不会滚动到顶部,同时在弹窗隐藏后能够恢复到之前的位置。

5 个回答
新手上路,请多包涵

我突然想到一个css的方法:
先用scrollDom.getBoundingClientRect().top和scrollDom.getBoundingClientRect().left获取滚动位置
然后用样式transform: translate(-滚动宽度, -滚动高度);
就可以实现拟真效果,不过这样滚动条也会消失
在关了弹窗后去掉transform: translate(-滚动宽度, -滚动高度);就行

这个代码是不会影响到页面重回顶部的,应该是其他问题影响到了,最好提供一下整体系统的代码

记录一下滚动的位置然后固定

const showModal = () => {
  const scrollTop = window.scrollY;
  
  document.body.style.position = 'fixed';
  document.body.style.width = '100%';
  document.body.style.top = `-${scrollTop}px`;
};

const hideModal = () => {
  const scrollTop = document.body.style.top;
  document.body.style.position = '';
  document.body.style.width = '';
  document.body.style.top = '';
  
  // 恢复滚动位置
  window.scrollTo(0, parseInt(scrollTop || '0') * -1);
};

或者用阻止默认事件:

let scrollPosition = 0;

const preventDefault = (e) => {
  e.preventDefault();
};

const disableScroll = () => {
  scrollPosition = window.scrollY;
  document.body.style.position = 'fixed';
  document.body.style.top = `-${scrollPosition}px`;
  document.body.style.width = '100%';
  document.addEventListener('touchmove', preventDefault, { passive: false });
};

const enableScroll = () => {
  document.body.style.position = '';
  document.body.style.top = '';
  document.body.style.width = '';
  window.scrollTo(0, scrollPosition);
  document.removeEventListener('touchmove', preventDefault);
};

CSS 方法:

.modal-open {
  position: fixed;
  width: 100%;
  height: 100%;
  overflow: hidden;
}

.modal-container {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
}
const showModal = () => {
  document.body.classList.add('modal-open');
};

const hideModal = () => {
  document.body.classList.remove('modal-open');
};
  • 在进入弹窗的时候,把body设置为样式:height: window.innerHeight + 'px'overflow: hidden
  • 监听弹窗关闭以后,设置body: height: auto, overflow: visible;
export const stopScroll = () => {
  var mo = function (e) {
    e.preventDefault();
  };
  document.body.style.overflow = "hidden";
  document.addEventListener("touchmove", mo, false);
};

export const canScroll = () => {
  var mo = function (e) {
    e.preventDefault();
  };
  document.body.style.overflow = "";
  document.removeEventListener("touchmove", mo, false);
};
推荐问题
宣传栏