使用 JavaScript 获取滚动条宽度

IT技术 javascript
2021-01-31 07:42:00

下面的 HTML 将在 div.container 的右内边缘显示一个滚动条。

是否可以确定该滚动条的宽度?

<div class="container" style="overflow-y:auto; height:40px;">
  <div class="somethingBig"></div>
</div>
6个回答

这个函数应该给你滚动条的宽度

function getScrollbarWidth() {

  // Creating invisible container
  const outer = document.createElement('div');
  outer.style.visibility = 'hidden';
  outer.style.overflow = 'scroll'; // forcing scrollbar to appear
  outer.style.msOverflowStyle = 'scrollbar'; // needed for WinJS apps
  document.body.appendChild(outer);

  // Creating inner element and placing it in the container
  const inner = document.createElement('div');
  outer.appendChild(inner);

  // Calculating difference between container's full width and the child width
  const scrollbarWidth = (outer.offsetWidth - inner.offsetWidth);

  // Removing temporary elements from the DOM
  outer.parentNode.removeChild(outer);

  return scrollbarWidth;

}

这里的基本步骤是:

  1. 创建隐藏的 div(外部)并获取它的偏移宽度
  2. 使用 CSS 溢出属性强制滚动条出现在 div(外部)中
  3. 创建新的 div(内部)并附加到外部,将其宽度设置为 '100%' 并获得偏移宽度
  4. 根据收集的偏移量计算滚动条宽度

这里的工作示例:http : //jsfiddle.net/slavafomin/tsrmgcu9/

更新

如果您在 Windows(地铁)应用程序上使用它,请确保将“外部”div-ms-overflow-style属性设置scrollbar,否则将无法正确检测宽度。(代码更新)

更新 #2 这不适用于 Mac OS 的默认“滚动时仅显示滚动条”设置(优胜美地及以上)。

如果您有错误:Uncaught TypeError: Cannot read property 'appendChild' of null 这可以通过下一行代码修复:if (document.body == null) return 0; 之前document.body.appendChild(outer);
2021-03-15 07:42:00
无法在 Chromebook 上的 Chrome 中运行
2021-03-26 07:42:00
好的。如果您使用附加到函数的闭包来缓存值并返回它,那么您可以使它变得更好,这样函数只需要创建/销毁 div 并计算一次值。
2021-03-29 07:42:00
这是一个非常棒的解决方案。谢谢你。
2021-04-02 07:42:00
不幸的是,这在 IE7 中对我不起作用(我需要支持)。
2021-04-06 07:42:00

// offsetWidth包含滚动条的宽度,clientWidth包含通常,它等于 14-18px。所以:

 var scrollBarWidth = element.offsetWidth - element.clientWidth;
我在 Windows 10 上的 Chrome 64 和 FireFox 58 上测试了这个解决方案,并且在我看来这是迄今为止最干净的解决方案。我想@DavidGuan 必须在 Mac OS X 上运行?在这种情况下,滚动条是一个叠加层,实际上并不影响 DOM 的几何形状,因此我希望 offsetWidth 和 clientWidth 在 Mac 上始终相等,除非您使用的是非 Mac 鼠标。
2021-03-20 07:42:00
offsetWidth 不包括滚动条,至少在当前最新的 chrome 中
2021-04-04 07:42:00
@DavidGuan 好的,我会检查的
2021-04-04 07:42:00
document.body.offsetWidth 不包括滚动条,但 myElement.offsetWidth 不包括滚动条,只要它不是正文。
2021-04-04 07:42:00
应该包括你如何到达的代码 element
2021-04-11 07:42:00

我认为这将是简单而快速的-

var scrollWidth= window.innerWidth-$(document).width()
@Scott Leonard 如果您有overflow:hiddenhtml 和 body,这将不起作用插入<div>就是确保有一个带滚动条的元素。
2021-03-31 07:42:00
我在用这个,不知道为什么你需要插入一个 DIV const scrollbarWidth = window.innerWidth - document.body.offsetWidth
2021-04-02 07:42:00

如果孩子占据容器的整个宽度,不包括滚动条(默认),那么您可以减去宽度:

var child = document.querySelector(".somethingBig");
var scrollbarWidth = child.parentNode.offsetWidth - child.offsetWidth;
孩子不会占用容器的整个宽度。
2021-03-14 07:42:00
我应该显示不同的 HTML。div.somethingBig 实际上是一张桌子,而不是一个 div,它会又窄又高。我的错。
2021-03-20 07:42:00
杰出的!谢谢!
2021-04-02 07:42:00

如果你使用jquery。ui,试试这个代码:

$.position.scrollbarWidth()
其他 jQuery 新手的注意事项:这需要 jQuery 和 jQuery.UI(但是它确实返回滚动条宽度,而上面的其他方法对我来说在 Firefox 中不起作用。)例如, <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script> <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
2021-03-16 07:42:00