2013-07-13 2 views
11

Si j'ai des éléments HTML comme suit:Mesurer la distance entre deux centres d'éléments HTML

<div id="x"></div> 

<div id="y" style="margin-left:100px;"></div> 

... Comment puis-je trouver la distance entre eux en pixels en utilisant JavaScript?

+0

votre balisage est invalide, mais néanmoins - [Calculer] (http://www.quirksmode.org/js/findpos.html) positions absolues des éléments et en utilisant la [formule] (http : //cs.selu.edu/~rbyrd/math/distance/) pour connaître la distance. – georg

+0

oh oui, désolé ... – tenstar

+0

Vous ne voulez pas utiliser jQuery, n'est-ce pas? –

Répondre

22

obtenir leurs positions, et utiliser le théorème de Pythagore pour déterminer la distance entre eux ...

(function() { 

    var getPositionAtCenter = function (element) { 
     var data = element.getBoundingClientRect(); 
     return { 
      x: data.left + data.width/2, 
      y: data.top + data.height/2 
     }; 
    }; 

    var getDistanceBetweenElements = function(a, b) { 
     var aPosition = getPositionAtCenter(a); 
     var bPosition = getPositionAtCenter(b); 

     return Math.sqrt(
      Math.pow(aPosition.x - bPosition.x, 2) + 
      Math.pow(aPosition.y - bPosition.y, 2) 
     ); 
    }; 

    var distance = getDistanceBetweenElements(document.getElementById("x"), 
               document.getElementById("y")); 

})(); 

jsFiddle.

Le théorème de Pythagore se rapporte à la relation entre les côtés d'un triangle rectangle.

Pythagorean Theorem

Les éléments sont représentés sur un Cartesian coordinate system (avec origine en haut à gauche), de sorte que vous pouvez imaginer un triangle rectangle entre les coordonnées des éléments (le côté inconnu est l'hypoténuse).

Vous pouvez modifier l'équation pour obtenir la valeur c en obtenant la racine carrée de l'autre côté.

Distance equation

Ensuite, vous branchez simplement les valeurs (le x et y sont les différences entre les éléments une fois sont déterminés leurs centres) et vous trouverez la longueur de l'hypoténuse, qui est la distance entre la éléments.

+0

Cela tient si "position" est défini comme les coordonnées du coin supérieur gauche. Je pense que l'utilisation du point central est plus précise. – Amberlamps

+0

@Amberlamps Bien sûr, si c'est ce que l'OP veut (ils n'ont pas mentionné cette exigence), alors ils peuvent l'ajuster (je mettrai à jour la réponse aussi). – alex

+0

Est-ce que votre réponse actuelle donne la distance entre les 2 centres? – tenstar

0

dans la mesure DIV sont maintenant vides, l'idée de base est de mesurer la distance entre les coins en haut à gauche

distX = y.offsetLeft - x.offsetLeft; 
distY = y.offsetTop - x.offsetTop; 
distance = Math.sqrt(distX*distX + distY*distY); 
alert(Math.floor(distance)); 

mais vous devez soustrayez première hauteur de div et la largeur, si vous mettez quelque chose à l'intérieur . Cette méthode a quelques problèmes avec le support et la largeur de la bordure des éléments dans différents navigateurs.

prendre de toute façon un oeil à Fiddle

Notez que même avec le contenu (si vous ne changez pas avec css) divs seront 100% largeur, donc si vous voulez juste mesurer br « s utilisation de la hauteur:

distance = = y.offsetTop - x.offsetTop;