首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何暂时禁用滚动?

问如何暂时禁用滚动?
EN

Stack Overflow用户
提问于 2011-01-23 03:23:44
回答 45查看 920.9K关注 0票数 500

我正在使用scrollTo jQuery插件,想知道是否可以通过Javascript暂时禁用窗口元素上的滚动?我想禁用滚动的原因是,当你在scrollTo动画中滚动时,它会变得非常丑陋;)

当然,我可以执行$("body").css("overflow", "hidden");,然后在动画停止时将其恢复为自动,但如果滚动条仍然可见但处于非活动状态,效果会更好。

EN

回答 45

Stack Overflow用户

回答已采纳

发布于 2011-01-23 03:55:15

无法取消scroll事件。但是你可以通过取消这些交互事件来实现:

鼠标&触摸滚动和按钮与滚动相关的。

[Working demo]

代码语言:javascript
复制
// left: 37, up: 38, right: 39, down: 40,
// spacebar: 32, pageup: 33, pagedown: 34, end: 35, home: 36
var keys = {37: 1, 38: 1, 39: 1, 40: 1};

function preventDefault(e) {
  e.preventDefault();
}

function preventDefaultForScrollKeys(e) {
  if (keys[e.keyCode]) {
    preventDefault(e);
    return false;
  }
}

// modern Chrome requires { passive: false } when adding event
var supportsPassive = false;
try {
  window.addEventListener("test", null, Object.defineProperty({}, 'passive', {
    get: function () { supportsPassive = true; } 
  }));
} catch(e) {}

var wheelOpt = supportsPassive ? { passive: false } : false;
var wheelEvent = 'onwheel' in document.createElement('div') ? 'wheel' : 'mousewheel';

// call this to Disable
function disableScroll() {
  window.addEventListener('DOMMouseScroll', preventDefault, false); // older FF
  window.addEventListener(wheelEvent, preventDefault, wheelOpt); // modern desktop
  window.addEventListener('touchmove', preventDefault, wheelOpt); // mobile
  window.addEventListener('keydown', preventDefaultForScrollKeys, false);
}

// call this to Enable
function enableScroll() {
  window.removeEventListener('DOMMouseScroll', preventDefault, false);
  window.removeEventListener(wheelEvent, preventDefault, wheelOpt); 
  window.removeEventListener('touchmove', preventDefault, wheelOpt);
  window.removeEventListener('keydown', preventDefaultForScrollKeys, false);
}

更新:修复了带有被动监听器的Chrome桌面和现代移动浏览器

票数 822
EN

Stack Overflow用户

发布于 2012-08-23 18:58:09

只需在正文中添加一个类即可:

代码语言:javascript
复制
.stop-scrolling {
  height: 100%;
  overflow: hidden;
}

在IE,FF,Safari和Chrome中测试,当你想重新启用滚动功能时,添加类,然后删除。

代码语言:javascript
复制
$('body').addClass('stop-scrolling')

对于移动设备,您需要处理touchmove事件:

代码语言:javascript
复制
$('body').bind('touchmove', function(e){e.preventDefault()})

并解除绑定以重新启用滚动。在iOS6和Android2.3.3上测试

代码语言:javascript
复制
$('body').unbind('touchmove')
票数 477
EN

Stack Overflow用户

发布于 2011-01-23 03:29:56

这里有一个非常基本的方法:

代码语言:javascript
复制
window.onscroll = function () { window.scrollTo(0, 0); };

在IE6中它有点跳跃。

票数 73
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4770025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档