获取元素的offsetTop,offsetLeft等相关属性

转自:https://segmentfault.com/a/1190000002879406,有增加内容。

一、注意是JQuery对象还是JS原生对象

//偏移left和top
$(obj).offset().left;  //jqery

obj.offsetLeft //元素相对于父元素的left ,是元素左上角到父元素的距离(从元素左border算起)

obj.offsetTop //元素相对于父元素的top

// width和height

$(obj).width() //jquery方式获取元素的宽度,不包括滚动条与工具条

$(obj).height() //jquery方式获取元素的高度,不包括滚动条与工具条

obj.clientWidth //获取元素的宽度,不包括边框,边距或滚动条 (等于width + padding)

obj.clientHeight //获取元素的高度,不包括边框,边距或滚动条(等于height + padding)

obj.offsetWidth //元素的宽度(width + padding + border + 滚动条)

obj.offsetHeight //元素的高度(width + padding + border + 滚动条)

window.innerWidth //获取屏幕可视区域的宽度,包括边框,边距或滚动条,不包括工具条

window.innerHeight //获取屏幕可视区域的高度,包括边框,边距或滚动条,不包括工具条

window.outerWidth //获取屏幕可视区域的宽度,包括边框,边距或滚动条以及工具条

window.outerHeight //获取屏幕可视区域的高度,包括边框,边距或滚动条以及工具条

document.documentElement.clientWidth  || document.body.clientWidth  // 获取屏幕可视区域的宽度

document.body.clientWidth:document.body.clientWidth获得的也是可视区域的宽度,但是document.body.clientHeight获得的是body内容的高度,如果内容只有200px,那么这个高度也是200px,如果想通过它得到屏幕可视区域的宽高,需要样式设置,如下:

body {
height: 100%;
overflow: hidden;
}
body, div, p, ul {
margin: 0;
padding: 0;
}

最关键的是:body的height:100%影响document.body.clientHeight的值。body的margin:0,padding:0影响document.body.clientWidth的值。

二、区别

clientWidth = width + padding

clientHeight = height + padding

offsetWidth = width + padding + border + 滚动条

offsetHeight = width + padding + border + 滚动条

对象.offsetParent //获取父元素 body的父元素是null

//获取元素的纵坐标(相对于窗口)
function getTop(e){
    var offset=e.offsetTop;
    if(e.offsetParent!=null) offset+=getTop(e.offsetParent);
    return offset;
}
//获取元素的横坐标(相对于窗口)
function getLeft(e){
    var offset=e.offsetLeft;
    if(e.offsetParent!=null) offset+=getLeft(e.offsetParent);
    return offset;
}

三:兼容性

1.window innerWidth 和 innerHeight 属性与outerWidth和outerHeight属性IE8以及以下不支持。

2.测试浏览器IE,火狐,谷歌,360浏览器,Safari都支持document.documentElement.clientWidth与document.documentElement.clientHeight。

四:结论

获取屏幕的可视区域的宽高可使用jquery的方式获得,也可以使用原生js获得,即:

document.documentElement.clientWidth与document.documentElement.clientHeight

Table of Contents