获取任意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 scrollFix滚动定位插件
Apr 01 Javascript
jqPlot jQuery绘图插件的使用
Jun 18 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
Dec 01 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
Mar 08 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
Apr 01 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
Feb 05 Javascript
layui实现动态和静态分页
Apr 28 Javascript
jQuery实现百度图片移入移出内容提示框上下左右移动的效果
Jun 05 jQuery
微信小程序云开发修改云数据库中的数据方法
May 18 Javascript
微信小程序在其他页面监听globalData中值的变化
Jul 15 Javascript
原生js+css调节音量滑块
Jan 15 Javascript
Element InputNumber 计数器的实现示例
Aug 03 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
discuz Passport 通行证 整合笔记
2008/06/30 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
常用的javascript function代码
2008/05/23 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
vue实现折线图 可按时间查询
2020/08/21 Javascript
Python的Django框架中if标签的相关使用
2015/07/15 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
keras 实现轻量级网络ShuffleNet教程
2020/06/19 Python
python/golang 删除链表中的元素
2020/09/14 Python
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
帕克纽约:PARKER NY
2018/12/09 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
JSF的标签库有哪些
2012/04/27 面试题
《识字五》教学反思
2014/03/01 职场文书
新年联欢会主持词
2014/03/27 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
民族团结演讲稿范文
2014/08/27 职场文书
好媳妇事迹材料
2014/12/24 职场文书
保险公司客户经理岗位职责
2015/04/09 职场文书
办公室禁烟通知
2015/04/23 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
浅谈JavaScript作用域
2021/12/06 Javascript
python ConfigParser库的使用及遇到的坑
2022/02/12 Python