获取任意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 设置文本框中焦点的位置
Nov 20 Javascript
10款非常有用的 Ajax 插件分享
Mar 14 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
Jan 23 Javascript
js操作iframe的一些方法介绍
Jun 25 Javascript
使用jquery实现简单的ajax
Jul 08 Javascript
javascript不可用的问题探究
Oct 01 Javascript
jquery ajax jsonp跨域调用实例代码
Dec 11 Javascript
js数组与字符串的相互转换方法
Jul 09 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
May 24 Javascript
解决Vue+Element ui开发中碰到的IE问题
Sep 03 Javascript
JS实现的小火箭发射动画效果示例
Dec 08 Javascript
微信小程序实现菜单左右联动
May 19 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/09/17 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
2018/05/21 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
2016/06/14 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
Vue多系统切换实现方案
2018/06/05 Javascript
js中apply()和call()的区别与用法实例分析
2018/08/14 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
js实现适配移动端的拖动效果
2020/01/13 Javascript
[02:47]DOTA2英雄基础教程 野性怒吼兽王
2013/12/05 DOTA
跟老齐学Python之Import 模块
2014/10/13 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
python中实现字符串翻转的方法
2018/07/11 Python
python实现逐个读取txt字符并修改
2018/12/24 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
PyQt5实现登录页面
2020/05/30 Python
python 5个顶级异步框架推荐
2020/09/09 Python
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
办公自动化毕业生求职信
2014/03/09 职场文书
法制宣传标语
2014/06/23 职场文书
小学校长汇报材料
2014/08/20 职场文书
小学校长开学致辞
2015/07/29 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
HTML怎么设置下划线?html文字加下划线方法
2021/12/06 HTML / CSS