Qual é a maneira correta de obter a posição de um elemento na página em relação à janela de visualização (em vez do documento). jQuery.offset
função parecia promissora:
Obtenha as coordenadas atuais do primeiro elemento, ou defina as coordenadas de cada elemento, no conjunto de elementos correspondentes, em relação ao documento.
Mas isso é relativo ao documento. Existe um método equivalente que retorna deslocamentos em relação à janela de visualização?
Respostas:
Olhe para o plugin Dimensions, especificamente
scrollTop()
/scrollLeft()
. As informações podem ser encontradas em http://api.jquery.com/scrollTop .fonte
A maneira mais fácil de determinar o tamanho e a posição de um elemento é chamar seu método getBoundingClientRect () . Este método retorna as posições dos elementos nas coordenadas da janela de visualização. Ele não espera argumentos e retorna um objeto com as propriedades esquerda, direita, superior e inferior . As propriedades esquerda e superior fornecem as coordenadas X e Y do canto superior esquerdo do elemento e as propriedades direita e inferior fornecem as coordenadas do canto inferior direito.
element.getBoundingClientRect(); // Get position in viewport coordinates
Suportado em todos os lugares.
fonte
getBoundingClientRect is not a function
$('#myElement')[0].getBoundingClientRect().top
(ou qualquer outra posição)Aqui estão duas funções para obter a altura da página e os valores de rolagem (x, y) sem o uso do plug-in de dimensões (inchado):
fonte
jQuery.offset
precisa ser combinado comscrollTop
escrollLeft
conforme mostrado neste diagrama:Demo:
fonte
Esta é uma função que calcula a posição atual de um elemento na janela de visualização:
Os valores de retorno são calculados assim:
Uso:
Demo:
fonte
Descobri que a resposta de cballou não estava mais funcionando no Firefox em janeiro de 2014. Especificamente,
if (self.pageYOffset)
não acionava se o cliente havia rolado para a direita, mas não para baixo - porque0
é um número falsey. Isso não foi detectado por um tempo porque o Firefox era compatível comdocument.body.scrollLeft
/Top
, mas não está mais funcionando para mim (no Firefox 26.0).Esta é minha solução modificada:
Testado e funcionando em FF26, Chrome 31, IE11. Quase certamente funciona em versões mais antigas de todos eles.
fonte