J'ai l'habitude de travailler avec jQuery. Dans mon projet actuel cependant, j'utilise zepto.js. Zepto ne fournit pas de position()
méthode comme le fait jQuery. Zepto n'est livré qu'avec offset()
.
Une idée comment je peux récupérer le décalage d'un conteneur par rapport à un parent avec js pur ou avec Zepto?
JavaScript
balise lorsque vous utilisez du JavaScript pur. Si vous utilisez un framework ou une bibliothèque, vous n'utilisez pas laJavaScript
balise. Si vous vous appelez Jeff, je ne vous appellerais pas Sally.Réponses:
Avertissement: jQuery, pas de JavaScript standard
element.offsetLeft
etelement.offsetTop
sont les propriétés javascript pures pour trouver la position d'un élément par rapport à sonoffsetParent
; étant l'élément parent le plus proche avec une position derelative
ouabsolute
Alternativement, vous pouvez toujours utiliser Zepto pour obtenir la position d'un élément ET son parent, et simplement soustraire les deux:
Cela a l'avantage de vous donner le décalage d'un enfant par rapport à son parent même si le parent n'est pas positionné.
la source
static
ne sont pas des parents décalés.en pur js, utilisez simplement
offsetLeft
etoffsetTop
propriétés.Exemple de violon: http://jsfiddle.net/WKZ8P/
la source
p.offsetTop + p.parentNode.offsetTop
Vous pouvez envelopper cela dans un appel de fonction récursif un peu comme PPK proposé il y a quelques années. Vous pouvez modifier la fonction pour passer le nombre de niveaux à monter ou utiliser un sélecteur pour imiter$(selector).parents(parentSelector)
. Je préférerais cette solution car l'implémentation de zepto ne fonctionne que sur les navigateurs prenant en chargegetBoundingClientsRect
- ce que certains mobiles ne font pas.getBoundingClientsRect
c'était largement supporté ... si quelqu'un sait quels mobiles ne le supportent pas, je serais intéressé (je ne trouve aucune table de support pour les mobiles à ce sujet).$(this).offset().left
versthis.offsetLeft
.jQuery.position()
comportements à l'intérieur d'un parent transformé en 3D, merci beaucoup!Je l'ai fait comme ça dans Internet Explorer.
=================== vous pouvez l'appeler comme ceci
Je me concentre sur IE uniquement selon mon objectif, mais des choses similaires peuvent être faites pour d'autres navigateurs.
la source
Ajoutez le décalage de l'événement au décalage de l'élément parent pour obtenir la position de décalage absolue de l'événement.
Un exemple :
Lorsque la cible de l'événement n'est pas l'élément dans lequel l'événement a été enregistré, elle ajoute le décalage du parent au décalage de l'événement en cours afin de calculer la valeur de décalage "Absolu".
Selon Mozilla Web API: "La propriété en lecture seule HTMLElement.offsetLeft renvoie le nombre de pixels dont le coin supérieur gauche de l'élément actuel est décalé vers la gauche dans le nœud HTMLElement.offsetParent. "
Cela se produit principalement lorsque vous avez enregistré un événement sur un parent qui contient plusieurs autres enfants, par exemple: un bouton avec une icône intérieure ou une étendue de texte, un
li
élément avec des étendues intérieures. etc...la source
Exemple
Donc, si nous avions un élément enfant avec un identifiant de "child-element" et que nous voulions obtenir sa position gauche / supérieure par rapport à un élément parent, disons un div qui avait une classe de "item-parent", nous aurions utilisez ce code.
Plugin Enfin, pour le plugin actuel (avec quelques notes expliquant ce qui se passe):
la source
J'ai une autre solution. Soustraire la valeur de la propriété parent de la valeur de la propriété enfant
la source
Bien sûr, c'est facile avec le JS pur, il suffit de faire ceci, de travailler aussi pour les panneaux HTML 5 fixes et animés, j'ai créé et essayé ce code et cela fonctionne pour n'importe quel navigateur (y compris IE 8):
la source