Estou acostumado a trabalhar com jQuery. No meu projeto atual, porém, uso o zepto.js. O Zepto não fornece um position()
método como o jQuery. O Zepto vem apenas com offset()
.
Alguma idéia de como posso recuperar o deslocamento de um contêiner em relação a um pai com js puro ou com o Zepto?
JavaScript
tag quando estiver usando JavaScript puro. Se você estiver usando uma estrutura ou biblioteca, não usará aJavaScript
tag. Se seu nome é Jeff, eu não te chamaria de Sally.Respostas:
Aviso: jQuery, não JavaScript padrão
element.offsetLeft
eelement.offsetTop
são as propriedades javascript puras para encontrar a posição de um elemento em relação à suaoffsetParent
; sendo o elemento pai mais próximo com uma posiçãorelative
ouabsolute
Como alternativa, você sempre pode usar o Zepto para obter a posição de um elemento E de seu pai e simplesmente subtrair os dois:
Isso tem o benefício de fornecer o deslocamento de um filho em relação ao pai, mesmo que ele não esteja posicionado.
fonte
static
não são pais deslocados.em pure js basta usar
offsetLeft
eoffsetTop
propriedades.Exemplo de violino: http://jsfiddle.net/WKZ8P/
fonte
p.offsetTop + p.parentNode.offsetTop
Você pode agrupar isso em uma chamada de função recursiva, como a PPK proposta há alguns anos atrás. Você pode alterar a função para passar o número de níveis a subir ou usar um seletor para imitar$(selector).parents(parentSelector)
. Eu preferiria esta solução porque a implementação do zepto funciona apenas em navegadores compatíveisgetBoundingClientsRect
- o que alguns celulares não.getBoundingClientsRect
era amplamente apoiado ... se alguém souber quais celulares não suportam, eu estaria interessado (não consigo encontrar nenhuma tabela de suporte para celulares sobre isso).$(this).offset().left
parathis.offsetLeft
.jQuery.position()
comportamento errado dentro de um pai transformado em 3d, muito obrigado!Eu fiz assim no Internet Explorer.
=================== você pode chamá-lo assim
Eu me concentro no IE apenas de acordo com meu foco, mas coisas semelhantes podem ser feitas para outros navegadores.
fonte
Adicione o deslocamento do evento ao deslocamento do elemento pai para obter a posição de deslocamento absoluta do evento.
Um exemplo :
Quando o destino do evento não é o elemento no qual o evento foi registrado, ele adiciona o deslocamento do pai ao deslocamento atual do evento para calcular o valor de deslocamento "Absoluto".
De acordo com a Mozilla Web API: "A propriedade somente leitura HTMLElement.offsetLeft retorna o número de pixels que o canto superior esquerdo do elemento atual é deslocado para a esquerda no nó HTMLElement.offsetParent. "
Isso ocorre principalmente quando você registra um evento em um pai que contém vários filhos, por exemplo: um botão com um ícone ou extensão de texto interno, um
li
elemento com extensões internas. etc ...fonte
Exemplo
Portanto, se tivéssemos um elemento filho com um ID de "elemento filho" e desejássemos obter sua posição superior / esquerda em relação a um elemento pai, digamos uma div que tivesse uma classe de "item pai", teríamos use este código.
Plugin Finalmente, para o plugin real (com algumas notas expalaining o que está acontecendo):
fonte
Eu tenho outra solução. Subtrair o valor da propriedade pai do valor da propriedade filho
fonte
Claro que é fácil com JS puro, basta fazer isso, trabalhar para painéis HTML 5 fixos e animados também, fiz e experimentei esse código e funciona para qualquer navegador (incluindo o IE 8):
fonte