Solo quiero que JQ / JS simple verifique si la página / ventana actual (no un elemento en particular) tiene una barra de desplazamiento vertical.
Googlear me da cosas que parecen demasiado complejas solo por esta característica básica.
¿Cómo se puede hacer esto?
javascript
jquery
scroll
Leñoso
fuente
fuente
overflow
propiedad debody
se establece enhidden
algún lugar a lo largo de la línea, no funcionará. Sin embargo, la configuración oculta en un cuerpo es extremadamente rara.$(document)
lugar de$("body")
, esto funcionó para mí cuando el cuerpo no lo hizo (tengo un contenedor positivamente absoluto con una relación de aspecto en ancho / alto)prueba esto:
Sin embargo, esto solo le indicará si el scrollHeight vertical es mayor que la altura del contenido visible. La
hasVScroll
variable contendrá verdadero o falso.Si necesita hacer una verificación más exhaustiva, agregue lo siguiente al código anterior:
fuente
cStyle.overflow === 'scroll'
?cStyle.overflow == "visible"
puede mostrar barras de desplazamiento cuando el elemento es eldocument.body
. Pero debería ser (hasVScroll && cStyle.overflow == "visible" && element.nodeName == "BODY"). Además, debe verificarlocStyle.overflow === 'scroll'
como usted señala.Intenté la respuesta anterior y parece que no funciona $ ("body"). Height () no necesariamente representa la altura html completa.
He corregido la solución de la siguiente manera:
fuente
Traigamos esta pregunta de la muerte;) Hay una razón por la cual Google no le da una solución simple. Los casos especiales y las peculiaridades del navegador afectan el cálculo, y no es tan trivial como parece ser.
Desafortunadamente, hay problemas con las soluciones descritas aquí hasta ahora. No pretendo menospreciarlos en absoluto: son excelentes puntos de partida y tocan todas las propiedades clave necesarias para un enfoque más sólido. Pero no recomendaría copiar y pegar el código de ninguna de las otras respuestas porque
$( document ).width()
y.height()
son víctimas de la detección de errores de jQuery del tamaño del documento .window.innerWidth
, si el navegador lo admite, hace que su código no detecte las barras de desplazamiento en los navegadores móviles, donde el ancho de la barra de desplazamiento es generalmente 0. Simplemente se muestran temporalmente como una superposición y no ocupan espacio en el documento . Zoom en dispositivos móviles también se convierte en un problema de esa manera (larga historia).html
y elbody
elemento a los valores no predeterminados (lo que sucede a continuación es un poco involucrados - ver esta descripción ).He pasado más tiempo del que hubiera imaginado para encontrar una solución que "simplemente funcione" (tos). El algoritmo que se me ocurrió ahora es parte de un complemento, jQuery.isInView , que expone un
.hasScrollbar
método . Echa un vistazo a la fuente si lo deseas.En un escenario en el que tienes el control total de la página y no tienes que lidiar con CSS desconocido, usar un complemento puede ser excesivo; después de todo, sabes qué casos límite se aplican y cuáles no. Sin embargo, si necesita resultados confiables en un entorno desconocido, entonces no creo que las soluciones descritas aquí sean suficientes. Es mejor usar un complemento bien probado: el mío o el de cualquier otra persona.
fuente
window.scrollbars
objeto que tiene una sola propiedadvisible
,. Suena prometedor pero no lo es. No es compatible con IE, incluido IE11. Y solo te dice que hay una barra de desplazamiento, pero no cuál. Vea la página de prueba aquí .Este sí funciona para mí:
Para el cuerpo, solo use
hasVerticalScroll()
.fuente
clientHeight
Es preferible poroffsetHeight
aquí. De lo contrario, puede tener un borde grueso y volver no hay barra de desplazamiento cuando la hay.fuente
Curiosamente, ninguna de estas soluciones le dice si una página tiene una barra de desplazamiento vertical.
window.innerWidth - document.body.clientWidth
le dará el ancho de la barra de desplazamiento. Esto debería funcionar en cualquier cosa IE9 + (no probado en los navegadores menores). (O para responder estrictamente a la pregunta,!!(window.innerWidth - document.body.clientWidth)
¿Por qué? Supongamos que tiene una página donde el contenido es más alto que la altura de la ventana y el usuario puede desplazarse hacia arriba / abajo. Si está utilizando Chrome en una Mac sin un mouse conectado, el usuario no verá una barra de desplazamiento. Conecte un mouse y aparecerá una barra de desplazamiento. (Tenga en cuenta que este comportamiento puede anularse, pero ese es el AFAIK predeterminado).
fuente
Encontré solución de vainilla
fuente
window.innerWidth > document.documentElement.clientWidth
es cierto, perowindow.innerHeight > document.documentElement.clientHeight
no lo es. Parece como si fuera al revés en este caso. No soy un desarrollador de JS, solo lo necesito para las pruebas de Selenium. Estoy agradecido por las pistas.Este te dirá si tienes una barra de desplazamiento o no. He incluido información que puede ayudar con la depuración, que se mostrará como una alerta de JavaScript.
Ponga esto en una etiqueta de script, después de la etiqueta de cierre del cuerpo.
fuente
Escribí una versión actualizada de la respuesta de Kees C. Bakker:
La función devuelve verdadero o falso dependiendo de si la página tiene una barra de desplazamiento vertical o no.
Por ejemplo:
fuente
yo suelo
fuente
Simplemente compare el ancho del elemento raíz de los documentos (es decir, el elemento html) con la parte interna de la ventana:
Si también necesita saber el ancho de la barra de desplazamiento:
fuente
Otras soluciones no funcionaron en uno de mis proyectos y terminé verificando la propiedad CSS de desbordamiento
pero solo funcionará si la barra de desplazamiento parece desaparecer cambiando el accesorio, no funcionará si el contenido es igual o menor que la ventana.
fuente