首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js怎么禁止页面滑动事件

在JavaScript中,如果你想要禁止页面的滚动,可以通过以下几种方法实现:

基础概念

页面滚动通常是由用户的鼠标滚轮操作或者触摸屏上的滑动操作触发的。通过JavaScript,我们可以监听这些事件并阻止它们的默认行为,从而达到禁止滚动的效果。

相关优势

  • 用户体验:在某些情况下,如弹出层显示时,禁止背景滚动可以避免用户在操作弹出层时意外滚动页面,从而提升用户体验。
  • 内容聚焦:确保用户能够专注于当前视图中的内容,不被其他部分分散注意力。

类型与应用场景

  • 临时禁止滚动:例如,在打开模态框或全屏菜单时。
  • 永久禁止滚动:适用于某些特定的应用场景,如单页应用的某些页面。

实现方法

方法一:使用CSS

通过设置overflow: hiddenbodyhtml元素上,可以快速禁止滚动。

代码语言:txt
复制
body.no-scroll {
  overflow: hidden;
}

然后在JavaScript中添加或移除这个类:

代码语言:txt
复制
function disableScroll() {
  document.body.classList.add('no-scroll');
}

function enableScroll() {
  document.body.classList.remove('no-scroll');
}

方法二:监听事件并阻止默认行为

你可以监听wheeltouchmove事件,并在事件处理函数中调用event.preventDefault()来阻止滚动。

代码语言:txt
复制
function preventDefault(e) {
  e.preventDefault();
}

function disableScroll() {
  window.addEventListener('wheel', preventDefault, { passive: false });
  window.addEventListener('touchmove', preventDefault, { passive: false });
}

function enableScroll() {
  window.removeEventListener('wheel', preventDefault);
  window.removeEventListener('touchmove', preventDefault);
}

注意:在某些浏览器中,{ passive: false }是必须的,否则preventDefault可能不会生效。

可能遇到的问题及解决方法

1. 页面仍然可以滚动

确保在添加事件监听时使用了{ passive: false }选项,并且在不需要禁止滚动时及时移除事件监听。

2. 触摸设备上的问题

在触摸设备上,可能需要额外处理touchmove事件,确保所有相关的滚动事件都被阻止。

3. 滚动位置的恢复

如果你在禁止滚动后需要恢复到之前的滚动位置,可以在禁止滚动前记录当前的滚动位置,并在恢复滚动时设置回去。

代码语言:txt
复制
let scrollPosition = 0;

function disableScroll() {
  scrollPosition = window.pageYOffset;
  document.body.classList.add('no-scroll');
}

function enableScroll() {
  document.body.classList.remove('no-scroll');
  window.scrollTo(0, scrollPosition);
}

通过上述方法,你可以有效地控制页面的滚动行为,根据不同的应用场景选择合适的方法来实现需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

禁止遮罩下页面滑动

最近在业务中遇见一个问题,就是弹出一个蒙版,覆盖整个页面,有一部分内容固定在底部。可是底部内容还是能滑动。 我相信在蛮多场景下是需要做到蒙版的时候底部禁止滑动。尤其是手机端。...如果弹出的内容不需要滚动,直接禁止touchmove或者touchstart: var content = document.getElementsByTagName('body')[0]; content.addEventListener...')[0]; content.addEventListener('touchmove', function (e) { e.preventDefault(); }, false) 这两个都是禁止...touch事件,在移动端有效,在PC端用滚轮滑动就禁止不了。...在这边要分享一件事,就是在微信下,当你滑动的时候,透过遮罩触发了body,那么微信默认进行一个进程一样,得等一下才能滑动遮罩上面的元素。暂时没有优化的方法,当然,遮罩没有透明度不会出现。 (完)

2.1K30
  • JS的页面生命周期事件

    今天做个大屏项目, 想在大屏加载所有资源前加个加载动画, 加载结束再移除, 当然肯定时在load事件里进行移除, 但是对其他的事件有点模糊了, 复习一下哦垃圾 生命周期事件 DOMContentLoaded...DOMContentLoaded DOMContentLoaded 事件发生在 document 对象上, 必须使用document对象上 2. window.onload 当包括样式、图像和其他资源的页面被全部加载时...,window 对象上的 load 事件就会被触发 3. window.onunload 当访问者离开页面时,window 对象上的 unload 事件就会被触发。...我们可以在那里做一些不涉及延迟的事件,比如关闭相关的弹出窗口 可以在用户离开时, 使用unload事件发送我们想要保存在服务器上的数据 参考https://w3c.github.io/beacon/,...当 sendBeacon 请求完成的时候,浏览器可能已经离开了文档,所以就没办法获取服务器的响应数据 4. window.onbeforeunload 如果访问中触发了离开页面的导航或试图关闭窗口,beforeunload

    3.4K30

    JS魔法堂:定义页面的Dispose方法——unload事件启示录

    这么多操作会触发这两兄弟,怎么处理才好啊?没啥办法,针对功能需求做取舍咯。对于我的需求就是在页面的Dispose方法中调用登出API,经过和实施同事的沟通——只要刷新页面就触发登出。...(unload事件的Cancelable属性值为No)  那么反过来看看beforeunload事件,这时页面状态大致与平常一致: 页面所有资源均未释放,且页面可视区域效果没有变化; UI人机交互失效(...的JS异常,而firefox下则连异常都懒得报。  既然不给用window.confirm,那么如何弹出二次确定对话框呢?其实beforeunload事件已经为我们准备好了。...那怎么办呢?既然读操作不行那采用嵌套Cross-domain资源总行吧。...以前,当我们从页面A跳转到页面B时,页面A的所有资源将被释放(销毁DOM对象,回收JS对象, 释放解码后的Image资源等);后来各大浏览器厂商分别采用bfcache/page cache/fast history

    2.4K90

    jimojianghu

    然而那能怎么办,用户第一,自然得快速解决这个问题,而且是触控板和触摸屏都得解决。 在以前,如果要禁止移动端设备的触摸屏上,手指缩小放大的功能,都会想到使用viewport 来处理。...触控板 要禁止触控板的缩放行为,需要处理鼠标滚轮事件:wheel 。 因为笔记本触摸板双指滑动,将响应该事件,如果对该事件阻止默认行为,就能解决缩放问题了。...) { // event.stopPropagation() // }) 触摸屏 要禁止触摸屏的手指缩放,可以使用如下的 CSS 和 JS 两种方法。...js 处理 使用js代码来禁止触摸屏的手指缩放,和处理触控板类似的,这里主要是监听几个手势事件,touchstart, touchend, touchmove等。...笔记本触摸板双指滑动,将响应滚轮事件,因此可以监听该事件,禁止触摸板手指缩放界面。 但需要注意滚轮默认事件,如会导致子元素滚动失效,这时候就要在子元素上阻止相同事件冒泡。

    3.8K00

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

    关键代码: JS控制弹窗的交互、body的禁止滚动 ? css添加弹层的超出滚动效果 ? 局限问题: 弹层中内容滚动到顶部或底部后,还会连带页面body一起滚动。也就是还会发生穿透效果。...真正的问题是当我们滑动弹窗可滚动区域,把可滚动区域的内容上滑到底部或下拉到顶部后,再触发弹窗可滚动区域准备滑动,此时的背景页面就会跟随滚动。真是恐怖。...因此还需要我们对弹层的可滚动区域的滑动事件做监听: 第一种情况,若向上滑动时,到达底部;或者第二种情况,若向下滑动时,已到顶部。 这两种情况任意一种发生时,就阻止滑动事件。 这段逻辑代码如下: ?...关键代码: js控制弹窗的交互、弹窗的禁止滚动 ? 局限问题: 因为touchmove被禁掉了,就会造成弹窗内部所有位置都不能响应touchmove事件,效果上就是弹窗内部不能再滚动了。...解决方案与思路: 具体制作思路写在js注释上。 1、交互代码 ? 2、禁掉弹窗的touchmove 的默认事件 ? 3、重写手势滑动效果 ?

    13.8K31

    移动端的那些坑

    ://www.joycesong.com/arch… ios版本:11.1-11.3 使用swiper或者transform属性时,有一定概率出现transform的元素以外的所有  元素都消失,上下滑动一下页面又出现了...部分机型touchmove事件不连续触发 Android的事件每次都要经过浏览器内核再发往UI线程,为了提高效率,如果浏览器内核中没有设置preventDefault,Android就认为该页面元素不需要...touchmove事件,于是下次的事件就不经过内核,直接发往UI线程,于是js中就捕获不到touchmove事件。...视图模型新增了一些 scroll 相关的方法,参考:https://drafts.csswg.org/csso… polyfill:https://github.com/iamdustan/… 综合问题 禁止页面滑动...当你需要禁止移动端页面滑动的时候,在iOS下,需要禁止页面中的touchmove事件,在安卓下,需要给html, body元素加上如下CSS:height:100%;overflow:hidden;。

    1.8K30
    领券