位置、尺寸属性全解析

本文针对 BOM 和 DOM 中和位置以及元素尺寸相关的典型属性进行深入讨论,这些属性是使用 Javascript 操纵 DOM 元素的基础,虽然不难理解,然而却容易令人混淆。本文中有相当一部分内容来源于网络,参考资料在文末列出。


window 对象相关

window 对象相关的位置、尺寸属性主要有两个 。

  • screenXscreenY

    浏览器左边界/上边界到用户屏幕的左边界/上边界的水平/垂直像素数。

    只读。数据类型: number。只返回整数值。

  • scrollXscrollY

    文档在水平/垂直方向已滚动的像素数。

    只读。数据类型: number。只返回整数值。

    注意 pageOffsetXpageOffsetYscrollXscrollY 的别名。为了兼容不同的浏览器(包括 IE < 9),请使用以下代码:

    const x = (window.pageXOffset !== undefined)
            ? window.pageXOffset
            : (document.documentElement || document.body.parentNode || document.body).scrollLeft;
    const y = (window.pageYOffset !== undefined)
            ? window.pageYOffset
            : (document.documentElement || document.body.parentNode || document.body).scrollTop;
    复制代码

MouseEvent 类相关

MouseEvent 类相关的位置、尺寸属性主要有四个。

  • screenXscreenY

    鼠标到用户屏幕的左边界/上边界的水平/垂直像素数。

    只读。数据类型: number。只返回整数值。

  • clientXclientY

    鼠标想对于浏览器边框的水平/垂直像素数。

    只读。数据类型: number。只返回整数值。

  • pageXpageY

    鼠标想对于整个文档的水平/垂直像素数。

    只读。数据类型: number。只返回整数值。

    pageXpageY会考虑页面的的滚动,注意与 clientXclientY 的区别:

    从上面的解释可以看出如下关系:

    mouseEvent.pageY - mouseEvent.clientY === window.scrollY;   // true
    复制代码
  • offsetXoffsetY

    鼠标与目标节点的 padding 外边沿的水平/垂直距离。

    只读。数据类型: number。只返回整数值,单位:px

    需要注意两点:

    • offsetXoffsetY 是相对于 mouseEvent.target 的,这是和前面三个属性不一样的地方
    • offsetXoffsetY 不包括 border 的宽度

HTMLElement 类相关

接下来重点介绍 HTMLElement 类相关的位置和尺寸属性。主要涉及三个部分,下面分别说明。

该部分主要来源于Element size and scrolling

接下来会结合如下例子进行说明:

先贴出这张说明图:

client*

为了描述的简洁,client* 意为 client 开头的属性,后文类似

分为两部分,分别描述位置和尺寸。

  • clientLeftclientTop

    一个元素的左边框/上边框的像素数。如果元素的文本方向是从右向左(RTL, right-to-left),并且由于内容溢出导致左边出现了一个垂直 scrollbar,则该属性包括该 scrollbar 的宽度。

    只读。数据类型: number。只返回整数值。

    在上面的例子中, clientLeftclientTop 分别等于对应的 border 宽度:

    然而,在从右至左的文档下并且有滚动条的情况时,clientLeft 还包括了滚动条的宽度(虽然这种情况不常见):

  • clientWidthclientHeight

    元素内部的大小,以像素值表示。即 border 以内的部分(包括 padding),不包括 scrollbarbordermargin 和溢出的部分。

    只读。数据类型: number。只返回整数值。

    需要注意的是 scrollbar 的宽度会占据 CSS width ,即:

    getComputedStyle(element).width   // 300px
    复制代码

scroll*

分为两部分,分别描述位置和尺寸。

  • scrollLeftscrollTop

    获取或设置一个元素的内容滚动的像素数。

    数据类型: number。只返回整数值。

    scrollLeftscrollTop 可以被设置为任何整数值用来设置元素滚动的距离,但是需要注意的是:

    • 如果一个元素不能被滚动(例如,它没有溢出,或者这个元素有一个"non-scrollable"属性), scrollTop将被设置为0
    • 设置scrollTop的值小于0,scrollTop 被设为0
    • 如果设置了超出这个容器可滚动的值, scrollTop 会被设为最大值
  • scrollWidthscrollHeight

    元素的内部大小,以像素值表示。相比于 clientWidthclientHeight ,包括溢出的部分。

    只读。数据类型: number。只返回整数值。

offset*

分为两部分,分别描述位置和尺寸。

  • offsetLeftoffsetTop

    相对于 offsetParent 的水平/垂直像素值。

    只读。数据类型: number。只返回整数值。

  • offsetWidthoffsetHeight

    元素的外部大小,以像素值表示。相比于 clientWidthclientHeight ,包括 borderscrollbar

    只读。数据类型: number。只返回整数值。


结语

本文总结了在 Javascript 中常见的位置和尺寸属性,力求在需要使用的时候得心应手,最后附上文中所参考的相关资料,供继续阅读。


参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值