工作中有一个很常见的需求,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. Android TV 开发(4)

    本文来自网易云社区 作者:孙有军 最后我们再来看看好友界面,改界面本地是没有xml的,因此我们直接来看看代码: 这里将使用到数据bean,与数据源的代码也贴出来如下: public class Con ...

  2. 【Decode Ways】cpp

    题目: A message containing letters from A-Z is being encoded to numbers using the following mapping: ' ...

  3. nyoj 题目20 吝啬的国度

    吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市, ...

  4. 关于Android应用中图片占用内存浅谈

    从事过移动端应用开发的童鞋应该都清楚,内存是非常宝贵的资源.如果能很好的利用有限的内存,对应用性能的提升会有很大的帮助.在实际应用开发中图片内存占整个应用非常大的比重,我们只有了解图片是如何加载到内存 ...

  5. P4555 最长双回文串

    题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 n的串 S ,求 S的最长双回文子串 T ,即可将 ...

  6. BZOJ-3190 [JLOI2013]赛车

    转成二元一次不等式组,然后半平面交. #include <cstdlib> #include <cstdio> #include <cmath> #include ...

  7. 百度地图API 根据地址查询经纬度

    html页面.引用上API: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> ...

  8. 配置ubuntu16.04下Theano使用GPU运行程序的环境

    ubuntu16.04默认安装了python2.7和python3.5 .本教程使用python3.5 第一步:将ubuntu16.04默认的python2修改成默认使用python3 . sudo ...

  9. 移动端页面a input去除点击效果及pc端切换

    1 手机端页面a button input去除点击效果以及闪屏问题 添加: a, button, input { -webkit-tap-highlight-color: rgba(255, 0, 0 ...

  10. 封装一个类似jquery的ajax方法

    //封装一个类似jquery的ajax方法,当传入参数,就可以发送ajax请求 //参数格式如下{ // type:"get"/"post", // dataT ...