>  기사  >  웹 프론트엔드  >  자바스크립트에서 포인터의 위치를 ​​알아내는 방법

자바스크립트에서 포인터의 위치를 ​​알아내는 방법

王林
王林원래의
2021-10-25 14:47:242774검색

JavaScript에서 포인터 위치를 가져오는 방법: 이벤트 객체의 pageX 및 pageY 또는 clientX 및 clientY 속성을 사용하고, scrollLeft 및 scrollTop 속성과 협력하여 포인터 위치를 계산할 수 있습니다.

자바스크립트에서 포인터의 위치를 ​​알아내는 방법

이 기사의 운영 환경: windows10 시스템, javascript 1.8.5, thinkpad t480 컴퓨터.

페이지에서 포인터의 위치를 ​​얻으려면 이벤트 개체의 pageX 및 pageY를 ​​사용하거나 clientX 및 clientY(IE와 호환 가능) 속성을 사용할 수 있으므로 scrollLeft 및 scrollTop 속성과도 협력해야 합니다. 페이지의 중간 위치에서 마우스 포인터의 위치를 ​​계산할 수 있습니다.

//获取鼠标指针的页面位置
//参数:e表示当前事件对象
//返回值:返回鼠标相对页面的坐标,对象格式(x,y)
function getMP (e) {
    var e = e || window.event;
    return {
        x : e.pageX || e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft),
        y : e.pageY || e.clientY + (document.documentElement.scrollTop || document.body.scrollTop)
    }
}

pageX 및 pageY 이벤트 속성은 IE 브라우저에서 지원되지 않으며, clientX 및 clientY 이벤트 속성은 Safari 브라우저에서 지원되지 않으므로 서로 다른 브라우저와 호환되도록 혼합할 수 있습니다. 이상한 모드의 경우 body 요소가 페이지 영역을 나타내고 html 요소가 숨겨지지만 표준 모드에서는 html 요소가 페이지 영역을 나타내고 body 요소는 독립적인 페이지 요소일 뿐이므로 두 가지 파싱 방법이 사용됩니다. 호환되어야 합니다.

다음 예에서는 위의 확장 함수 getMP()를 호출하여 문서에서 현재 마우스 포인터 위치를 캡처하는 방법을 보여줍니다.

<body style="width:2000px;height:2000px;">
    <textarea id="t" cols="15" rows="4" style="position:fixed;left:50px;top:50px;"></textarea>
</body>
<script>
    var t = document.getElementById("t");
    document.onmousemove = function(e){
        var m = getMP(e);
        t.value ="mouseX = " + m.x  + "\n" + "mouseY = " + m.y
    }
</script>

데모 효과는 다음과 같습니다:

자바스크립트에서 포인터의 위치를 ​​알아내는 방법

포인터의 상대 위치 가져오기

offsetX 및 offsetY 또는 layerX 및 layerY를 사용하여 포함 상자를 기준으로 마우스 포인터의 오프셋 위치를 가져옵니다. offsetLeft 및 offsetTop 속성을 사용하여 위치 지정 포함 상자에 있는 요소의 오프셋 좌표를 가져온 다음, layerx 속성 값을 사용하여 offsetLeft 속성 값을 빼고, layery 속성 값을 사용하여 offsetTop 속성 값을 빼는 경우 다음을 수행할 수 있습니다. 요소 내부의 마우스 포인터 위치를 가져옵니다.

//获取鼠标指针在元素内的位置
//参数:e表示当前事件对象,o表示当前元素
//返回值:返回相对坐标对象
function getME (e, o) {
    var e = e || window.event;
    return {
        x : e.offsetX || (e.layerX - o.offsetLeft),
        y : e.offsetY || (e.layerY - o.offsetTop)
    }
}

실제로 위 함수에는 다음과 같은 두 가지 문제점이 있습니다.

  • Mozilla 유형과 Safari 브라우저는 요소 테두리 외벽의 왼쪽 상단을 기준점으로 사용합니다.

  • 다른 브라우저에서는 요소 테두리 내벽의 왼쪽 상단을 좌표 원점으로 사용합니다.

테두리가 마우스 위치에 미치는 영향을 고려할 때 요소 테두리가 매우 넓은 경우 테두리가 마우스 위치에 미치는 영향을 제거하는 방법을 고려해야 합니다. 그러나 다양한 테두리 스타일로 인해 기본 너비가 3픽셀이므로 요소 테두리의 실제 너비를 얻는 것이 번거롭습니다. 현재 요소의 테두리 너비를 결정하려면 더 많은 조건을 설정해야 합니다.

요소 내에서 마우스 포인터의 위치를 ​​가져오는 향상된 확장 기능은 다음과 같습니다.

//完善获取鼠标指针在元素内的位置
//参数:e表示当前事件对象,o表示当前元素
//返回值:返回鼠标相对元素的坐标位置,其中x表示x轴偏移距离,y表示y轴偏移距离
function getME(e, o){
    var e = e || window.event;
    //获取元素左侧边框的宽度
    //调用getStyle()扩展函数获取边框样式值,并尝试转换为数值,如果转换成功,则赋值。
    //否则判断是否定义了边框样式,如果定义边框样式,且值不为none,则说明边框宽度为默认值,即为3像素。
    //如果没有定义边框样式,且宽度值为auto,则说明边框宽度为0
    var bl = parseInt(getStyle(o, "borderLeftWidth")) || ((o.style.borderLeftStyle && o.style.borderLeftStyle != "none" )? 3 : 0);
    //获取元素顶部边框的宽度,设计思路与获取左侧边框方法相同
    var bt = parseInt(getStyle(o, "borderTopWidth")) || ((o.style.borderTopStyle && o.style.borderTopStyle !="none" ) ? 3 : 0);
    var x = e.offsetX || (e.layerX - o.offsetLeft - bl);  // 一般浏览器下鼠标偏移值
    //兼容Mozilla类型浏览器,减去边框宽度 
    var y = e.offsetY || (e.layerY - o.offsetTop - bt); // 一般浏览器下鼠标偏移值 
    //兼容Mozilla类型浏览器,减去边框宽度 
    var u = navigator.userAgent; // 获取浏览器的用户数据 
    if( (u.indexOf("KHTML") > - 1) ||(u.indexOf("Konqueror") > - 1) || (u.indexOf("AppleWebKit") > - 1) 
    ){ // 如果是Safari浏览器,则减去边框的影响 
        x -= bl; y -= bt; 
    } return { // 返回兼容不同浏览器的鼠标位置对象,以元素边框内壁左上角为定位原点 
        x : x, y : y 
    }   
}

시연 효과는 다음과 같습니다.

자바스크립트에서 포인터의 위치를 ​​알아내는 방법

추천 학습: javascript 비디오 자습서

위 내용은 자바스크립트에서 포인터의 위치를 ​​알아내는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.