Obtener el ancho de la barra de desplazamiento usando JavaScript [duplicado]

Resuelto user1032531 asked hace 11 años • 9 respuestas

El siguiente HTML mostrará una barra de desplazamiento en el borde interior derecho de div.container.

¿Es posible determinar el ancho de esa barra de desplazamiento?

<div class="container" style="overflow-y:auto; height:40px;">
  <div class="somethingBig"></div>
</div>
user1032531 avatar Nov 14 '12 23:11 user1032531
Aceptado

Esta función debería darle el ancho de la barra de desplazamiento.

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;

}

Los pasos básicos aquí son:

  1. Cree un div oculto (exterior) y obtenga su ancho de desplazamiento
  2. Forzar que las barras de desplazamiento aparezcan en div (exterior) usando la propiedad de desbordamiento de CSS
  3. Cree un nuevo div (interior) y añádalo al exterior, establezca su ancho en '100%' y obtenga el ancho de desplazamiento
  4. Calcular el ancho de la barra de desplazamiento en función de las compensaciones recopiladas

Ejemplo de trabajo aquí: http://jsfiddle.net/slavafomin/tsrmgcu9/

Actualizar

Si está usando esto en una aplicación de Windows (metro), asegúrese de configurar la propiedad -ms-overflow-style del div 'externo' en scrollbar; de lo contrario, el ancho no se detectará correctamente. (código actualizado)

Actualización n.° 2 Esto no funcionará en Mac OS con la configuración predeterminada "Mostrar solo barras de desplazamiento al desplazarse" (Yosemite y versiones posteriores).

lostsource avatar Nov 14 '2012 16:11 lostsource

offsetWidthincluye el ancho de la barra de desplazamiento y clientWidthno. Como regla general, equivale a 14-18 px. Entonces:

let scrollBarWidth = element.offsetWidth - element.clientWidth;

Eso devolverá 0 si el elemento no tiene actualmente una barra de desplazamiento, así que aquí hay una función simple que calcula el ancho de la barra de desplazamiento del navegador creando un elemento temporal que tiene una barra de desplazamiento:

function getScrollBarWidth() {
  let el = document.createElement("div");
  el.style.cssText = "overflow:scroll; visibility:hidden; position:absolute;";
  document.body.appendChild(el);
  let width = el.offsetWidth - el.clientWidth;
  el.remove();
  return width;
}
Vasyl Gutnyk avatar Nov 12 '2016 23:11 Vasyl Gutnyk