获取任意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 相关文章推荐
Mootools 1.2教程 Tooltips
Sep 15 Javascript
Javascript 键盘事件的组合使用实现代码
May 04 Javascript
浅析js中取绝对值的2种方法
Jul 09 Javascript
js中this的用法实例分析
Jan 10 Javascript
纯javascript实现四方向文本无缝滚动效果
Jun 16 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
Jun 21 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
Dec 14 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
Feb 15 Javascript
JS简单获取当前日期和农历日期的方法
Apr 17 Javascript
Express本地测试HTTPS的示例代码
Jun 06 Javascript
vue服务端渲染添加缓存的方法
Sep 18 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
Apr 29 Javascript
获取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实现文件上传二法
2006/10/09 PHP
PHP 编写的 25个游戏脚本
2009/05/11 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
2012/07/22 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
最新的10款jQuery内容滑块插件分享
2011/09/18 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
html的DOM中document对象images集合用法实例
2015/01/21 Javascript
js实现div模拟模态对话框展现URL内容
2016/05/27 Javascript
全面理解闭包机制
2016/07/11 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
详解Webstorm 下的Angular2.0开发之路(图文)
2018/12/06 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
2019/05/27 Javascript
ES6对象操作实例详解
2020/05/23 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
Python基础语言学习笔记总结(精华)
2017/11/14 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
Python-opencv 双线性插值实例
2020/01/17 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
python把一个字符串切开的实例方法
2020/09/27 Python
Python通过len函数返回对象长度
2020/10/22 Python
CSS3 简写animation
2012/05/10 HTML / CSS
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
JAVA招聘远程笔试题
2015/07/23 面试题
高级Java程序员面试要点
2013/08/02 面试题
社区志愿者心得体会
2014/01/03 职场文书
小学生感恩父母演讲稿
2014/08/28 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
2015年招聘工作总结
2014/12/12 职场文书
计划生育个人总结
2015/03/02 职场文书
校长新学期致辞
2015/07/30 职场文书
利用ajax+php实现商品价格计算
2021/03/31 PHP