工作中有一个很常见的需求,hover或者click某元素后,在该元素旁边出现弹框,主要就是获取该元素的位置坐标以及元素所占区块的大小。最近工作中就遇到了,发现js和jquery的实现方法有很大的区别,这里总结一下,备忘。

  1. 获取元素的相对位置信息

    • 原生js方法
          var x = obj.offsetLeft,
      y = obj.offsetTop;
    • jquery方法
          var _offset = $obj.offset(),
      x = _offset.left,
      y = _offset.top;

    这两个方法看起来相似,其实有很大的不同.

    1. 原生js获取位置的参考信息是:父辈元素中的定位元素,即非static(默认值)的元素。而juqery方法始终返回相对于文档的偏移。
    2. 当父元素有滚动条的时候,两者的情况也是不同的。js会把滚动的距离也算在相应的偏移量中,而jquery的值不受滚动条的影响。

      综合以上两点不同可以看出:当父元素不会出现滚动条且父辈元素的定位属性都统一(即参考点要相同)的时候,可以用原生方法获取位置信息,弹框用相对定位(相对于上面提到的参考点).jquery则相对简单很多,因为他的计算始终相对于文档,所以弹框用fixed定位即可。
  2. 获取元素所占区块的大小
    • 原生js方法
          // 方法1
      var _width = obj.style.width,
      _height = obj.style.height;
      // 方法2
      var _width = obj.offsetWidth,
      _height = obj.offsetHeight;

      其中方法一基本可以忽略,因为他只能获取到内敛样式。当然可以代替他的方法也有,情参考通过原生js获取元素的样式

    • jquery方法
          // 获取高度的方法类似
      var _width1 = $obj.width(),
      _width2 = $obj.innerWidth(),
      _width3 = $obj.outerWidth(),
      _width4 = $obj.outerWidth(true);

      有多重方法可以获取元素的大小,下面分别介绍异同。由盒模型可以知道,元素所占空间大小 = width + padding + border + margin; 所以可以得到以下对应关系:

          _width1 = width;
      _width2 = width + padding;
      _width3 = width + padding + border;
      _width4 = width + padding + border + marign;

      原生js方法2获取的宽度_width相当于jquery的方放获取到的_width3;


根据以上获取到的信息就可以定位弹框的位置了:

    $popup.css({ // 此处把弹框定位在元素的右侧居中位置
left: x + _width,
top: y + _height/2
})

获取元素位置信息和所占空间大小(via:js&jquery)的更多相关文章

  1. 获取元素位置信息:getBoundingClientRect

    一个神奇的方法. 一.历史 偷个懒,上个传送门:http://www.cnblogs.com/2050/archive/2012/02/01/2335211.html 二.介绍 DOM元素方法,返回一 ...

  2. js获取元素位置和style的兼容性写法

    今天说一下js获取元素位置和style的方法.当然不只是element.style那么简单.. 主角:getBoundingClientRect,getClientRects,getComputedS ...

  3. Selenium2学习-031-WebUI自动化实战实例-029-JavaScript 在 Selenium 自动化中的应用实例之四(获取元素位置和大小)

    通过 JS 或 JQuery 获取到元素后,通过 offsetLeft.offsetTop.offsetWidth.offsetHeight 即可获得元素的位置和大小,非常的简单,直接上源码了,敬请参 ...

  4. 【全面总结】js获取元素位置大小

    [js获取元素位置+元素大小]全面总结 目录 1.关于offset offsetParent(只读) offsetTop(只读) offsetLeft(只读) offsetHeight(只读) off ...

  5. 关于微信小程序获取当前位置信息

    小程序开发---获取当前位置信息 一.获取用户地理位置信息 1.配置app.json文件 { "pages": ["pages/index/index"], & ...

  6. C# 64位系统中类型所占空间大小

    Boolean   8Byte DateTime 8Byte Decimal  16Byte String 引用地址空间8Bypte Int 4Bypte 类所占空间大小 (byte):各个filed ...

  7. oracle 查看表行数所占空间大小

    最新数据库空间有感觉捉急了,上次,删了些数据空了800+G,撑了一个多月,现在还有400+G,每天10G的增量,多少空间也感觉不够用啊. 不能加硬盘,就只有删数据了.. 删数据,人懒,直接找表行最多, ...

  8. 在Android Studio中使用BaiduMap SDK实时获取当地位置信息

    配置BaiduMap 环境 1.在百度API中新建自己的一个APP包名和APP名需要注意和自己Android Studio 中的包名和APP名保持一致: 2.百度地图中还需要填写一个SHA1 数字签名 ...

  9. Android初级教程获取手机位置信息GPS与动态获取最佳方式

    简单介绍一下gps定位的操作. 主要是靠locationmanger这个api完成的一些操作:通过获取这个实例,然后调用它的requestLocationUpdates方法进行注册.传入的参数分别有以 ...

随机推荐

  1. XX公司在线笔试题编程题之一

    题目: #include <iostream> #include <vector> #include <string> #include <list> ...

  2. unknow table alarmtemp error when drop database (mysql)

    Q: unknow table alarmtemp error when  drop database (mysql) D: alarmtemp is table in rtmd database. ...

  3. 介绍 Active Directory 域服务 (AD DS) 虚拟化

    TechNet 库 Windows Server Windows Server 2012 R2 和 Windows Server 2012 服务器角色和技术 Active Directory Acti ...

  4. Windows 2008 WinRM和WinRS能帮你做什么?

     介绍    WinRM及WinRS更新包含在Windows Vista, Windows Server 2003 R2, Windows Server 2008 (及 Server 2008 Cor ...

  5. Python学习之正则表达式初探

    正则表达式 正则表达式 (或 regexes ) 是通用的文本模式匹配的方法. Django URLconfs 允许你 使用任意的正则表达式来做强有力的URL映射,不过通常你实际上可能只需要使用很少的 ...

  6. IOS开发学习笔记011-xcode使用技巧

    xcode使用技巧 1.自动生成类 2.断点调试 3.代码段保存 4.注释标记 1.新建类,自动生成两个文件和基本结构 第一步  第二步,选择新建一个类,而不是一个源文件  第三步,书写类名一级自己要 ...

  7. IE hasLayout详解

    hasLayout定义 haslayout 是Windows Internet Explorer渲染引擎的一个内部组成部分.在Internet Explorer中,一个元素要么自己对自身的内容进行计算 ...

  8. STW 团队项目分析

    序言 经过我们团队的详细讨论,最终确定我们的项目立意,它包含这我们每个人的观点,我相信我们可以做的很好,Believe......................................... ...

  9. 《HTTP协议详解》读书笔记---请求篇之情求方法

    之前对于网络这一块不是很清楚,值知道TCP/IP协议,三次握手四次握手之类的很笼统,零碎的知识,现在打算系统学习下网络相关的知识,先从http协议开始. 本人,还是新手,对于一些知识如果有理解错误的, ...

  10. ThinkPHP5 连接 PostgreSQL

    $request = Db::connect( [ 'type' => 'pgsql', 'hostname' => '127.0.0.1', 'database' => 'keyw ...