获取任意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中类的定义及其方式(《javascript高级程序设计》学习笔记)
Jul 04 Javascript
jquery提取元素里的纯文本不包含span等里的内容
Sep 30 Javascript
在jQuery中处理XML数据的大致方法
Aug 14 Javascript
JQuery实现简单的图片滑动切换特效
Nov 22 Javascript
基于jQuery日历插件制作日历
Mar 11 Javascript
JavaScript常用判断写法大全(推荐)
May 30 Javascript
Angularjs 自定义服务的三种方式(推荐)
Aug 02 Javascript
js判断数组key是否存在(不用循环)的简单实例
Aug 03 Javascript
JS判断浏览器是否安装flash插件的简单方法
Sep 13 Javascript
jQuery弹出div层过2秒自动消失
Nov 29 Javascript
js querySelector() 使用方法
Dec 21 Javascript
javascript基础练习之翻转字符串与回文
Feb 20 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 Undefined index的问题
2009/06/01 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
PHP中模糊查询并关联三个select框
2017/06/19 PHP
Laravel数据库读写分离配置的方法
2019/10/13 PHP
js 模拟气泡屏保效果代码
2010/07/10 Javascript
查看源码的工具 学习jQuery源码不错的工具
2011/12/26 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
2017/09/07 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
2018/02/13 jQuery
MVVM框架下实现分页功能示例
2018/06/14 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
pycharm下pyqt4安装及环境配置的教程
2020/04/24 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
Django实现简单的分页功能
2021/02/22 Python
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
大学生创业项目方案
2014/03/08 职场文书
实习推荐信
2014/05/10 职场文书
医药销售自荐书
2014/05/29 职场文书
新农村建设典型材料
2014/05/31 职场文书
团队激励口号
2014/06/06 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书