2011-09-21 20 views
6

¿Hay alguna manera fácil de obtener el ancho de una barra de desplazamiento usando javascript/jquery? Necesito obtener el ancho de un div que se desborda + el ancho que tenga la barra de desplazamiento.ancho de barra de desplazamiento div

Gracias

Respuesta

12

si estás usando jQuery, intente esto:

function getScrollbarWidth() 
{ 
    var div = $('<div style="width:50px;height:50px;overflow:hidden;position:absolute;top:-200px;left:-200px;"><div style="height:100px;"></div></div>'); 
    $('body').append(div); 
    var w1 = $('div', div).innerWidth(); 
    div.css('overflow-y', 'auto'); 
    var w2 = $('div', div).innerWidth(); 
    $(div).remove(); 
    return (w1 - w2); 
} 

estoy usando esto en el proyecto que estoy trabajando y funciona como un encanto. se pone la barra de desplazamiento de ancho por:

  1. añadiendo un div con el desbordamiento de contenido para el cuerpo (en una zona no visible, -200px a la parte superior/izquierda)
  2. conjunto de desbordamiento a hidden
  3. obtener el anchura
  4. conjunto de desbordamiento a auto (para obtener barras de desplazamiento)
  5. obtener el ancho
  6. restar ambas anchuras para conseguir la anchura de la barra de desplazamiento

así que lo que usted tiene que hacer es conseguir que el ancho de la div ($('#mydiv').width()) y añadir la barra de desplazamiento de ancho:

var completewidth = $('#mydiv').width() + getScrollbarWidth(); 
+0

lamentablemente no funciona con MacOS león barras de desplazamiento ... – jedierikb

0

Aquí es una llanura javascript versión que es mucho más rápido.

function getScrollbarWidth() { 
    var div, body, W = window.browserScrollbarWidth; 
    if (W === undefined) { 
    body = document.body, div = document.createElement('div'); 
    div.innerHTML = '<div style="width: 50px; height: 50px; position: absolute; left: -100px; top: -100px; overflow: auto;"><div style="width: 1px; height: 100px;"></div></div>'; 
    div = div.firstChild; 
    body.appendChild(div); 
    W = window.browserScrollbarWidth = div.offsetWidth - div.clientWidth; 
    body.removeChild(div); 
    } 
    return W; 
}; 
2

Configuración de desbordamiento de un div a "scroll" agrega automáticamente scrollbars (incluso si no hay nada dentro, el scrollbars estará allí, pero de color gris). Así que acaba de hacer un div, encontrar el ancho, ajuste de desbordamiento para desplazarse y encontrar la nueva anchura, y devolver la diferencia:

function getScrollBarWidth() { 
    var helper = document.createElement('div'); 
    helper.style = "width: 100px; height: 100px; overflow:hidden;" 
    document.body.appendChild(helper); 
    var bigger = helper.clientWidth; 
    helper.style.overflow = "scroll"; 
    var smaller = helper.clientWidth; 
    document.body.removeChild(helper); 
    return(bigger - smaller); 
} 
+0

Por curiosidad, ¿funciona esto para las versiones recientes de safari en mac, donde la barra de desplazamiento solo aparece cuando se pasa el mouse sobre ella? Solo pregunto porque recientemente pasé años intentando encontrar el ancho de las barras de desplazamiento en esa situación antes de darme por vencido y declarar que los tres usuarios de Mac Safari podrían lidiar con el salto de 5 o 6 píxeles. Acabo de intentar controlarme pero descubrí que la versión de Windows de safari no parece mostrar el mismo comportamiento. EDITAR: Eso es porque no es Safari, pero Lion es quien hace esto. Supongo que estas soluciones pueden no funcionar para Lion entonces. –

3

probar esto

$("#myDiv")[0].scrollWidth

Cuestiones relacionadas