获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft (For:IE5+ FF1 )[


Posted in Javascript onDecember 22, 2006

问题:
如何取到页面中任意某个Html元素与body元素之间的偏移距离?

offsetTop和offsetLeft 这两个属性,IE 、Opera和Firefox对它俩的解释存在差异:
IE5.0+ 、Opera8.0+: offsetTop和offsetLeft 都是相对父级元素
Firefox1.06: offsetTop和offsetLeft 都是相对于body元素

因此:
(1)在FF下直接使用offsetTop和offsetLeft,就可以取到页面中任意某个Html元素与body元素之间的偏移距离;
(2)在IE、Opera下则比较麻烦:
需要首先取到该Html元素与body元素之间所有Html元素,计算各自的offsetTop和offsetLeft,然后再累加。
即:从该Html元素开始,遍历至body,在遍历的过程中,如果某个HTML元素的CSS设置了borderWidth的话,则borderWidth不是算在offsetTop和offsetLeft内的--因此在遍历的过程中,还需要累加上:
obj.currentStyle.borderLeftWidth、obj.currentStyle.borderTopWidth

下面这段测试代码已经解决上述问题,兼容IE5、FF1,但在Opera8下无效

实例代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="gb2312">
<head>
<head>
<title> 代码实例:获取任意Html元素与body之间的偏移距离 offsetTop、offsetLeft </title>
<meta http-equiv="content-type" content="text/html; charset=gb2312" />
<meta name="author" content="枫岩,CNLei.y.l@gmail.com">
<style type="text/css" media="all">
body,p {margin:0;padding:0;font-size:12px;}
body {float:left;width:100%;}
ul,ul li {margin:0;padding:0;list-style:none;padding:0;}
ul li input {border:1px solid #ccc;}
#Bd {
background:#FFE8D9;
float:left;
padding:20px;
border:10px solid #f90;/*该值在IE下还是取不到*/
width:100%;
}
#BS {
padding:20px;
float:left;
background:#58CB64;
}
#BS ul {border:20px solid #DDF1D8;}
#BM {
margin-top:100px;
float:right;
width:300px;
background:#fff;
}
</style>
<script type="text/javascript">
var w3c=(document.getElementById)? true:false;
var agt=navigator.userAgent.toLowerCase();
var ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1) && (agt.indexOf("omniweb") == -1));
var ie5=(w3c && ie)? true : false;
var ns6=(w3c && (navigator.appName=="Netscape"))? true: false;
var op8=(navigator.userAgent.toLowerCase().indexOf("opera")==-1)? false:true;

function Obj(o){
 return document.getElementById(o)?document.getElementById(o):o;
}

function GetXYWH(o){
var nLt=0;
var nTp=0;
 var offsetParent = o;
 while (offsetParent!=null && offsetParent!=document.body) {
 nLt+=offsetParent.offsetLeft;
 nTp+=offsetParent.offsetTop;
 if(!ns6){
 parseInt(offsetParent.currentStyle.borderLeftWidth)>0?nLt+=parseInt(offsetParent.currentStyle.borderLeftWidth):"";
 parseInt(offsetParent.currentStyle.borderTopWidth)>0?nTp+=parseInt(offsetParent.currentStyle.borderTopWidth):"";
 }
 offsetParent=offsetParent.offsetParent;
 //alert(offsetParent.tagName);
 }
alert("ID:"+o.id+"\n\nL:"+nLt+" T:"+nTp+"\nW:"+o.offsetWidth+" H:"+o.offsetHeight);
}
</script>
</head>
<body>
<p style="height:100px;margin:0;padding:0;background:#00f;color:#fff;line-height:100px;text-align:center;">此色块高:100px;</p>
<div id="Bd">
<div id="BS">
<ul>
<li><input type="text" value="无法取到橙黄色的边框线宽度(border:10px solid #f90;)" onclick="GetXYWH(this);" size="60" /></li>
<li><input type="text" value="GetXYWH(this);" onclick="GetXYWH(this);" size="60" /></li>
<li><input type="text" value="GetXYWH(this);" onclick="GetXYWH(this);" size="60" /></li>
<li><input type="text" value="GetXYWH(this);" onclick="GetXYWH(this);" size="60" /></li>
<li><input type="text" value="GetXYWH(Obj('BM'));" onclick="GetXYWH(Obj('BM'));" size="60" /></li>
</ul>
</div><!--BS-->
<div id="BM" onclick="GetXYWH(this);">
<p>测试</p>
<p>测试</p>
<p>测试</p>
<p>测试</p>
<p>测试</p>
</div><!--BM-->
</div>
</body>
</html>

Javascript 相关文章推荐
如何用javascript去掉字符串里的所有空格
Feb 08 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
Aug 15 Javascript
JS如何判断移动端访问设备并解析对应CSS
Nov 27 Javascript
javascript中动态函数用法实例分析
May 14 Javascript
JQuery datepicker 用法详解
Dec 25 Javascript
解析预加载显示图片艺术
Dec 05 Javascript
Bootstrap源码解读排版(1)
Dec 23 Javascript
Vue.js实现的表格增加删除demo示例
May 22 Javascript
angularJs select绑定的model取不到值的解决方法
Oct 08 Javascript
jQuery实现的简单日历组件定义与用法示例
Dec 24 jQuery
如何HttpServletRequest文件对象并储存
Aug 14 Javascript
vue-cli4.0多环境配置变量与模式详解
Dec 30 Vue.js
获取Javscript执行函数名称的方法
Dec 22 #Javascript
在Javascript中定义对象类别
Dec 22 #Javascript
枚举JavaScript对象的函数
Dec 22 #Javascript
JavaScript使用prototype定义对象类型(转)[
Dec 22 #Javascript
拖动Html元素集合 Drag and Drop any item
Dec 22 #Javascript
拖动一个HTML元素
Dec 22 #Javascript
JavaScript中Array 对象相关的几个方法
Dec 22 #Javascript
You might like
PHP simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
Symfony2在Nginx下的配置方法图文教程
2016/02/04 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
2017/02/23 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
javascript实现简单的鼠标拖动效果实例
2015/04/10 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
jquery判断复选框是否选中进行答题提示特效
2015/12/10 Javascript
JavaScript File API文件上传预览
2016/02/02 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
ES6新数据结构Set与WeakSet用法分析
2017/03/31 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
Layui table field初始化加载时进行隐藏的方法
2019/09/19 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
python登陆asp网站页面的实现代码
2015/01/14 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
Python使用Pickle模块进行数据保存和读取的讲解
2019/04/09 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
2019/10/25 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
javascript实现用户必须勾选协议实例讲解
2021/03/24 Javascript
目标责任书范本
2014/04/16 职场文书
2014年人事行政工作总结
2014/12/03 职场文书
优秀教师事迹材料
2014/12/15 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python
MySQL创建管理RANGE分区
2022/04/13 MySQL
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android