彻底理清offset,client,scroll

89 阅读3分钟

client 客户端大小

● client 系列没有参考父级元素
● 只与自身的尺寸有关系(只关心自己的东西,其他与我无关)
● 相当于只把自己当作一个客户端区域,只关心自己内部区域的尺寸大小
● clientLeft/clientTop 边框区域尺寸,不常用
● clientLeft 指的是元素左边框的宽度
● clientTop 指的是元素上边框的宽度
● clientWidth/clientHeight 边框内部大小
● 这里指的是边框以内(不包含边框)元素的大小(padding、content)
● 与 offsetWidth/offsetHeight 相比,少计算了边框的宽度
● 注意: 如果元素有滚动条,计算宽高时,需要减掉滚动条的宽度,17px

scroll 滚动偏移属性

● scrollLeft/scrollTop 盒子内部滚动出去的尺寸
● 元素出现滚动条之后,内部滚动出去的尺寸左侧的值和顶部的值
● 这里元素的内部包括自身的 padding,子元素的 margin、border、padding、content
● 这里滚动参考的是父元素边框内侧
● scrollWidth/scrollHeight 盒子内容的宽度和高度
● 这里的宽高不计算父元素的 border
● 父元素会被子元素撑宽,和撑高
● 撑开父元素的子元素本身,会把margin、border、padding、content都计算在内
● 父元素如果有 padding 值,垂直方向会计算在内,水平方向右边 padding 不计算在内
● scrollWidth/scrollHeight 表示的就是最后被子元素撑开之后,父元素的宽高

offset 偏移量属性(只读)

● offsetParent 偏移参考父级,距离自己最近的有定位的父级,如果都没有定位参考body(html)
● offset 指的是偏移量
● 任何元素都有一个 offsetParent 属性
● 任何元素天生就知道自己的参考父级是谁
● 类似绝对定位需要参考的那个相对定位(子绝父相)
● offsetLeft/offsetTop 偏移位置
● 自身的边框以外(其实就是元素边框以外的左上顶点)与参考父级边框以内左上角之间的距离
● offsetLeft/offsetTop 类似绝对定位的 left 值和 top 值
● offsetWidth/offsetHeight 偏移大小
● 与自身的高度/宽度有关(只关心自己的东西,其他与我无关)
● 指的是元素边框及以内的宽度和高度(就是元素的border、padding、content加起来的宽度和高度)
● 这里偏移大小,偏移宽度,并不是指偏移的距离,而是发生偏移的那个元素,本身自己的大小而已
● offsetWidth/offsetHeight 类似与绝对定位的元素的宽高大小

var getOffset = {

    left: function (element) {

        var actualLeft = element.offsetLeft;

        var current = element.offsetParent;

        while (current) {

            actualLeft += current.offsetLeft+current.clientLeft;

            current = current.offsetParent;

        }

        return actualLeft;

    },

    top: function (element) {

        var actualTop = element.offsetTop;

        var current = element.offsetParent;

        while (current) {

            actualTop += current.offsetTop+current.clientTop;

            current = current.offsetParent;

        }

        return actualTop;

    }

}

offsetLeft和offsetTop确实是存在一定误差的,相关因素如下:

1 修改元素的offsetParent
2 修改offetParent的盒模型(如果offsetParent设置了边框和内边距的话)
3 current.clientLeft/clientTop
4 screenX和screenY

参考点:电脑屏幕左上角

●screenX:鼠标点击位置相对于电脑屏幕左上角的水平偏移量
●screenY:鼠标点击位置相对于电脑屏幕左上角的垂直偏移量

2clientX和clientY

参考点:浏览器内容区域左上角

●clientX:鼠标点击位置相对于浏览器可视区域的水平偏移量(不会计算水平滚动条的距离)
●clientY:鼠标点击位置相对于浏览器可视区域的垂直偏移量(不会计算垂直滚动条的距离)

3pageX和pageY

参考点:网页的左上角

●pageX:鼠标点击位置相对于网页左上角的水平偏移量,也就是clientX加上水平滚动条的距离
●pageY:鼠标点击位置相对于网页左上角的垂直偏移量,也就是clientY加上垂直滚动条的距离

4offsetX和offsetY

参考点:触发事件对象

●offsetX:鼠标点击位置相对于触发事件对象的水平距离
●offsetY:鼠标点击位置相对于触发事件对象的垂直距离