获取任意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实例教程(19) 使用HoTMetal(6)
Dec 23 Javascript
JavaScript中的Web worker多线程API研究
Dec 06 Javascript
node.js中的path.extname方法使用说明
Dec 09 Javascript
jquery调取json数据实现省市级联的方法
Jan 29 Javascript
JQuery鼠标移到小图显示大图效果的方法
Jun 10 Javascript
JavaScript清空数组元素的两种方法简单比较
Jul 10 Javascript
javascript 动态脚本添加的简单方法
Oct 11 Javascript
原生js和css实现图片轮播效果
Feb 07 Javascript
简单实现js上传文件功能
Aug 21 Javascript
基于layui的table插件进行复选框联动功能的实现方法
Sep 19 Javascript
axios实现简单文件上传功能
Sep 25 Javascript
vue 强制组件重新渲染(重置)的两种方案
Oct 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自动更新版权信息显示的方法
2015/06/19 PHP
jQuery AJAX 调用WebService实现代码
2010/03/24 Javascript
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
2011/10/06 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
AngularJS中directive指令使用之事件绑定与指令交互用法示例
2016/11/22 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
推荐10款扩展Web表单的JS插件
2017/12/25 Javascript
vue-lazyload使用总结(推荐)
2018/11/01 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
微信小程序可滑动周日历组件使用详解
2019/10/21 Javascript
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
Python调用C语言开发的共享库方法实例
2015/03/18 Python
利用Python中unittest实现简单的单元测试实例详解
2017/01/09 Python
Python实现的特征提取操作示例
2018/12/03 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
python3.6环境安装+pip环境配置教程图文详解
2019/06/20 Python
django项目用higcharts统计最近七天文章点击量
2019/08/17 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
自荐信格式的六要素
2013/09/21 职场文书
工商管理实习自我鉴定
2013/09/28 职场文书
大学生职业生涯规划书范文
2014/01/14 职场文书
劳动竞赛口号
2014/06/16 职场文书
旅游活动总结
2014/08/27 职场文书
2014最新毕业证代领委托书
2014/09/26 职场文书
董事长助理岗位职责
2015/02/11 职场文书
员工辞职信范文大全
2015/05/12 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python