¿Cuál es la forma más rápida de comprobar si un elemento tiene barras de desplazamiento?
Una cosa, por supuesto, es verificar si el elemento es más grande que su ventana gráfica, lo que se puede hacer fácilmente verificando estos dos valores:
el.scrollHeight > el.offsetHeight || el.scrollWidth > el.offsetWidth
pero eso no significa que también tenga barras de desplazamiento (por lo que los humanos pueden desplazarlo).
Pregunta
¿Cómo verifico las barras de desplazamiento en 1 navegador cruzado y 2 solo javascript (como sin jQuery )?
Solo Javascript, porque necesito la menor sobrecarga posible, porque me gustaría escribir un filtro selector de jQuery muy rápido
// check for specific scrollbars
$(":scrollable(x/y/both)")
// check for ANY scrollbar
$(":scrollable")
Supongo que tendría que verificar la overflow
configuración de estilo, pero ¿cómo lo hago en un navegador cruzado?
Edición adicional
No solo overflow
configuraciones de estilo. Comprobar si un elemento tiene barra de desplazamiento no es tan trivial como parece. La primera fórmula que escribí arriba funciona bien cuando el elemento no tiene un borde, pero cuando lo tiene (especialmente cuando el borde tiene un ancho considerable), la offset
dimensión puede ser mayor que la scroll
dimensión, pero el elemento aún se puede desplazar. De hecho, tenemos que restar los bordes de la offset
dimensión para obtener la ventana gráfica desplazable real del elemento y compararla con la scroll
dimensión.
Para futura referencia
:scrollable
El filtro selector de jQuery está incluido en mi .scrollintoview()
complemento jQuery. El código completo se puede encontrar en la publicación de mi blog si alguien lo necesita. Aunque no proporcionó la solución real, el código de Soumya me ayudó considerablemente a resolver el problema. Me apuntó en la dirección correcta.
fuente
overflow:hidden
asentado? Habría contenido en exceso, pero aún no es desplazable. El problema no es tan simple como parece.div.scrollHeight>div.clientHeight && !(div.style.overflow && div.style.overflow == 'hidden')
)?Tratar:
Para barra de desplazamiento vertical
Para barra de desplazamiento horizontal
Sé que esto funciona para IE8 y Firefox 3.6+ al menos.
fuente
overflow:hidden
y ya no sería desplazable.overflow:hidden
... esta sigue siendo la respuesta correcta en mi opinión, ya que es la más simple.Esto puede parecer (o ser) un poco complicado, pero puede probar las propiedades
scrollTop
yscrollLeft
.Si son mayores que 0, sabrá que hay barras de desplazamiento. Si son 0, configúrelos en 1 y pruébelos nuevamente para ver si obtiene un resultado de 1. Luego, vuelva a configurarlos en 0.
Ejemplo: http://jsfiddle.net/MxpR6/1/
Creo que hay una propiedad diferente para IE, así que lo actualizaré en un minuto.EDITAR: Parece que IE puede admitir esta propiedad. (No puedo probar IE en este momento).
http://msdn.microsoft.com/en-us/library/ms534618(VS.85).aspx
fuente
offsetHeight
yclientHeight
. Este último es siempre menor por el tamaño de la barra de desplazamiento cuando la barra de desplazamiento está presente.overflow:scroll
, desea que se informe como desplazable, ya sea que las barras de desplazamiento estén habilitadas o no. Por supuesto, mi solución podría tener problemas si hay un evento onscroll adjunto.Aquí hay otra solución:
Como señalaron algunas personas, simplemente comparar offsetHeight y scrollHeight no es suficiente ya que difieren en elementos con desbordamiento oculto, etc., que aún no tienen barras de desplazamiento. Entonces, aquí también estoy verificando si el desbordamiento es de desplazamiento o automático en los estilos calculados para el elemento:
fuente
overflow*
esscroll
que siempre habrá una barra de desplazamiento, así que creo que quieresvertical: overflowY === 'scroll' || overflowY === 'auto' && node.scrollHeight > node.clientHeight
, etc (es decir, eliminar los soportes de manerascroll*
vsclient*
está comprobado solamente cuandooverflow*
esauto
). De lo contrario, esta parece ser la solución más correcta.Tal vez llegue un poco tarde a la fiesta, pero ...
Creo que puede detectar barras de desplazamiento con e.offsetWidth frente a e.clientWidth. El ancho de compensación incluye bordes y barras de desplazamiento, relleno y ancho. El ancho del cliente incluye relleno y ancho. Por favor mira:
https://developer.mozilla.org/en/DOM/element.offsetWidth (segunda imagen) https://developer.mozilla.org/en/DOM/element.clientWidth (segunda imagen)
Necesitas comprobar:
Haga lo mismo para la vertical (offset / clientHeight).
IE7 informa un clientHeight de 0 para algunos elementos (no he verificado por qué), por lo tanto, siempre necesita la primera verificación de desbordamiento.
¡Espero que esto ayude!
fuente
Hay varios problemas en caso de verificar la existencia de barras de desplazamiento, uno de los cuales es que en Mac no tiene ninguna barra de desplazamiento visible, por lo que las dos soluciones anteriores no le darían una respuesta precisa.
Entonces, debido a que la representación del navegador no es muy frecuente, puede verificar el desplazamiento con el cambio de desplazamiento y luego volver a configurarlo:
fuente
Simplemente jugando aquí ya que ninguna de las soluciones anteriores funcionó para mí (hasta ahora). He tenido cierto éxito al comparar la altura de desplazamiento de una div con su altura de desplazamiento.
Parece darme una comparación precisa ... hasta ahora. ¿Alguien sabe si esto es legítimo?
fuente
Para IE11 (Internet Explorer 11) tuve que cambiar la lógica a:
Esto se debe a que IE informa scrollHeight como 1 más grande que clientHeight cuando no hay barra de desplazamiento, pero aproximadamente 9 más grande cuando hay una barra de desplazamiento.
fuente
Si necesita saber si hay una barra de desplazamiento presente para toda la página web y con soporte completo del navegador , puede usar esto:
Es importante usarlo en
window.innerHeight
lugar dedocument.body.clientHeight
porque en algunos navegadores móviles clientHeight no obtendrá el tamaño de la barra de direcciones, pero scrollHeight sí, por lo que obtendrá cálculos incorrectos.fuente
ninguna de estas respuestas es correcta. tienes que usar esto:
fuente
Agrega un elemento 100% ancho en su interior. Luego, establezca el desbordamiento en oculto. Si cambia el estilo calculado del elemento (de jQ), el padre tenía una barra de desplazamiento.
EDITAR: Parece que desea un método de navegador cruzado como getComputedStyle . Tratar:
fuente
$(el).css("overflow/overflowX/overflowY")
y ver si está configurado en automático o en desplazamiento . Pero me gustaría evitar usar jQuery.computedStyle = el.currentStyle || document.defaultView.getComputedStyle(el, null);