如何禁用浏览器或元素滚动条,但仍允许使用滚轮或箭头键滚动?

IT技术 javascript jquery css browser scrollbar
2021-01-11 19:56:10

我想从我的div元素和我的整体中隐藏任何滚动条body,但仍然让用户使用鼠标滚轮或箭头键滚动。如何使用原始 JavaScript 或 jQuery 实现这一点?有任何想法吗?

6个回答

与之前的答案一样,您将使用overflow:hidden禁用 body/div 上的滚动条。

然后您将mousewheel事件绑定到一个函数,该函数将更改scrollTopdiv 的 以模拟滚动。

对于箭头键,则可以将绑定keydown识别箭头键的事件,然后更改scrollTopscrollLeft股利的适当效仿滚动。(注意:您使用keydown而不是keypress因为 IE 无法识别keypress箭头键。)
编辑:我无法让 FF/Chromekeydown在 div上识别,但它适用于 IE8。根据您的需要,您可以在 上设置一个keydown侦听器document来滚动 div。(以 keyCode 参考为例。)

例如,使用鼠标滚轮滚动(使用 jQuery 和鼠标滚轮插件):

<div id="example" style="width:300px;height:200px;overflow:hidden">
insert enough text to overflow div here
</div>

<script>
$("#example").bind("mousewheel",function(ev, delta) {
    var scrollTop = $(this).scrollTop();
    $(this).scrollTop(scrollTop-Math.round(delta));
});
</script>

(这是一个快速模型,你必须调整数字,因为对我来说,这滚动得有点慢。)

keyCode 参考
mousewheel 插件
keydown, keypress @ quirksmode

2012 年 12 月 19 日更新:

鼠标滚轮插件的更新位置在: https://github.com/brandonaaron/jquery-mousewheel

如果您想隐藏 BODY 上的滚动条,然后将鼠标滚轮绑定到身体滚动,我就很难让它工作。
2021-04-04 19:56:10
@DavidBarnes 嗯看起来很多东西在 3 年后就过时了。我必须从 github 获取更新的鼠标滚轮插件,并且要滚动才能工作,我必须绑定到文档而不是正文。这是我的例子:pastebin.com/U08b6MCx
2021-04-09 19:56:10
来自@radry 的评论:顶级答案中建议的解决方案不再有效,甚至“更新”评论也无效。至少我的鼠标滚轮什么都不做。2014年如何解决这个问题?
2021-04-09 19:56:10

纯 CSS 解决方案怎么样?我已经测试过了,它工作正常。但是,我会推荐解决方案 3,因为它并不笨拙,所有带有 JS 的浏览器都支持它,而且它非常简单。

解决方案 1(跨浏览器但更笨拙)

#div {
  position: fixed;
  right: -20px;
  left: 20px;
  background-color: black;
  color: white;
  height: 5em;
  overflow-y: scroll;
  overflow-x: hidden;
}
<html>

<body>
  <div id="div">
    Scrolling div with hidden scrollbars!<br/>
    On overflow, this div will scroll with the mousewheel but scrollbars won't be visible.<br/>
    Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>
  </div>
</body>

</html>

解决方案 2(仅限 IE 和 Chrome)

只需将该nobars添加到您想要隐藏滚动条的任何元素。

Firefox的overflow: -moz-scrollbars-none是,根据MDN,已经过时了。它曾经可以工作,但现在会隐藏溢出并禁用滚动(如果使用)。

.nobars {
    /* Firefox: https://developer.mozilla.org/en/docs/Web/CSS/overflow */
    /* overflow: -moz-scrollbars-none; (no longer works) */
    /* IE: https://msdn.microsoft.com/en-us/library/hh771902(v=vs.85).aspx */
    -ms-overflow-style: none;
}
.nobars::-webkit-scrollbar {
    /* Chrome: https://css-tricks.com/custom-scrollbars-in-webkit/ */
    display: none;
}

解决方案3(跨浏览器javascript)

Perfect Scrollbar不需要 jQuery(尽管如果安装了它可以使用 jQuery)并且有一个演示可用在这里可以使用 css 对组件进行样式设置,例如在以下示例中:

.ps-scrollbar-y-rail {
  display: none !important;
}

这是一个完整的例子,包括完美滚动条的实现:

<link rel="stylesheet" href="css/perfect-scrollbar.min.css">
<style>
  #container {
    position: relative; /* can be absolute or fixed if required */
    height: 200px; /* any value will do */
    overflow: scroll;
  }
  .ps-scrollbar-y-rail {
    display: none !important;
  }
</style>
<script src='js/perfect-scrollbar.min.js'></script>

<div id="container">
  Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>
</div>

<script>
  // on dom ready...
  var container = document.getElementById("container");
  Ps.initialize(container);
  //Ps.update(container);
  //Ps.destroy(container);
</script>
我明白你的意思了。您可以单独在其后面创建背景以解决此问题,并使其与滚动 <div> 的大小相同。
2021-03-16 19:56:10
似乎-moz-scrollbars-none实际上禁用了滚动。或者有没有办法将它与overflow:auto某种方式结合起来
2021-03-28 19:56:10
@phreakhead 添加了第三个方法,该方法依赖于 JS 而不是 jQuery。在某些情况下,其他解决方案可能仍然有用。
2021-04-05 19:56:10
这曾经有效,大概不再如此。看起来 Javascript 是唯一的选择,直到将其添加到 Firefox :(
2021-04-07 19:56:10

您不必使用 jquery 或 js 来实现这一点。它使用简单的 webkit 性能更高。

只需将下面的代码添加到您的 css 文件中。

::-webkit-scrollbar { 
    display: none; 
}

小心!这将禁用所有滚动条,因此如果您只想隐藏一个,请确保将其放在特定的类或 id 中。

@TheLightSabrix 您可能对我上面的 IE、Chrome 和 Firefox 回答感兴趣(请参阅解决方案 2)。我没有费心研究任何其他浏览器,如果您希望我特别尝试任何浏览器,请发表评论。
2021-04-09 19:56:10
是的,但它在其他浏览器中不起作用。据我所知,目前只有 webkit 浏览器允许自定义滚动条。您知道这样的跨浏览器解决方案吗?
2021-04-10 19:56:10

我更喜欢 SamGoody 为这个问题的副本提供的答案。它保持原生滚动效果不变,而不是尝试为一些特定的输入设备手动重新实现:

更好的解决方案是将目标 div 设置为 overflow:scroll,并将其包裹在第二个窄 8px 的元素中,即 overflow:hidden。

有关充实的示例,请参阅原始评论您可能希望使用 JavaScript 来确定滚动条的实际大小,而不是像他的示例那样假设它们总是 8px 宽。

很好的建议,但不适用于 Mac,因为它们没有滚动条
2021-03-22 19:56:10

为了让这个对我有用,我使用了这个 CSS:

html { overflow-y: hidden; }

但是我在使用时遇到了问题$(this).scrollTop(),所以我绑定到我的#id,但是调整了窗口的 scrollTop。此外,我的平滑滚动鼠标会触发大量 1 或 -1 的增量,因此我将其乘以 20。

$("#example").bind("mousewheel", function (ev, delta) {
    var scrollTop = $(window).scrollTop();
    $(window).scrollTop(scrollTop - Math.round(delta * 20));
});
惊人的。就我而言,这正是overflow-x: hidden我所需要的。谢谢!
2021-03-31 19:56:10