/**
* @description 如何获取文档中任意一个元素距离文档document顶部的距离
* jquery中的 offset 方法 返回的对象包含两个整型属性:top 和 left
* 手动实现一下:
* 1. 通过递归实现
* 2. 通过 getBoundingClientRect API 实现
* 3. offsetTop 访问一个DOM节点上边框相对距离其本身最近,且 position 值
* 为非 static 的祖先元素的垂直偏移量
*/
// 通过递归实现方案 遍历目标袁术的父节点,父节点的父节点。。。
const offset = ele => {
let result = {
top: 0,
left: 0
}
const getOffset = (node, init) => {
if (node.nodeType !== 1) {
return
}
position = window.getComputedStyle(node)['position']
if (typeof(init) === 'undefined' && position === 'static') {
// 不计入计算 进入下一个节点
getOffset(node.parentNode)
return
}
result.top = node.offsetTop + result.top - node.scrollTop
result.left = node.offsetLeft + result.left - node.scrollLeft
if (position === 'fixed') {
return
}
getOffset(node.parentNode)
}
if (window.getComputedStyle(ele)['display'] === 'none') {
return result
}
let position
getOffset(ele, true)
return result
}
// getBoundingClientRect() 返回元素的大小及其相对于视口的位置
const offset = ele => {
let result = {
top: 0,
left: 0
}
// 当前 IE11 一下 , 直接返回top:0,left:0
if (!ele.getClientRects().length) {
return result
}
// 当前DOM节点display === 'none' 直接返回top:0,left:0
result = ele.getBoundingClient()
var docElement = ele.owerDocument.documentElement
return {
// window.pageYOffset 鼠标滚动的距离
// clientTop 一个元素顶部边框的宽度
top: result.top + window.pageYOffset - document.clientTop,
left: result.left + window.pageXOffset - docElement.clientLeft
}
}
获取文档中任意一个元素距离文档document顶部的距离
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 【蝴蝶效应】 蝴蝶效应:上个世纪70年代,美国一个名叫洛伦兹的气象学家在解释空气系统理论时说,亚马逊雨林一只蝴蝶...
- linux中使用free()进行内存释放时,不大于 max_fast (默认值为 64B)的 chunk ...