如何计算滚动条的宽度?

时间:2011-11-10 12:01:17

标签: javascript html width scrollbar

鉴于<textarea>具有固定width,我希望其“有效宽度”保持不变(在px中)。 “活动宽度”是指文本出现的区域。

当没有出现垂直滚动条时,“活动宽度”等于width。但是,当出现垂直滚动条时,“活动宽度”会小于width(我猜的确小于滚动条的宽度)。

我想确定是否出现垂直滚动条,如果是,则将<textarea>的宽度增加滚动条的宽度。如何识别滚动条的宽度?

有更好的方法吗?

(我对Firefox感兴趣,如果它让生活更轻松。)

9 个答案:

答案 0 :(得分:16)

有一个jQuery插件可以帮助解决这个问题:https://github.com/brandonaaron/jquery-getscrollbarwidth/blob/master/jquery.getscrollbarwidth.js

此外,来自http://www.alexandre-gomes.com/?p=115 以下是一些可能有用的代码。

使用滚动条在<p>内创建100%宽度的隐藏<div>元素,然后计算<div>宽度 - <p> 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); 
}; 

答案 1 :(得分:9)

滚动条宽度简单(offsetWidth - clientWidth)无边框!元件。 此函数可以即时计算并缓存结果以供进一步使用。无需百分比宽度等。

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;
};

答案 2 :(得分:7)

也许你可以把

overflow-y:scroll;

在你的CSS中。即使文本区域为空,这也会强制滚动条出现,因此宽度始终保持不变。

答案 3 :(得分:2)

我正在寻找类似的东西 - 这就是我找到的东西

 function measureScrollbar() {
      var $c = $("<div style='position:absolute; top:-10000px; left:-10000px; width:100px; height:100px; overflow:scroll;'></div>").appendTo("body");
      var dim = {
        width: $c.width() - $c[0].clientWidth,
        height: $c.height() - $c[0].clientHeight
      };
      $c.remove();
      return dim;
    }

来源:Slickgrid使用此 - https://github.com/mleibman/SlickGrid/blob/master/slick.grid.js#L378

使用Google Closure Library - link

/**
 * Returns the scroll bar width (represents the width of both horizontal
 * and vertical scroll).
 *
 * @param {string=} opt_className An optional class name (or names) to apply
 *     to the invisible div created to measure the scrollbar. This is necessary
 *     if some scrollbars are styled differently than others.
 * @return {number} The scroll bar width in px.
 */
goog.style.getScrollbarWidth = function(opt_className) {
  // Add two hidden divs.  The child div is larger than the parent and
  // forces scrollbars to appear on it.
  // Using overflow:scroll does not work consistently with scrollbars that
  // are styled with ::-webkit-scrollbar.
  var outerDiv = goog.dom.createElement('div');
  if (opt_className) {
    outerDiv.className = opt_className;
  }
  outerDiv.style.cssText = 'overflow:auto;' +
      'position:absolute;top:0;width:100px;height:100px';
  var innerDiv = goog.dom.createElement('div');
  goog.style.setSize(innerDiv, '200px', '200px');
  outerDiv.appendChild(innerDiv);
  goog.dom.appendChild(goog.dom.getDocument().body, outerDiv);
  var width = outerDiv.offsetWidth - outerDiv.clientWidth;
  goog.dom.removeNode(outerDiv);
  return width;
};

答案 4 :(得分:2)

使用jQuery,只需写:

function getScrollBarWidth () {
    var $outer = $('<div>').css({visibility: 'hidden', width: 100, overflow: 'scroll'}).appendTo('body'),
        widthWithScroll = $('<div>').css({width: '100%'}).appendTo($outer).outerWidth();
    $outer.remove();
    return 100 - widthWithScroll;
};

答案 5 :(得分:0)

我认为这有助于获得滚动条的宽度。

textarea.scrollHeight

给出的高度很难被使用..

答案 6 :(得分:0)

CSS:

.scrollbar-measure {
  width: 100px;
  height: 100px;
  overflow: scroll;
  position: absolute;
  top: -9999px;
}

Vanilla JS:

// Create the measurement node
var scrollDiv = document.createElement("div");
scrollDiv.className = "scrollbar-measure";
document.body.appendChild(scrollDiv);

// Get the scrollbar width
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
console.warn(scrollbarWidth); // Mac:  15

// Delete the DIV 
document.body.removeChild(scrollDiv);

Solution by David Walsh

答案 7 :(得分:0)

使用jQuery:

var t = jQuery('<textarea/>').css({
    position: 'absolute', 
    top: '-100px',
    overflowX: 'hidden',
    overflowY: 'scroll'
}).prependTo('body'),
w = t[0].offsetWidth - t[0].clientWidth;
console.log('bar width = ', w);
t.remove();

bar width = 18

答案 8 :(得分:0)

我认为这是一个更简单的解决方案:(假设body {width:100%;}

function calculateScrollBarWidth() {
  return window.innerWidth - document.body.clientWidth;
}