Eu só quero que um JQ / JS simples verifique se a página / janela atual (não um elemento específico) tem uma barra de rolagem vertical.
O Google me fornece coisas que parecem excessivamente complexas apenas para esse recurso básico.
Como isso pode ser feito?
javascript
jquery
scroll
Woody
fonte
fonte
overflow
propriedade dobody
estiver definida emhidden
algum lugar ao longo da linha, não funcionará. Colocar o corpo escondido é extremamente raro, no entanto.$(document)
em vez de$("body")
, isso funcionou para mim quando o corpo não (eu tenho um recipiente positoned absoluta com uma relação de aspecto de largura / altura)tente isto:
No entanto, isso informa apenas se o scrollHeight vertical é maior que a altura do conteúdo visível. A
hasVScroll
variável conterá verdadeiro ou falso.Se você precisar fazer uma verificação mais completa, adicione o seguinte ao código acima:
fonte
cStyle.overflow === 'scroll'
?cStyle.overflow == "visible"
pode mostrar barras de rolagem quando o elemento é odocument.body
. Mas deve ser (hasVScroll && cStyle.overflow == "visible" && element.nodeName == "BODY"). Além disso, ele precisa verificarcStyle.overflow === 'scroll'
como você aponta.Eu tentei a resposta anterior e não parece estar trabalhando com o $ ("body"). Height () não representa necessariamente toda a altura do html.
Corrigi a solução da seguinte maneira:
fonte
Vamos trazer essa pergunta de volta dos mortos;) Há uma razão pela qual o Google não fornece uma solução simples. Casos especiais e peculiaridades do navegador afetam o cálculo, e não é tão trivial quanto parece.
Infelizmente, existem problemas com as soluções descritas aqui até agora. Não pretendo menosprezá-los - eles são ótimos pontos de partida e abordam todas as principais propriedades necessárias para uma abordagem mais robusta. Mas eu não recomendaria copiar e colar o código de nenhuma das outras respostas, porque
$( document ).width()
e.height()
caem na detecção de bugs do tamanho do documento pelo jQuery .window.innerWidth
, se o navegador suportar, faz com que seu código falhe na detecção de barras de rolagem em navegadores móveis, onde a largura da barra de rolagem é geralmente igual a 0. Elas são mostradas temporariamente como uma sobreposição e não ocupam espaço no documento . O zoom no celular também se torna um problema dessa maneira (longa história).html
ebody
para valores não padrão (o que acontece, então, é um pouco envolvido - veja esta descrição ).Passei mais tempo do que eu imaginava em encontrar uma solução que "simplesmente funcionasse" (tosse). O algoritmo que criei agora faz parte de um plugin, jQuery.isInView , que expõe um
.hasScrollbar
método . Dê uma olhada na fonte, se desejar.Em um cenário em que você tem controle total da página e não precisa lidar com CSS desconhecido, o uso de um plug-in pode ser um exagero - afinal, você sabe quais casos extremos se aplicam e quais não. No entanto, se você precisar de resultados confiáveis em um ambiente desconhecido, não acho que as soluções descritas aqui sejam suficientes. É melhor usar um plug-in bem testado - o meu ou qualquer outro.
fonte
window.scrollbars
objeto que possui uma única propriedadevisible
,. Parece promissor, mas não é. Não é suportado no IE, incluindo o IE11. E apenas informa que existe uma barra de rolagem - mas não qual. Veja a página de teste aqui .Este fez obras para mim:
Para o corpo, basta usar
hasVerticalScroll()
.fonte
clientHeight
é preferível poroffsetHeight
aqui. Caso contrário, você pode ter uma borda grossa e retornar quando não houver barra de rolagem.fonte
Estranhamente, nenhuma dessas soluções informa se uma página tem uma barra de rolagem vertical.
window.innerWidth - document.body.clientWidth
fornecerá a largura da barra de rolagem. Isso deve funcionar em qualquer coisa IE9 + (não testada nos navegadores menores). (Ou, para responder estritamente à pergunta,!!(window.innerWidth - document.body.clientWidth)
Por quê? Digamos que você tenha uma página em que o conteúdo seja mais alto que a altura da janela e o usuário possa rolar para cima / baixo. Se você estiver usando o Chrome em um Mac sem o mouse conectado, o usuário não verá uma barra de rolagem. Conecte um mouse e uma barra de rolagem aparecerá. (Observe que esse comportamento pode ser substituído, mas esse é o AFAIK padrão).
fonte
Eu encontrei a solução vanila
fonte
window.innerWidth > document.documentElement.clientWidth
é verdade, maswindow.innerHeight > document.documentElement.clientHeight
não é. Parece que foi o contrário neste caso. Não sou desenvolvedor de JS, só preciso dele para testes do Selenium. Sou grato por dicas.Este lhe dirá se você tem uma barra de rolagem ou não. Incluí algumas informações que podem ajudar na depuração, que serão exibidas como um alerta JavaScript.
Coloque isso em uma tag de script, após a tag do corpo de fechamento.
fonte
Escrevi uma versão atualizada da resposta de Kees C. Bakker:
A função retorna true ou false dependendo se a página possui uma barra de rolagem vertical ou não.
Por exemplo:
fonte
eu uso
fonte
Basta comparar a largura do elemento raiz dos documentos (ou seja, elemento html) com a parte interna da janela:
Se você também precisa saber a largura da barra de rolagem:
fonte
Outras soluções não funcionaram em um dos meus projetos e acabei verificando a propriedade css do estouro
mas só funcionará se a barra de rolagem aparecer desaparecer, alterando o suporte. Não funcionará se o conteúdo for igual ou menor que a janela.
fonte