I wish to show current position within element with a text box under cursor position. below code looks like has some offset between mouse and text box. how can I fix it to show current position within the slides box?
var curTxt = document.createElement('div'); curTxt.id = "cursorText"; curTxt.innerHTML = "xx,xx"; var curTxtLen = [curTxt.offsetWidth, curTxt.offsetHeight]; var slides = document.getElementsByClassName("slides")[0]; slides.appendChild(curTxt); slides.onclick = onmousemove; onmousemove = function(e) { var coor = getRelativeCoordinates(e, slides); //console.log("coor:", coor.x, coor.y); curTxt.style.left = coor.x + 'px'; curTxt.style.top = coor.y + 'px'; curTxt.innerHTML = coor.x + "," + coor.y; } function getRelativeCoordinates(event, referenceElement) { const position = { x: event.pageX, y: event.pageY }; const offset = { left: referenceElement.offsetLeft, top: referenceElement.offsetTop }; let reference = referenceElement.offsetParent; while (reference) { offset.left += reference.offsetLeft; offset.top += reference.offsetTop; reference = reference.offsetParent; } return { x: position.x - offset.left, y: position.y - offset.top, }; }
body { border: 1px solid red; width: 300px; height: 200px; } .dot { position:absolute; top:100px; left:100px; width: 2px; height: 2px; background-color: black; position: absolute; } .slides { border: 1px solid black; width: 200px; height: 100px; background:#ececec; } #cursorText { position: absolute; border: 1px solid blue; }
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Example Mouse Tracker</title> </head> <body> <p>Mouse tracker</p> <div class="slides"></div> <div class="dot"><div> </body> </html>
Advertisement
Answer
Check these changes: the text now will be under the cursor but will not go outside your box:
var curTxt = document.createElement('div'); curTxt.style.cursor = 'default'; curTxt.id = "cursorText"; curTxt.innerHTML = "xx,xx"; var curTxtLen = [curTxt.offsetWidth, curTxt.offsetHeight]; var slides = document.getElementsByClassName("slides")[0]; slides.appendChild(curTxt); slides.onmousemove = function(e) { const coor = getRelativeCoordinates(e, slides); curTxt.innerHTML = coor.x + "," + coor.y; const textLeft = slides.offsetLeft + coor.x - (curTxt.offsetWidth / 2) const textMaxLeft = slides.offsetLeft + slides.offsetWidth - curTxt.offsetWidth; const textTop = slides.offsetTop + coor.y + 15; const textMaxTop = slides.offsetTop + slides.offsetHeight - curTxt.offsetHeight; curTxt.style.left = Math.max(slides.offsetLeft, Math.min(textLeft, textMaxLeft)) + 'px'; curTxt.style.top = Math.max(slides.offsetTop, Math.min(textTop, textMaxTop)) + 'px'; } function getRelativeCoordinates(event, referenceElement) { const position = { x: event.pageX, y: event.pageY }; const offset = { left: referenceElement.offsetLeft, top: referenceElement.offsetTop }; let reference = referenceElement.offsetParent; while (reference) { offset.left += reference.offsetLeft; offset.top += reference.offsetTop; reference = reference.offsetParent; } return { x: position.x - offset.left, y: position.y - offset.top, }; }
body { box-sizing: border-box; border: 1px solid red; width: 300px; height: 200px; margin:0; } .dot { position:absolute; top:100px; left:100px; width: 2px; height: 2px; background-color: black; position: absolute; } .slides { border: 1px solid black; width: 200px; height: 100px; background:#ececec; } #cursorText { position: absolute; border: 1px solid blue; }
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Example Mouse Tracker</title> </head> <body> <p>Mouse tracker</p> <div class="slides"></div> <div class="dot"><div> </body> </html>