使用JavaScript获取滚动条宽度
以下HTML将在div.container的右侧内部边缘显示一个滚动条。
是否有可能确定该滚动条的宽度?
<div class="container" style="overflow-y:auto; height:40px;"> <div class="somethingBig"></div> </div>
这个函数应该给你滚动条的宽度
function getScrollbarWidth() { var outer = document.createElement("div"); outer.style.visibility = "hidden"; outer.style.width = "100px"; outer.style.msOverflowStyle = "scrollbar"; // needed for WinJS apps document.body.appendChild(outer); var widthNoScroll = outer.offsetWidth; // force scrollbars outer.style.overflow = "scroll"; // add innerdiv var inner = document.createElement("div"); inner.style.width = "100%"; outer.appendChild(inner); var widthWithScroll = inner.offsetWidth; // remove divs outer.parentNode.removeChild(outer); return widthNoScroll - widthWithScroll; }
这里的基本步骤是:
- 创build宽度设置为“100px”的隐藏div(外部)并获得偏移宽度(应为100)
- 使用CSS溢出属性强制滚动条出现在div(外部)中
- 创build新的div(内部)并追加到外部,将其宽度设置为“100%”并获得偏移宽度
- 根据收集的偏移量计算滚动条宽度
工作示例: http : //jsfiddle.net/UU9kg/17/
更新
如果您在Windows(metro)应用程序上使用此function,请确保将“外部”div的-ms-overflow-style属性设置为scrollbar
,否则将无法正确检测宽度。 (代码更新)
更新#2这不适用于Mac OS默认的“滚动时只显示滚动条”设置(优胜美地及以上)。
如果孩子获得不包含滚动条的容器的全部宽度(默认值),则可以减去宽度:
var child = document.querySelector(".somethingBig"); var scrollbarWidth = child.parentNode.offsetWidth - child.offsetWidth;
// offsetWidth包含滚动条的宽度, clientWidth不包含。 作为规则,它等于14-18px。 所以:
var scrollBarWidth = element.offsetWidth - element.clientWidth;
假设容器只在页面上一次,而你使用的是jQuery,那么:
var containerEl = $('.container')[0]; var scrollbarWidth = containerEl.offsetWidth - containerEl.clientWidth;
另请参阅此答案了解更多详情。
我用下一个函数来获得滚动条的高度/宽度:
function getBrowserScrollSize(){ var css = { "border": "none", "height": "200px", "margin": "0", "padding": "0", "width": "200px" }; var inner = $("<div>").css($.extend({}, css)); var outer = $("<div>").css($.extend({ "left": "-1000px", "overflow": "scroll", "position": "absolute", "top": "-1000px" }, css)).append(inner).appendTo("body") .scrollLeft(1000) .scrollTop(1000); var scrollSize = { "height": (outer.offset().top - inner.offset().top) || 0, "width": (outer.offset().left - inner.offset().left) || 0 }; outer.remove(); return scrollSize; }
这个基于jQuery的解决scheme适用于IE7 +和所有其他现代浏览器(包括滚动条高度/宽度将为0的移动设备)。
这是一个使用jQuery的简单方法。
var scrollbarWidth = jQuery('div.withScrollBar').get(0).scrollWidth - jQuery('div.withScrollBar').width();
基本上我们从总宽度中减去可滚动的宽度,并且应该提供滚动条的宽度。 当然,你会想要cachingjQuery('div.withScrollBar')select,所以你不会两次做这个部分。
如果您使用jquery.ui,请尝试下面的代码:
$.position.scrollbarWidth()
我认为这将是简单而快速的 –
var scrollWidth= window.innerWidth-$(document).width()
这对我工作..
function getScrollbarWidth() { var div = $('<div style="width:50px;height:50px;overflow:hidden;position:absolute;top:-200px;left:-200px;"><div style="height:100px;"></div>'); $('body').append(div); var w1 = $('div', div).innerWidth(); div.css('overflow-y', 'scroll'); var w2 = $('div', div).innerWidth(); $(div).remove(); return (w1 - w2); }