获取任意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 相关文章推荐
JQuery扩展插件Validate 1 基本使用方法并打包下载
Sep 05 Javascript
jquery入门—数据删除与隔行变色以及图片预览
Jan 07 Javascript
jQuery中setTimeout的几种使用方法小结
Apr 07 Javascript
JS控制一个DIV层在指定时间内消失的方法
Feb 17 Javascript
使用Script元素发送JSONP请求的方法
Jun 12 Javascript
jQuery对table表格进行增删改查
Dec 22 Javascript
jQuery实现给input绑定回车事件的方法
Feb 09 Javascript
bootstrap警告框示例代码分享
May 17 Javascript
微信小程序项目实践之验证码倒计时功能
Jul 18 Javascript
bootstrap tooltips在 angularJS中的使用方法
Apr 10 Javascript
微信小程序开发打开另一个小程序的实现方法
May 17 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
Jul 26 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 is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
php中如何防止表单的重复提交
2013/08/02 PHP
PHP查询网站的PR值
2013/10/30 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
XP折叠菜单&amp;仿QQ2006菜单
2006/12/16 Javascript
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
移动设备手势事件库Touch.js使用详解
2017/08/18 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
使用Vant完成Dialog弹框案例
2020/11/11 Javascript
python脚本监控docker容器
2016/04/27 Python
Python实现选择排序
2017/06/04 Python
Python正则捕获操作示例
2017/08/19 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
Django框架的使用教程路由请求响应的方法
2018/07/03 Python
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
简历自荐信
2013/12/02 职场文书
周鸿祎:教你写创业计划书
2013/12/30 职场文书
参观接待方案
2014/03/17 职场文书
安全生产大检查方案
2014/05/07 职场文书
信用卡收入证明范本
2015/06/12 职场文书
大学学生会竞选稿
2015/11/19 职场文书
生活委员竞选稿
2015/11/21 职场文书
中学音乐课教学反思
2016/02/18 职场文书
只用20行Python代码实现屏幕录制功能
2021/06/02 Python
spring cloud 配置中心native配置方式
2021/09/25 Java/Android
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB