以前的写法是通过 offsetParent 找到元素到定位父级元素,直至递归到顶级元素 body 或 html。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// 获取dom元素相对于网页左上角定位的距离 function offset(el) { var top = 0 var left = 0 do { top += el.offsetTop left += el.offsetLeft } while ((el = el.offsetParent)) // 存在兼容性问题,需要兼容 return { top: top, left: left } }
var odiv = document.getElementsByClassName('markdown-body') offset(a[0]) // {top: 271, left: 136}
现在根据 getBoundingClientRect 这个 api,可以写成这样:
1 2
var positionX = this.getBoundingClientRect().left + document.documentElement.scrollLeft var positionY = this.getBoundingClientRect().top + document.documentElement.scrollTop
2、判断元素是否在可视区域内
1 2 3 4 5 6 7 8 9 10 11
function isElView(el) { var top = el.getBoundingClientRect().top // 元素顶端到可见区域顶端的距离 var bottom = el.getBoundingClientRect().bottom // 元素底部端到可见区域顶端的距离 var se = document.documentElement.clientHeight // 浏览器可见区域高度。 if (top < se && bottom > 0) { return true } else if (top >= se || bottom <= 0) { // 不可见 } return false }