首页 > 其他分享 >原生js中offsetTop, offsetLeft与offsetParent的详细讲解

原生js中offsetTop, offsetLeft与offsetParent的详细讲解

时间:2022-10-17 22:59:00浏览次数:53  
标签:cont dingbuTop son offsetLeft offsetTop let js offsetParent

简单说下:offsetTop

offsetTop: 为只读属性。 返回的是一个数字。
它返回当前元素相对于其 offsetParent 元素的顶部内边距的距离。
它等价于offsetTop==>元素到offsetParent顶部内边距的距离
offsetTop并不是指距离浏览器窗口最左边的位置。
我的理解:offsetTop的偏移是指当前元素相对其距离自己最近的具有定位属性的父级元素的偏移值。
margin:会影响它的值。 定位的值会影响。 border也会影响。但是padding不会影响。
offsetLeft跟offsetTop是一样的。他们是一对的。

offsetTop 的简单使用

<body>
    <div id="title">
        我是标题
    </div>
    <div id="nav">
        我是导航
    </div>
    <div id="cont">
        我是内容
    </div>
</body>
<script>
    let cont = document.getElementById('cont')
    let dingbuTop = cont.offsetTop;
    console.log('dingbuTop', dingbuTop); //输出的是50
    /* 之所以是50=21+21+*
        div的默认高度是21;有两个div。 body的外边距margin:8px;
    */
</script>

margin 会影响它的值(margin-bottom也不会), border也会影响,padding不会

<style>
    #cont {
        padding: 10px;
        background: red;
        margin-top: 50px;
    }
</style>
<body>
    <div id="title">
        我是标题
    </div>
    <div id="nav">
        我是导航
    </div>
    <div id="cont">
        我是内容
    </div>
</body>
<script>
    let cont = document.getElementById('cont')
    let dingbuTop = cont.offsetTop;
    // body的外边距margin:8px;div的默认高度是21;有两个div。
    //padding 并没有影响它的值
    console.log('dingbuTop', dingbuTop); //输出的是 8+21+21+50=100
</script>

定位会影响它的值

    <style>
        #cont {
            background: red;
            position: absolute;
            top: 150px;
            left: 150px;
        }
    </style>

<body>
    <div id="title">
        我是标题
    </div>
    <div id="nav">
        我是导航
    </div>
    <div id="cont">
        我是内容
    </div>
</body>
<script>
    let cont = document.getElementById('cont')
    let dingbuTop = cont.offsetTop;
    console.log('dingbuTop', dingbuTop); //输出的是150
</script>

当前元素相对其距离自己最近的具有定位属性的父级元素的偏移

<style>
#cont {
    margin-top: 100px;
    position: relative;
}
#son {
    background: pink;
    position: absolute;
    left: 10px;
    top: 10px;
}
</style>
<body>
    <div id="cont">
        <div id="son">
            son
        </div>
    </div>
</body>
<script>
    let son = document.getElementById('son')
    let dingbuTop = son.offsetTop;
    console.log('dingbuTop', dingbuTop);  //输出的10
</script>

子绝父相-子元素距离屏幕顶部的距离

<style>
    #cont {
        margin-top: 100px;
        position: relative;
        background: #000;
    }
    #son {
        background: pink;
        position: absolute;
        left: 10px;
        top: 10px;
    }
</style>
<body>
    <div id="cont">
        <div id="son">
            son
        </div>
    </div>
</body>
<script>
let son = document.getElementById('son')
let dingbuTop = son.offsetTop + son.offsetParent.offsetTop;
console.log('dingbuTop', dingbuTop); //输出的是 110
</script>

offsetParent

HTMLElement.offsetParent 是一个只读属性.
返回一个指向最近的(指包含层级上的最近)包含该元素的定位元素或者最近的 table, td, th, body 元素。
当元素的 style.display 设置为 "none" 时,offsetParent 返回 null。

等价于offsetParent:返回指向最近的一个具有定位的祖宗元素(relative,absolute,fixed)。
若祖宗都不符合条件,offsetParent为body。

<div id="cont">
    <div id="son1">
        son1
    </div>
    <div id="son">
        son
    </div>
</div>

let son = document.getElementById('son')
let ele = son.offsetParent;
console.log('ele', ele); // 输出的是body这个元素 若祖宗都不符合条件,offsetParent为body。

标签:cont,dingbuTop,son,offsetLeft,offsetTop,let,js,offsetParent
From: https://www.cnblogs.com/IwishIcould/p/16801039.html

相关文章

  • 基于JSP的抑郁症科普交流网站-计算机毕业设计源码+LW文档
    摘 要本抑郁症科普交流网站设计目标是实现抑郁症科普的信息化管理,提高管理效率,使得抑郁症科普工作规范化、科学化、高效化。本文研究的抑郁症科普交流网站基于SSM架构,采......
  • JS实现控制台简易进度条
    JS实现控制台输出简易的进度条代码效果如下运行环境:vscode+node.js控制台输出进度条的原理暂停效果实现//在js里面可以定义一个延时函数//延时函数,ms为需要......
  • Js-Ajax
    jQueryAjax1ajax$.ajax({type:'POST',//请求方式GET/POSTurl:"/api/jsonws/cch-portlet.scorestatisticshelper/list-exam-score",//url地址......
  • 通过Js来设置页面样式
    介绍我们可以在编辑HTML源码的时候将CSS样式写死到.css文件或者HTML元素的style属性中,但又时候可能会需要动态地来修改某个元素的样式。我这里介绍两种方式:修改HTML元素的s......
  • 移动端适配+flexible.js+rem适配
    !function(a,b){functionc(){varb=f.getBoundingClientRect().width;b/i>540&&(b=540*i);varc=b/10;f.style.fontSize=c+"px",k.rem=a.rem=c}vard,e=a.document,f=e.d......
  • 原生js document.getElementById("XXX").disabled="false";无效
    想要设置表单元素不能访问时,使用document.getElementById("XXX").disabled="true";但是想要取消disabled的时候,发现document.getElementById("XXX").disabled="false";无......
  • Spring boot JSP
        路径            静态资源图片读取     ......
  • JS节流与防抖
    概述说明:在前端页面中,有些事件可能会由于用户不必要的操作而频繁触发,这在无形之中就增加了服务器的IO并发量.为了解决这个问题,我们通常会通过防抖或节流的方式对这类......
  • 在node中import from引入的文件要跟.js后缀,但是webapck不用?
    //a.jsletb=333;export{b};//index.jsimport{b}from'./a'//终端nodeindex.js//终端提示Error[ERR_MODULE_NOT_FOUND]:Cannotfindmodule'E:\Thousan......
  • @vitejs/plugin-vue
      需要cmd命令下载,我指定的版本是1.0.0,这里需要的node版本的要>=12.0.0 而我的vue版本是3.04>npmi@vitejs/[email protected] 以下的@vitejs/plugin-vue的......