offsetLeft 解析

offsetLeft 解析前言 先看下 w3c 与之相关的介绍 element offsetHeight 返回元素的高度 element offsetWidth 返回元素的宽度 element offsetLeft 返回元素的水平偏移位置 element offsetParent 返回元素的偏移容器 element offsetTop 返回元素

前言:先看下w3c与之相关的介绍:

element.offsetHeight 返回元素的高度。
element.offsetWidth 返回元素的宽度。
element.offsetLeft 返回元素的水平偏移位置。
element.offsetParent 返回元素的偏移容器。
element.offsetTop 返回元素的垂直偏移位置。

1,简单来说就是偏移量,但它的参考对象到底是谁,我们慢慢来看.

<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>






效果如下:

offsetLeft 解析

这个demo中可以看出在默认情况下每个box的偏移值都是以浏览器为参考对象的.

 

2.如果我们给父级加上定位呢?(box1添加相对定位)

<body> <style> body { 
      margin:0; } .box1 { 
      width:300px; height:300px; margin:100px; background:#333; overflow:hidden; position:relative;} //box1设置相对定位 .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>

效果:

offsetLeft 解析

所以给父级添加定位之后,offset的偏移值就会变成相对于父级的偏移值.(除了position:static;外的所有定位,如fixed,relative,absolute都会使偏移值的参考对象变为父级))

 

 3.在我们给父级添加定位之后,还想获取元素相对于浏览器窗口的偏移值怎么办?

  思路很简单,就是把元素本身的偏移量跟所有上级定位元素的偏移量都加起来就可以了,问题又来了,假如我们不知道他有几个上级定位元素呢?

  这就需要封装一个函数(用到了offsetParent :获取上一级定位元素对象):

function offset(obj,direction){ //传入对象 和 方向 //将top,left首字母大写,并拼接成offsetTop,offsetLeft var 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; }

实际运用是这样的:

<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> <body> <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,offsetLeft var 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>

 

运用到移动端拖拽事件(jquery):

 // 拖拽事件 var x1; var x2; var x_c;  //指针划过的距离 var xoffsetLeft;
$(

'#ulListMoble').on('touchstart', function (e) { var touch = e.originalEvent.targetTouches[0]; x1 = touch.pageX; }); $('#ulListMoble').on('touchmove', function (e) { var touch = e.originalEvent.targetTouches[0]; xoffsetLeft = $('#ulListMoble')[0].offsetLeft; x2 = touch.pageX; x_c = x1 - x2; xoffsetLeft -= x_c; // console.log(xoffsetLeft); if (xoffsetLeft < 0) { $('#ulListMoble').css({ "left": xoffsetLeft + "px" }) } x1 = x2; }); })

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219323.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午10:50
下一篇 2026年3月17日 下午10:51


相关推荐

  • pycharm 多行编辑_pycharm如何只运行部分代码

    pycharm 多行编辑_pycharm如何只运行部分代码pycahrm的多行编辑模式可以允许你多行写像同样的代码,但是你删除的时候,也不会像以前那样舒服了,下面就是多行模式的删除的时候出现的问题:选中删除的时候,会出现部分选中,甚至会出现很长的竖着的输入标志,如果有人遇到了这样的问题就i是可能不小心把多行输入这个功能打开了~…

    2022年8月25日
    10
  • 2022年G3锅炉水处理找解析及G3锅炉水处理考试试卷[通俗易懂]

    题库来源:安全生产模拟考试一点通公众号小程序安全生产模拟考试一点通:G3锅炉水处理找解析是安全生产模拟考试一点通生成的,G3锅炉水处理证模拟考试题库是根据G3锅炉水处理最新版教材汇编出G3锅炉水处理仿真模拟考试。2022年G3锅炉水处理找解析及G3锅炉水处理考试试卷1、【多选题】水垢对锅炉的危害主要有浪费燃料()。(ABD)A、.损坏锅炉受热面B、.降低锅炉出力C、.减少供汽时间D、.缩短锅炉使用寿命E、.提高了环境温度2、【多选题】特种设备作业人员应当遵守()规…

    2022年4月14日
    49
  • pychram 激活码【最新永久激活】

    (pychram 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月31日
    64
  • 登顶全球榜首!月之暗面发布新款万亿参数开源大模型 K2

    登顶全球榜首!月之暗面发布新款万亿参数开源大模型 K2

    2026年3月12日
    2
  • debug编写汇编程序_eclipse中的debug

    debug编写汇编程序_eclipse中的debug关于汇编程序debug的使用完整使用教程-干货满满debug的命令符具体使用流程###前言在网上搜索了10min,大多数关于汇编程序debug功能的使用的文章,发现大多数都是一样的,只是简单的介绍了debug的一些命令符之类的,均没有谈及你自己编写的汇编程序应该如何使用debug。这对新人学习汇编很不友好!debug的命令符debug命令符Explain-a逐行汇编…

    2022年10月15日
    4
  • OCX控件签名

    OCX控件签名即便是经常被人批评,但是OCX,还是存在很多年了,在经后很多年,它都还将存在着。因为在有的环境下,简单的b/s开发技术是达不到需求的。比如访问硬件设备,比如安全防护。因此我们还要用到OCX的。但是要想在正式的场合下,在WEB界面上用OCX,需要进行签名。否则很多时候浏览器会禁止加

    2022年7月13日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号