offsetLeft、offsetTop全面解析

一、第一个小例子


<body>
<style>body { margin:0;  }.box1 { width:300px; height:300px; margin:100px; background:#333; overflow:hidden; }.box2 { width:200px; height:200px; margin:100px; background:#666; overflow:hidden; }.box3 { width:100px; height:100px; margin:100px; background:#999;}
</style>
<div class="box1"><div class="box2"><div class="box3"></div></div>
</div>
<script>var oBox1 = document.querySelector('.box1');var oBox2 = document.querySelector('.box2');var oBox3 = document.querySelector('.box3');console.log('box1: '+ oBox1.offsetLeft +','+ oBox1.offsetTop);console.log('box2: '+ oBox2.offsetLeft +','+ oBox2.offsetTop);console.log('box3: '+ oBox3.offsetLeft +','+ oBox3.offsetTop);
</script>
</body>

①第一个例子中,三个div的上一级的定位元素都是body,body是最外层的定位元素,三个div获取到的offsetLeft值跟offsetTop值都是相对于body的偏移量。

二、第二个小例子(给box1添加相对定位)

<body>
<style>body { margin:0;  }.box1 { width:300px; height:300px; margin:100px; background:#333; overflow:hidden; position:relative;}.box2 { width:200px; height:200px; margin:100px; background:#666; overflow:hidden; }.box3 { width:100px; height:100px; margin:100px; background:#999;}
</style>
<div class="box1"><div class="box2"><div class="box3"></div></div>
</div>
<script>var oBox1 = document.querySelector('.box1');var oBox2 = document.querySelector('.box2');var oBox3 = document.querySelector('.box3');console.log('box1: '+ oBox1.offsetLeft +','+ oBox1.offsetTop);console.log('box2: '+ oBox2.offsetLeft +','+ oBox2.offsetTop);console.log('box3: '+ oBox3.offsetLeft +','+ oBox3.offsetTop);
</script>
</body>

②第二个例子中,box1加上了相对定位,这时候box2,box3的上一级定位元素不再是body了,这时他们获取到的offsetLeft值跟offsetTop值都是相对于box1的偏移量。而box1的上一级定位元素还是body,所以他的偏移量还是相对于body的。

三、第三个小例子(给box1,box2添加相对定位)

<body>
<style>body { margin:0;  }.box1 { width:300px; height:300px; margin:100px; background:#333; overflow:hidden; position:relative; }.box2 { width:200px; height:200px; margin:100px; background:#666; overflow:hidden; position:relative; }.box3 { width:100px; height:100px; margin:100px; background:#999;}
</style>
<div class="box1"><div class="box2"><div class="box3"></div></div>
</div>
<script>var oBox1 = document.querySelector('.box1');var oBox2 = document.querySelector('.box2');var oBox3 = document.querySelector('.box3');console.log('box1: '+ oBox1.offsetLeft +','+ oBox1.offsetTop);console.log('box2: '+ oBox2.offsetLeft +','+ oBox2.offsetTop);console.log('box3: '+ oBox3.offsetLeft +','+ oBox3.offsetTop);
</script>
</body>

③第三个例子中,box1跟box2都加上了相对定位,这时候,box3的上一级定位元素变成是box2,box2的上一级定位元素是box1,box1的上一级定位元素还是body。所以这时候就出现了。三个div的偏移量都为100;

五、扩展(在第三个例子中,假如我想获取到box3到浏览器窗口的偏移量,该怎么去获取呢?)
思路很简单,就是把元素本身的偏移量跟所有上级定位元素的偏移量都加起来就可以了,问题又来了,假如我们不知道他有几个上级定位元素呢?
其实也不难。js不但提供了offsetLeft、offsetTop方法,还提供了offsetParent(获取上一级定位元素对象)的方法。所以现在我们只需封装一个函数就可以了。


function offset(obj,direction){//将top,left首字母大写,并拼接成offsetTop,offsetLeftvar offsetDir = 'offset'+ direction[0].toUpperCase()+direction.substring(1);var realNum = obj[offsetDir];var positionParent = obj.offsetParent;  //获取上一级定位元素对象while(positionParent != null){realNum += positionParent[offsetDir];positionParent = positionParent.offsetParent;}return realNum;
}

<body>
<style>body { margin:0;  }.box1 { width:300px; height:300px; margin:100px; background:#333; overflow:hidden; position:relative; }.box2 { width:200px; height:200px; margin:100px; background:#666; overflow:hidden; position:relative; }.box3 { width:100px; height:100px; margin:100px; background:#999;}
</style>
<div class="box1"><div class="box2"><div class="box3"></div></div>
</div>
<script>var oBox1 = document.querySelector('.box1');var oBox2 = document.querySelector('.box2');var oBox3 = document.querySelector('.box3');function offset(obj,direction){//将top,left首字母大写,并拼接成offsetTop,offsetLeftvar offsetDir = 'offset'+ direction[0].toUpperCase()+direction.substring(1);var realNum = obj[offsetDir];var positionParent = obj.offsetParent;  //获取上一级定位元素对象while(positionParent != null){realNum += positionParent[offsetDir];positionParent = positionParent.offsetParent;}return realNum;}console.log('box1: '+ offset(oBox1,'left') +','+ offset(oBox1,'top'));console.log('box2: '+ offset(oBox2,'left') +','+ offset(oBox2,'top'));console.log('box3: '+ offset(oBox3,'left') +','+ offset(oBox3,'top'));
</script>
</body>

相关资源:【JavaScript】全面解析offsetLeft、offsetTop

offsetLeft、offsetTop全面解析相关推荐

  1. 对于offsetWidth,offsetHeight,offsetLeft,offsetTop的理解

    如何理解区分offsetWidth,offsetHeight,offsetLeft,offsetTop 在刚开始使用的时候总是不能理解这四个有什么不一样,用在哪里,因为这几个词真的太像了,emmm,总 ...

  2. 理清offsetparent()、offsetLeft/offsetTop、offset()、position()

    简而言之,它们的概念如下: ① offsetparent() 指的是元素的第一级拥有定位属性(absolute/relative/fixed)的父元素. ② offsetLeft/offsetTop ...

  3. HTMLElement属性:offsetParent,offsetLeft,offsetTop

    HTMLElement.offsetParent - Web API 接口参考 | MDN HTMLElement.offsetParent 是一个只读属性,返回一个指向最近的(指包含层级上的最近)包 ...

  4. 一文看懂js中元素偏移量(offsetLeft,offsetTop,offsetWidth,offsetHeight)

    偏移量(offset dimension) 偏移量:包括元素在屏幕上占用的所有可见空间,元素的可见大小由其高度,宽度决定,包括所有内边距,滚动条和边框大小(注意,不包括外边距). 以下4个属性可以获取 ...

  5. offsetleft和offsettop的使用

    offsetLeft 是一个只读属性,返回当前元素相对于 offsetParent 节点左边界的偏移像素值. offsetLeft和offsetTop理解为当前元素 距离 父元素左上角的偏移值(偏移量 ...

  6. 深入理解浏览器解析和执行过程

    在我们公司的业务场景中,有很大一部分用户是使用老款安卓机浏览页面,这些老款安卓机性能较差,如果优化不足,页面的卡顿现象会更加明显,此时页面性能优化的重要性就凸显出现.优化页面的性能,需要对浏览器的渲染 ...

  7. offsetLeft 、offsetWidth、scrollHeight等的区别

    一.offsetLeft/offsetTop offsetLeft:元素最左边离最近的有定位的父级之间的距离,不带单位. offsetTop:元素最上边离最近的有定位的父级之间的距离,不带单位. 上图 ...

  8. 令人头疼的clientTop、scrollTop、offsetTop

    2019独角兽企业重金招聘Python工程师标准>>> 参考:http://www.cnblogs.com/gagarinwjj/p/conflict_client_offset_s ...

  9. 蒙了吗?offsetLeft、offsetWidth、scrollTop、scrollWidth、event.pageX

    1.offsetHeight || offsetWidth = boder + padding + content 两者都是只读属性,如果想 offsetLeft   offsetTop 一般是相对于 ...

最新文章

  1. python 函数调用列表_在项目列表上调用一个函数的最简洁方法 - python
  2. 分析函数调用的汇编指令
  3. 编程实现迷你计算器功能_VBA编程实现饲料配方计算器
  4. realme GT Neo3重磅细节曝光:首发150W快充 5分钟充50%
  5. 配置suse syslog服务器
  6. [公告]请不要在首页转载文章
  7. 数仓 调度_大数据作业调度
  8. 施耐德 m340 编程手册_施耐德PLC漏洞历险记
  9. 绘制微信小程序画布时钟
  10. linux系统查看内核版本是多少,在linux下查看内核版本、gcc版本、操作系统多少位等参数...
  11. Python——贪吃蛇游戏
  12. 微信小程序的socket.io即时通讯开发(基于E聊SDK)
  13. Image.Save 方法
  14. Unraid使用记录:使用Docker与虚拟机
  15. 数组算法之“前缀和”
  16. ICMP协议(网际控制报文协议)
  17. 百度手环开源 51822开发套件
  18. 华通-小天 IDC
  19. c语言 滑窗法_滑动窗口算法(一)
  20. YunOS@Home落地,智能家居离照顾衣食起居还有多远

热门文章

  1. 在 Python Turtle 中绘制颜色填充的形状
  2. CSS 最后一个元素 不要border-bottom
  3. 重庆北大青鸟解放碑校区J12班 chickenNice队【游戏账号交易平台】
  4. Alpha Go和Alpha Go Zero的文献阅读
  5. iOS 高德地图怎么在屏幕内显示所有的Marker?
  6. 安装Paddle环境
  7. Seagull Scientific BarTender Enterprise 11.2 条码标签设计打印软件,功能强大、操作简单
  8. 北京python培训 脱产
  9. python实现输入Y/N执行或退出程序
  10. 富士康将向印度投资建厂 提供4000就业岗位