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 相关文章推荐
jquery实现textarea输入字符控制(仿微博输入控制字符)
Apr 26 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
Jul 29 Javascript
javascript分页代码实例分享(js分页)
Dec 13 Javascript
javascript 按键事件(兼容各浏览器)
Dec 20 Javascript
探讨js字符串数组拼接的性能问题
Oct 11 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
Mar 11 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
Nov 30 Javascript
bootstrap输入框组件使用方法详解
Jan 19 Javascript
js断点调试经验分享
Dec 08 Javascript
Vue登录注册并保持登录状态的方法
Aug 17 Javascript
Vue组件间数据传递的方式(3种)
Jul 13 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
Aug 03 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
提问的智慧(2)
2006/10/09 PHP
PHP实现文件安全下载
2006/10/09 PHP
PHP 远程关机实现代码
2009/11/10 PHP
PHP 图片文件上传实现代码
2010/12/29 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
jquery eval解析JSON中的注意点介绍
2013/08/23 Javascript
JS嵌套函数调用上下文的问题解决
2014/03/26 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
2020/10/30 Javascript
基于python时间处理方法(详解)
2017/08/14 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
对python的文件内注释 help注释方法
2018/05/23 Python
python版飞机大战代码分享
2018/11/20 Python
Django uwsgi Nginx 的生产环境部署详解
2019/02/02 Python
python实现LBP方法提取图像纹理特征实现分类的步骤
2019/07/11 Python
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
介绍一下grep命令的使用
2012/06/28 面试题
实习生自我评价
2014/01/18 职场文书
年度评优评先方案
2014/06/03 职场文书
护士医德医风自我评价
2014/09/15 职场文书
医学检验专业自荐信
2014/09/18 职场文书
学习普通话的体会
2014/11/07 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
英语教师个人工作总结
2015/02/09 职场文书
2016新年慰问信范文
2015/03/25 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
分享一些Java的常用工具
2021/06/11 Java/Android
golang内置函数len的小技巧
2021/07/25 Golang