登录  /  注册
博主信息
博文 82
粉丝 0
评论 1
访问量 125578
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
offsetTop && offsetParent
子龙的博客搬家啦httpswwwcnblogscomZiLongZiLong
原创
1043人浏览过

在迄今为止的一年里,做滚动动画的时候其实对一个概念比较模糊,就是一个元素在此文档中距离文档顶部的距离,一开始的想法是一个元素距离顶部的距离就是此元素同级的previous兄弟节点的高度和加上此元素的父元素的previous兄弟节点的高度和,这个想法我觉得是对的,但是一直没有去验证,而且因为没有验证我也一直把他作为求元素距顶部的距离的解法,直到我知道了offsetTop这个dom属性,一切都搞明白了,今天把这个说清楚。

首先看看offsetTop的解释

HTMLElement.offsetTop 为只读属性,它返回当前元素相对于其 offsetParent 元素的顶部的距离。

                                     ---MDN

这里有一个比较重要的概念其实是offsetParent,然后我们再看看offsetParent的解释

HTMLElement.offsetParent 是一个只读属性,返回一个指向最近的(closest,指包含层级上的最近)包含该元素的定位元素。如果没有定位的元素,则 offsetParent 为最近的 table, table cell 或根元素(标准模式下为 html;quirks 模式下为 body)。当元素的 style.display 设置为 "none" 时,offsetParent 返回 null。offsetParent 很有用,因为 offsetTop 和 offsetLeft 都是相对于其内边距边界的。

                                     ---MDN

其实就是说offsetParent就是距离他最近的一个具有定位属性的父元素,或者table元素或者display为table-cell的元素,所谓定位属性就是指position属性为fixed,或absolute,或relative的元素。所以根据这个我们可以很轻松的写出一个元素距离文档顶部的距离的方法:

/**
 *  环境:chrome
 *  IE 不管,有兴趣自己调
 */
function topPos( dom ){
    let top= dom.offsetTop,baba= dom.offsetParent ;
    while( baba ){
        let border = parseFloat( getStyle( baba,'border' ).match( /^(\d+)/ )[1] )
        top += baba.offsetTop
        if(  border != 0 && baba.offsetParent != null){//border 会漏算
            top += border ;
        }
        baba = baba.offsetParent 
     }
     return top;
}
 function getStyle(obj,prop){
     return window.getComputedStyle ?
                window.getComputedStyle(obj,null)[prop] :
                            obj.currentStyle[prop];
 }

恩 以上。

是有点麻烦哈!

来个大杀器:

getBoundingClientRect

返回值是一个 DOMRect 对象,这个对象是由该元素的 getClientRects() 方法返回的一组矩形的集合, 即:是与该元素相关的CSS 边框集合 。

                    -    MDN

怎么用?

DOM.getBoundingClientRect().top;// 顶部距离

兼容性及详细用法:

https://developer.mozilla.org/zh-CN/docs/Web/API/Element/getBoundingClientRect


知道了元素距离页面顶部的距离就可以做其他事情了,懒加载,左右联动,etc。恩 说完了。。。

本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学