图解clientX,pageX,scrollWidth等位置信息

本文通过图解和实例分析,详细阐述了前端开发中涉及的屏幕、鼠标点击事件及DOM元素的位置信息,如screenX/Y、clientX/Y、pageX/Y、offsetWidth/Top、scrollTop/Left等,帮助开发者理解这些易混淆的属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先看看前端开发涉及到的位置信息有哪些,根据不同的对象,我做了一个下面这样的表格帮助理解
对象属性说明
windowscreen.width显示屏分辨率(不是物理分辨率)
windowscreen.availHeight显示屏分辨率(不包含任务栏)
windowscreenTop浏览器窗口左上角相对于屏幕左上角位置
windowscreenX浏览器窗口左上角相对于屏幕左上角位置
eventscreenX鼠标光标相对于屏幕的位置
eventclientX鼠标光标相对于浏览器的位置
eventpageX鼠标光标相对于页面的位置
domclientWidthdom元素边框内的区域(不包含边框)
domoffsetWidthdom元素边框及边框内的区域
domscrollWidthdom元素滚动总区域
domscrollTopdom元素已滚动的区域
domclientTopdom元素边框区域
domoffsetTopdom元素margin区域
相信你一开始看见这个表格和我一样也是一脸懵逼,没关系,我用看图说话的方式帮助你理解

①window对象的位置信息

screen.width
screen.availWidth
screenLeft
下面是js代码
console.log(window.screen.width);
console.log(window.screen.availWidth);
console.log(window.screenTop);
console.log(window.screenX);

这里写图片描述

通过图我们可以清晰的看出来他们三者的区别:
1.screenTop和screenLeft是浏览器窗口相对屏幕左上角的位置
2.screen.height和screen.width是显示屏区域(由显示分辨率决定,而不是物理分辨率)
3.screen.availHeight和screen.availWidth是浏览器窗口可覆盖区域(显示屏区域减去任务栏区域的部分)

②event对象的位置信息

下面我们通过鼠标点击事件获取位置
document.body.onclick=function(event){
    console.log(event.screenY);
    console.log(event.pageY);
    console.log(event.clientY);
}

这里写图片描述

1.screenX和screenY是以屏幕左上角为基准的位置;
2.clientX和clientY是以浏览器客户区左上角为基准的位置,客户区不包括浏览器上方的工具栏;
3.pageX和pageY是以页面左上角为基准的位置,当没有发生滚动时,pageX=clientX;clientY=pageY;发生了滚动以后,二者可能就不相等了,具体看图!

③dom对象有关位置信息

offsetWidth
offsetTop
clientWidth
scrollTop
clientTop
看见这五个属性,是不是头皮发麻,没关系,我们新建一个html来帮助我们更好的理解他们
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div class="father">
        <div class="son">
            hello
        </div>
    </div>
</body>
</html>
我们创建了两个div,一个父div和一个子div

为了更清晰的看出差别,我们为他们做一点样式

<style>
    *{
        padding: 0;
        margin: 0;
    }
    body{
        width: 1920px;
        height: 1080px;
        background: #eaeaea;
    }
    .father{
        width: 500px;
        height: 200px;
        margin-left: 50px;
        margin-top: 100px;
        padding: 50px;
        border: 20px solid #6A2C70;
        background-color: #B83B5E;
        overflow: scroll;
    }

    .son{
        width: 600px;
        height: 300px;
        padding: 50px;
        background: #F9ED69;
        border:20px solid #F08A5D;
    }
    </style>
接下来获取father的dom对象引用, 然后讲他打印出来
<script>
        var father=document.getElementsByClassName('father')[0];
        document.body.onclick=function(event){
            console.log('clientWidth='+father.clientWidth+'px'+'\n'+'clientHeight='+father.clientHeight+'px');
            console.log('offsetWidth='+father.offsetWidth+'px'+'\n'+'offsetHeight='+father.offsetHeight+'px');
            console.log('scrollTop='+father.scrollTop+'px'+'\n'+'scrollLeft='+father.scrollLeft+'px');     
            console.log('clientTop='+father.clientTop+'\n'+'clientLeft'+father.clientLeft);
            console.log('offsetTop='+father.offsetTop+'\n'+'offsetLeft'+father.offsetLeft);
        }  
    </script>

效果呢就是下面这个样子

这里写图片描述

外层div(father)
我们先检查一下外层div的信息

这里写图片描述

内层div(son)
接着检查一下子div的信息

这里写图片描述

以上五种位置信息已经标注在图上了,可以清晰的看到

这里写图片描述

说明:
1.颜色较浅的那一部分区域是看不见的,是被挡住的区域,需要滑动滚动条方可看见
2.scrollWidth的组成你会很明显看到少了father盒子的右侧padding,
3.scrollHeight的组成则是完整的,至于为什么会少一块padding,有待进一步探讨,
4.scrollWidth=子div的width+子div的padding*2+子div的边框*2+父div的padding*1
5.scrollHeight=子div的height+子div的padding*2+子div的边框*2+父div的padding*2

这里写图片描述

说明:
1.offsetTop,offsetLeft区域是从dom元素到最近父元素之间的距离,等于marginTop和marginLeft
2.offsetWidth和offsetHeight区域是dom元素边框加上dom元素的padding*2加dom元素width(包含滚动条)
3.clientWidth和clientHeight区域是dom元素width+dom元素padding*2的区域减去滚动条的区域
4.clientLeft和clientTop是dom元素的左边框和上边框

这里写图片描述

说明:
1.浅色区域依然是我们隐藏的画面
2.scrollLeft和scrollTop是滚动后被隐藏的区域,如果没发生滚动,两者都为0(注意这里是滚动后)
总结:通过上面丰富多彩的图解,相信大家对这几个容易混淆的属性有一个比较清晰的认识
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值