How to calculate the width of the scroll bar?
Scrollbar width is simply (offsetWidth - clientWidth) in a borderless! element. This function calculates it on the fly and caches the result for further use. No need need for percentage width etc.
var getScrollbarWidth = function() {
var div, width = getScrollbarWidth.width;
if (width === undefined) {
div = document.createElement('div');
div.innerHTML = '<div style="width:50px;height:50px;position:absolute;left:-50px;top:-50px;overflow:auto;"><div style="width:1px;height:100px;"></div></div>';
div = div.firstChild;
document.body.appendChild(div);
width = getScrollbarWidth.width = div.offsetWidth - div.clientWidth;
document.body.removeChild(div);
}
return width;
};
There is a jQuery plugin that can help with this: https://github.com/brandonaaron/jquery-getscrollbarwidth/blob/master/jquery.getscrollbarwidth.js
Also, from http://www.alexandre-gomes.com/?p=115 Here is some code that may help.
This creates a hidden <p>
element at 100% width inside a <div>
with a scrollbar, then calculates the <div>
width - the <p>
width = scroll bar width.
function getScrollBarWidth () {
var inner = document.createElement('p');
inner.style.width = "100%";
inner.style.height = "200px";
var outer = document.createElement('div');
outer.style.position = "absolute";
outer.style.top = "0px";
outer.style.left = "0px";
outer.style.visibility = "hidden";
outer.style.width = "200px";
outer.style.height = "150px";
outer.style.overflow = "hidden";
outer.appendChild (inner);
document.body.appendChild (outer);
var w1 = inner.offsetWidth;
outer.style.overflow = 'scroll';
var w2 = inner.offsetWidth;
if (w1 == w2) w2 = outer.clientWidth;
document.body.removeChild (outer);
return (w1 - w2);
};
I believe this is a more straightforward solution: (assuming body {width:100%;}
)
function calculateScrollBarWidth() {
return window.innerWidth - document.body.clientWidth;
}
A solution to calculate the scrollbar width of any element (e.g. a div with overflow, or a textarea)
function calculateScrollbarWidth(element) {
if (!element) {
// Return the body scrollbar width, when no element was specified.
return window.innerWidth - document.body.clientWidth;
} else {
// When an element is specified, return its specific scrollbar width.
return element.offsetWidth - element.clientWidth;
}
}
Maybe you could put
overflow-y:scroll;
in your css. This forces the scrollbar to be present even when the text area is blank, so the width is always constant.