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代码
Mar 27 Javascript
ExtJS 2.0实用简明教程 之ExtJS版的Hello
Apr 29 Javascript
Jquery插件之多图片异步上传
Oct 20 Javascript
ArtEditor富文本编辑器增加表单提交功能
Apr 18 Javascript
node.js + socket.io 实现点对点随机匹配聊天
Jun 30 Javascript
javascript 日期相减-在线教程(附代码)
Aug 17 Javascript
深入剖析Express cookie-parser中间件实现示例
Feb 01 Javascript
浅谈vue后台管理系统权限控制思考与实践
Dec 19 Javascript
fastadmin中调用js的方法
May 14 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
Dec 17 Javascript
Vue.js的模板语法详解
Feb 16 Javascript
jQuery实现的分页插件完整示例
May 26 jQuery
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批量上传的实现代码
2013/06/09 PHP
PHP中的一些常用函数收集
2015/05/26 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
PHP文件打开关闭及读写操作示例解析
2020/08/06 PHP
动态加载js的几种方法
2006/10/23 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
jquery cookie实现的简单换肤功能适合小网站
2013/08/25 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
2018/02/03 Javascript
vue底部加载更多的实例代码
2018/06/29 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
用Python编写简单的微博爬虫
2016/03/04 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
Python中使用遍历在列表中添加字典遇到的坑
2019/02/27 Python
详解python tkinter模块安装过程
2020/01/06 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
Python 实现进度条的六种方式
2021/01/06 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
鲜花方阵解说词
2014/02/13 职场文书
总经理的岗位职责
2014/02/23 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
2014年售票员工作总结
2014/11/19 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
什么是css原子化,有什么用?
2022/04/24 HTML / CSS