JS OffsetParent属性深入解析


Posted in Javascript onJanuary 13, 2014

offsetParent属性返回一个对象的引用,这个对象是距离调用offsetParent的元素最近的(在包含层次中最靠近的),并且是已进行过CSS定位的容器元素。 如果这个容器元素未进行CSS定位, 则offsetParent属性的取值为根元素(在标准兼容模式下为html元素;在怪异呈现模式下为body元素)的引用。 当容器元素的style.display 被设置为 "none"时(译注:IE和Opera除外),offsetParent属性 返回 null。

句法:
parentObj = element.offsetParent

变量:
· parentObj 是一个元素的引用,当前元素的偏移量在其中计算。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<script type="text/javascript" language="JavaScript">
  function offset_init() {
  var pElement = document.getElementById("sonObj");
  parentObj = pElement.offsetParent;
  alert(parentObj.tagName);
    }
</script>
</head>
<body onload="offset_init()">
<div id="parent">
<p id="sonObj">测试OffsetParent属性</p>
</div>
</body>
</html>

测试结果:
Firefox3:"BODY"
Internet Explorer 7:"BODY"
Opera 9.51:"BODY"
Chrome 0.2:"BODY"
Safari 3:"BODY

结论:
当某个元素及其DOM结构层次中元素都未进行CSS定位时(absolute或者relative)[或者某个元素进行CSS定位时而DOM结构层次中元素都未进行CSS定位时],则这个元素的offsetParent属性的取值为根元素。更确切地说,这个元素的各种偏移量计算(offsetTop、offsetLeft等)的参照物为Body元素。(其实无论时标准兼容模式还是怪异模式,根元素都为Body元素)

测试代码2

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<style type="text/css">
#parent {
    position: absolute; <!-- position:relative; -->
    left: 25px;
    top: 188px;
    border: 1px solid black;
}
</style>
<script type="text/javascript" language="JavaScript">
    function offset_init() {
var pElement = document.getElementById("sonObj");
parentObj = pElement.offsetParent;
alert(parentObj.tagName);
    }
</script>
</head>
<body onload="offset_init()">
<div id="parent">div测试代码
<p id="sonObj">测试OffsetParent属性</p>
</div>
</body>
</html>

测试结果:
Firefox3:"DIV"
Internet Explorer 7:"DIV"
Opera 9.51:"DIV"
Chrome 0.2:"DIV"
Safari 3:"DIV"

结论:
当某个元素的父元素进行了CSS定位时(absolute或者relative),则这个元素的offsetParent属性的取值为其父元素。更确切地说,这个元素的各种偏移量计算(offsetTop、offsetLeft等)的参照物为其父元素

测试代码3

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<style type="text/css">
#Grandfather {
    position: relative;
    left: 25px;
    top: 188px;
    border: 1px solid black;
}
</style>
<script type="text/javascript" language="JavaScript">
function offset_init() {
var pElement = document.getElementById("sonObj");
parentObj = pElement.offsetParent;
alert(parentObj.tagName);
    }
</script>
</head>
<body onload="offset_init()">
<h1 id="Grandfather">
<div id="parent">
<p id="sonObj">测试OffsetParent属性</p>
</div>
</h1>
</body>
</html>

测试结果:
Firefox3:"H1"
Internet Explorer 7:"H1"
Opera 9.51:"H1"
Chrome 0.2:"H1"
Safari 3:"H1"

结论:
当某个元素及其父元素都未进行CSS定位时(absolute或者relative),则这个元素的offsetParent属性的取值为在DOM结构层次中距离其最近,并且已进行了CSS定位的元素。

Javascript 相关文章推荐
读JavaScript DOM编程艺术笔记
Nov 15 Javascript
javascript实现跳转菜单的具体方法
Jul 05 Javascript
Jquery chosen动态设置值实例介绍
Aug 08 Javascript
复选框全选与全不选操作实现思路
Aug 18 Javascript
AngularJS内置指令
Feb 04 Javascript
jQuery实现带动画效果的二级下拉导航方法
Mar 11 Javascript
JS使用JSON作为参数实例分析
Jun 23 Javascript
Vue.js实例方法之生命周期详解
Jul 03 Javascript
js实现敏感词过滤算法及实现逻辑
Jul 24 Javascript
jQuery创建折叠式菜单
Jun 15 jQuery
Vue路由前后端设计总结
Aug 06 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
Jul 19 Javascript
JavaScript网页定位详解
Jan 13 #Javascript
js菜单点击显示或隐藏效果的简单实例
Jan 13 #Javascript
ie8本地图片上传预览示例代码
Jan 12 #Javascript
js 立即调用的函数表达式如何写
Jan 12 #Javascript
IE的事件传递-event.cancelBubble示例介绍
Jan 12 #Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
Jan 12 #Javascript
jquery toolbar与网页浮动工具条具体实现代码
Jan 12 #Javascript
You might like
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
php实现的任意进制互转类分享
2015/07/07 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
thinkPHP5使用Rabc实现权限管理
2019/08/28 PHP
Jquery Ajax学习实例6 向WebService发出请求,返回DataSet(XML) 异步调用
2010/03/18 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
分享jQuery封装好的一些常用操作
2016/07/28 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
2018/11/26 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
基于vue的video播放器的实现示例
2021/02/19 Vue.js
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python多线程原理与用法详解
2018/08/20 Python
详解Python字典小结
2018/10/20 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
2018/12/28 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
python爬取本站电子书信息并入库的实现代码
2020/01/20 Python
python cv2.resize函数high和width注意事项说明
2020/07/05 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
Django启动时找不到mysqlclient问题解决方案
2020/11/11 Python
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
你常见到的runtime exception
2016/09/05 面试题
餐厅销售主管职责范本
2014/02/19 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
毕业生班级鉴定评语
2015/01/04 职场文书
python实现MD5进行文件去重的示例代码
2021/07/09 Python
PHP正则表达式之RCEService回溯
2022/04/11 PHP