js获取元素相对窗口位置的实现代码


Posted in Javascript onSeptember 28, 2014

JS获取元素的offsetTop,offsetLeft等属性

obj.clientWidth //获取元素的宽度

obj.clientHeight //元素的高度
obj.offsetLeft //元素相对于父元素的left
obj.offsetTop //元素相对于父元素的top
obj.offsetWidth //元素的宽度
obj.offsetHeight //元素的高度

区别:

clientWidth = width + padding
clientHeight = height + padding
offsetWidth = width + padding + border
offsetHeight = width + padding + border
offset比client多了border的宽度

//获取元素的纵坐标(相对于窗口)
function getTop(e){
  var offset=e.offsetTop;
  if(e.offsetParent!=null) offset+=getTop(e.offsetParent);
  return offset;
}
//获取元素的横坐标(相对于窗口)
function getLeft(e){
  var offset=e.offsetLeft;
  if(e.offsetParent!=null) offset+=getLeft(e.offsetParent);
  return offset;
}

之前也写过一篇JS关于获取元素位置的文章:JS获取元素的offsetTop,offsetLeft等属性,我们可以通过offsetTop和offsetLeft属性获取元素相对窗口的位置,但offsetTop和offsetLeft属性都是相对于父元素定位的,而通常需要获取位置的元素都不是在最外层,所以遍历上级元素的offset相关属性少不了。那效率就成问题了。

//获取元素的纵坐标(相对于窗口)
function getTop(e){
var offset=e.offsetTop;
if(e.offsetParent!=null) offset+=getTop(e.offsetParent);
return offset;
}
//获取元素的横坐标(相对于窗口)
function getLeft(e){
var offset=e.offsetLeft;
if(e.offsetParent!=null) offset+=getLeft(e.offsetParent);
return offset;
}

好在浏览器给我提供了相应的接口getBoundingClientRect,这个方法最早出现在IE浏览器中,后来的浏览器也跟着支持了这个方法,而且还更加完善,IE中只能获取到元素的left,top,bottom,right的属性,而后面的现代浏览器还能获取到元素的width和

Chrome Firefox (Gecko) Internet Explorer Opera Safari
1.0 3.0 (1.9) 4.0 (Yes) 4.0

这里要注意的是,bottom是元素底部相对于窗口顶部的距离,而不是像css里面position的bottom相对于窗口底部,同理,rihgt属性是元素最右边相对于窗口左边的距离。

var box = document.getElementById("box");
var pos = box.getBoundingClientRect();
box.innerHTML = "top:"+pos.top +
  "left:"+pos.left +
  "bottom:"+pos.bottom +
  "right:"+pos.right +
  "width:"+pos.width +
  "height:"+pos.height

原创文章,转载请注明: 转载自前端开发

Javascript 相关文章推荐
JavaScript高级程序设计 扩展--关于动态原型
Nov 09 Javascript
js自动下载文件到本地的实现代码
Apr 28 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
Jun 20 Javascript
Bootstrap table右键功能实现方法
Feb 20 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
Mar 15 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 Javascript
详解angularjs获取元素以及angular.element()用法
Jul 25 Javascript
JS获取数组中出现次数最多及第二多元素的方法
Oct 27 Javascript
Array数组对象中的forEach、map、filter及reduce详析
Aug 02 Javascript
Node.js 使用request模块下载文件的实例
Sep 05 Javascript
vue 中的 render 函数作用详解
Feb 28 Javascript
Vue清除定时器setInterval优化方案分享
Jul 21 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
Sep 28 #Javascript
浏览器缩放检测的js代码
Sep 28 #Javascript
排序算法的javascript实现与讲解(99js手记)
Sep 28 #Javascript
Javascript中封装window.open解决不兼容问题
Sep 28 #Javascript
jQuery固定浮动侧边栏实现思路及代码
Sep 28 #Javascript
js文件包含的几种方式介绍
Sep 28 #Javascript
javascript中bind函数的作用实例介绍
Sep 28 #Javascript
You might like
php Try Catch异常测试
2009/03/01 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
2015/06/19 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
javascript类型系统——undefined和null全面了解
2016/07/13 Javascript
js中的触发事件对象event.srcElement与event.target详解
2017/03/15 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
TensorFlow安装及jupyter notebook配置方法
2017/09/08 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
解决python图像处理图像赋值后变为白色的问题
2020/06/04 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
python 中的命名空间,你真的了解吗?
2020/08/19 Python
python中numpy.empty()函数实例讲解
2021/02/05 Python
Lenox官网:精美的瓷器&独特的礼品
2017/02/12 全球购物
Farfetch香港官网:汇集全球时尚奢侈品购物平台
2017/11/26 全球购物
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
前厅收银主管岗位职责
2014/02/04 职场文书
2015年校长新年寄语
2014/12/08 职场文书
学生会主席任命书
2015/09/21 职场文书
django 认证类配置实现
2021/11/11 Python