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 相关文章推荐
setTimeout和setInterval的浏览器兼容性分析
Feb 27 Javascript
javascript 计算两个整数的百分比值
Dec 26 Javascript
js四舍五入数学函数round使用实例
May 09 Javascript
JavaScript判断数字是否为质数的方法汇总
Jun 02 Javascript
JavaScript中的工厂函数(推荐)
Mar 08 Javascript
Angular4学习笔记之新建项目的方法
Jul 18 Javascript
vue监听scroll的坑的解决方法
Sep 07 Javascript
Vue.js 踩坑记之双向绑定
May 03 Javascript
详解vue-cli官方脚手架配置
Jul 20 Javascript
axios的拦截请求与响应方法
Aug 11 Javascript
ES6使用export和import实现模块化的方法
Sep 10 Javascript
JS/jQuery实现超简单的Table表格添加,删除行功能示例
Jul 31 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使用for语句输出三角形的方法
2015/06/09 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
2016/08/17 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
webpack 4.0.0-beta.0版本新特性介绍
2018/02/10 Javascript
微信小程序中转义字符的处理方法
2019/03/28 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
简化Python的Django框架代码的一些示例
2015/04/20 Python
Python发送email的3种方法
2015/04/28 Python
Python单例模式实例详解
2017/03/01 Python
Python利用ElementTree模块处理XML的方法详解
2017/08/31 Python
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
详细分析Python collections工具库
2020/07/16 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
html5中localStorage本地存储的简单使用
2017/06/16 HTML / CSS
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
运动会致辞稿50字
2014/02/04 职场文书
教师一岗双责责任书
2014/04/16 职场文书
爱与责任演讲稿
2014/05/20 职场文书
运动会加油口号
2014/06/07 职场文书
鸡毛信观后感
2015/06/11 职场文书
运动员代表致辞
2015/07/29 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书