Qual é a maneira mais rápida de verificar se um elemento possui barras de rolagem?
Uma coisa, claro, é verificar se o elemento é maior do que sua janela de visualização, o que pode ser feito facilmente verificando estes dois valores:
el.scrollHeight > el.offsetHeight || el.scrollWidth > el.offsetWidth
mas isso não significa que ele também tenha barras de rolagem (portanto, pode ser rolado por humanos).
Questão
Como faço para verificar se há barras de rolagem em um 1 cross browser e 2 única javascript (como em nenhum jQuery ) caminho?
Somente Javascript, porque preciso da menor sobrecarga possível, porque gostaria de escrever um filtro seletor jQuery muito rápido
// check for specific scrollbars
$(":scrollable(x/y/both)")
// check for ANY scrollbar
$(":scrollable")
Suponho que teria que verificar as overflow
configurações de estilo, mas como faço isso em um navegador cruzado?
Edição adicional
Não apenas overflow
configurações de estilo. Verificar se um elemento possui uma barra de rolagem não é tão trivial quanto parece. A primeira fórmula que escrevi acima funciona bem quando o elemento não tem uma borda, mas quando tem (especialmente quando a borda é de largura considerável), a offset
dimensão pode ser maior do que a scroll
dimensão, mas o elemento ainda pode ser rolável. Na verdade, temos que subtrair as bordas da offset
dimensão para obter a janela de visualização rolável real do elemento e compará-la à scroll
dimensão.
Para referência futura
:scrollable
O filtro seletor jQuery está incluído no meu .scrollintoview()
plugin jQuery. O código completo pode ser encontrado na postagem do meu blog se alguém precisar. Mesmo não fornecendo a solução real, o código de Soumya me ajudou consideravelmente a resolver o problema. Isso me apontou na direção certa.
fonte
overflow:hidden
instalado nele? Haveria conteúdo em excesso, mas ainda não é rolável. O problema não é tão simples quanto pode parecer.div.scrollHeight>div.clientHeight && !(div.style.overflow && div.style.overflow == 'hidden')
)?Experimentar:
Para barra de rolagem vertical
Para barra de rolagem horizontal
Eu sei que isso funciona para IE8 e Firefox 3.6+, pelo menos.
fonte
overflow:hidden
e não seria mais rolável.overflow:hidden
... esta ainda é a resposta correta na minha opinião, por ser a mais simples.Isso pode parecer (ou ser) um pouco hackeado, mas você pode testar as propriedades
scrollTop
escrollLeft
.Se eles forem maiores que 0, você sabe que existem barras de rolagem. Se forem 0, defina-os como 1 e teste-os novamente para ver se obtém um resultado de 1. Em seguida, defina-os de volta para 0.
Exemplo: http://jsfiddle.net/MxpR6/1/
Acredito que haja uma propriedade diferente para o IE, então vou atualizar em um minuto com isso.EDIT: Parece que o IE pode oferecer suporte a esta propriedade. (Não consigo testar o IE agora.)
http://msdn.microsoft.com/en-us/library/ms534618(VS.85).aspx
fonte
offsetHeight
eclientHeight
. O último é sempre menor pelo tamanho da barra de rolagem quando a barra de rolagem está presente.overflow:scroll
, você deseja que seja relatado como rolável, estejam as barras de rolagem habilitadas ou não. Claro que minha solução pode ter problemas se houver um evento onscroll anexado.Aqui está outra solução:
Como algumas pessoas apontaram, simplesmente comparar offsetHeight e scrollHeight não é suficiente, pois eles diferem em elementos com overflow oculto, etc., que ainda não possuem barras de rolagem. Portanto, aqui também estou verificando se o estouro é scroll ou auto nos estilos calculados para o elemento:
fonte
overflow*
estiverscroll
, sempre haverá uma barra de rolagem, então acho que você quervertical: overflowY === 'scroll' || overflowY === 'auto' && node.scrollHeight > node.clientHeight
, etc. (ou seja, remova os colchetes para que oscroll*
vsclient*
seja testado apenas quandooverflow*
forauto
). Caso contrário, esta parece ser a solução mais correta.Estou um pouco atrasado para a festa, mas ...
Eu acredito que você pode detectar barras de rolagem com e.offsetWidth vs. e.clientWidth. A largura do deslocamento inclui bordas e barras de rolagem, preenchimento e largura. A largura do cliente inclui preenchimento e largura. Por favor, veja:
https://developer.mozilla.org/en/DOM/element.offsetWidth (segunda imagem) https://developer.mozilla.org/en/DOM/element.clientWidth (segunda imagem)
Você precisa verificar:
Faça o mesmo para a vertical (offset / clientHeight).
O IE7 relata um clientHeight de 0 para alguns elementos (não verifiquei o porquê), portanto, você sempre precisa da primeira verificação de estouro.
Espero que isto ajude!
fonte
Existem vários problemas no caso de verificar a existência de barras de rolagem, um dos quais é que no mac você não tem nenhuma barra de rolagem visível, então ambas as soluções acima não lhe dariam uma resposta precisa.
Portanto, como a renderização do navegador não é muito frequente, você pode verificar a rolagem alterando a rolagem e configurando-a novamente:
fonte
Só estou brincando aqui, pois nenhuma das soluções acima funcionou para mim (até agora). Eu encontrei algum sucesso comparando a altura de rolagem de um Div com seu offsetHeight
Parece me dar uma comparação precisa ... até agora. Alguém sabe se isso é legítimo?
fonte
Para o IE11 (Internet Explorer 11), tive que alterar a lógica para:
Isso ocorre porque o IE relata scrollHeight como 1 maior do que clientHeight quando nenhuma barra de rolagem está presente, mas aproximadamente 9 maior quando uma barra de rolagem está presente
fonte
Se você precisa saber se existe uma barra de rolagem presente em toda a página da web e com suporte completo ao navegador, você pode usar isto:
É importante usar em
window.innerHeight
vez dedocument.body.clientHeight
porque em alguns navegadores móveis clientHeight não obterá o tamanho da barra de endereço, mas scrollHeight sim, então você obtém cálculos errados.fonte
nenhuma dessas respostas está correta. você tem que usar isto:
fonte
Adicione um elemento 100% largo dentro dele. Em seguida, defina o estouro como oculto. Se o estilo calculado do elemento (de jQ) muda, o pai tinha uma barra de rolagem.
EDIT: Parece que você quer um método de navegador cruzado como getComputedStyle . Experimentar:
fonte
$(el).css("overflow/overflowX/overflowY")
e ver se está definido como automático ou rolar . Mas eu gostaria de evitar o uso de jQuery.computedStyle = el.currentStyle || document.defaultView.getComputedStyle(el, null);