2013-04-22 6 views
8

Ich habe derzeit ein div mit anderen Elementen darin strukturiert.Wie kann ich die Mauskoordinaten relativ zu einem Elternteil div bekommen? Javascript

Ähnlich wie unten;

<div id="container" style="position: relative; width: 500px; height: 500px;"> 
    <div style="position: absolute; left: 50px; top: 50px;"></div> 
    <div style="position: absolute; left: 100px; top: 100px;"></div> 
</div> 

Ich versuche, die Mausposition in Bezug auf die div mit der ID container zu bekommen.

Bisher habe ich das;

function onMousemove(event) { 

    x = event.offsetX; 
    y = event.offsetY; 
}; 

var elem = document.getElementById("container"); 
elem.addEventListener("mousemove", onMousemove, false); 

Dies funktioniert gut, wenn die div mit der ID container keine Kinder hat. Wenn das div container Kinder hat, erhält es die Mauskoordinaten relativ zum Kind und nicht zum Elternteil.

Was ich damit meine ist, wenn die Maus an einer Position x: 51, y: 51 relativ zum übergeordneten div war, wäre es tatsächlich x: 1, y: 1 relativ zum Kind div zurückzukehren, die mit HTML oben.

Wie kann ich erreichen, was ich will, keine Bibliotheken bitte.

EDIT

tymeJV hat freundlicherweise eine jsfiddle von dem, was oben geschieht.

http://jsfiddle.net/N6PJu/1

+1

ich eine Geige bis verspottet habe: http://jsfiddle.net/N6PJu/1 - Ist das Sehen korrekt Ihr Fehler? – tymeJV

+0

Ja, das ist, was passiert, danke, dass du das gemacht hast :) – GriffLab

Antwort

2

Im Wesentlichen: 'mouseposition' - 'Mutterelementposition' = 'mouseposition in Bezug auf übergeordnetes Element'

Also hier modifizierte ich Ihre Funktion:

function onMousemove(e){ 
    var m_posx = 0, m_posy = 0, e_posx = 0, e_posy = 0, 
      obj = this; 
    //get mouse position on document crossbrowser 
    if (!e){e = window.event;} 
    if (e.pageX || e.pageY){ 
     m_posx = e.pageX; 
     m_posy = e.pageY; 
    } else if (e.clientX || e.clientY){ 
     m_posx = e.clientX + document.body.scrollLeft 
       + document.documentElement.scrollLeft; 
     m_posy = e.clientY + document.body.scrollTop 
       + document.documentElement.scrollTop; 
    } 
    //get parent element position in document 
    if (obj.offsetParent){ 
     do { 
      e_posx += obj.offsetLeft; 
      e_posy += obj.offsetTop; 
     } while (obj = obj.offsetParent); 
    } 
    // mouse position minus elm position is mouseposition relative to element: 
    dbg.innerHTML = ' X Position: ' + (m_posx-e_posx) 
        + ' Y Position: ' + (m_posy-e_posy); 
} 

var elem = document.getElementById('container'); 
elem.addEventListener('mousemove', onMousemove, false); 

var dbg=document.getElementById('dbg'); //debut output div instead of console 

Hier ist ein working demo fiddle. Wie Sie im Code nachlesen können, wird auch die Scroll-Position des Dokuments angezeigt.

PPKs Artikel auf 'event properties' und 'find position' sind (wie immer) ein gutes Buch!

Hoffe, das hilft!

Update:
Ich fand tatsächlich einen Fehler in ppk Code (wie selten ist das ?!): Korrigierte ich die irrtümliche var in:
if (!e) var e = window.event;-if (!e){e = window.event;}

+0

Ich bin mir sicher, dass das Thema Poster den Aufwand schätzt (und ich auch), aber ich hoffe, dass dies nicht von 'Suchen & Finden' im Gegensatz zu ' kopieren, verwenden & nicht verstehen '. Handeln Sie verantwortungsvoll hier, Themenplakat ;-) –

+1

@WillemMulder: Thx! Eine vollständige Erläuterung des Codes finden Sie in den PPK-Links. Es erklärt das Prinzip und beweist es * und * (für wer liest) weist auf alle üblichen Fallstricke hin. Im Allgemeinen stimme ich jedoch zu: Es ist besser zu lehren, wie man fischt. Aber in diesem Fall würde es ein Kapitel aus einem Buch erfordern, all diese (browserübergreifenden) Fallstricke aufzuzeigen. Übrigens wissen wir auch nicht, ob * der Fragesteller (oder ein anderer zukünftiger Leser) sich die Zeit nehmen wird oder nicht, um den Code zu verstehen. – GitaarLAB

+0

@WillemMulder Ich kopiere nicht nur kopieren lernen und schreibe es selbst :) – GriffLab

0

Holen Sie sich die screenX und screenY Eigenschaften, um zu sehen, wo die Maus auf dem Bildschirm (und möglicherweise die Scrollheight berücksichtigen!).

Dann erhalten Sie die linken und oberen Rand des Containerelements und berechnen Sie den Versatz zwischen ihnen: das ist die Position der Maus im Element.

Weitere Informationen finden Sie unter https://developer.mozilla.org/en-US/docs/DOM/MouseEvent.

0

Html

<div id="container" style="position: relative; width: 500px; height: 500px;"> 
<div style="position: absolute; left: 50px; top: 50px;"></div> 
<div style="position: absolute; left: 100px; top: 100px;"></div> 
</div> 

Javascript

function onMousemove(event) { 
    x = event.layerX; // position x relative to div 
    y = event.layerY; // position y relative to div 
}; 

var elem = document.getElementById("container"); 
elem.addEventListener("mousemove", onMousemove, false); 
+0

"[Diese Funktion ist nicht standardisiert und befindet sich nicht auf einem Standardtrack. Verwenden Sie sie nicht auf Produktionsstandorten, die dem Web gegenüberstehen: Es wird nicht für jeden Benutzer funktionieren." (Https://developer.mozilla.org/ de-DE/docs/Web/API/UIEvent/layerX) " –

19

Die akzeptierte Antwort nicht für mich in Chrome nicht funktioniert. Hier ist, wie ich es gelöst:

function relativeCoords (event) { 
    var bounds = event.target.getBoundingClientRect(); 
    var x = event.clientX - bounds.left; 
    var y = event.clientY - bounds.top; 
    return {x: x, y: y}; 
} 
+1

Sehr elegante Lösung. Um die Frage des OP zu beantworten, müssen Sie nur 'event.target' für' document.getElementById ("container") '' vertauschen. – homerjam

Verwandte Themen