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 函数速查表
Feb 07 Javascript
javascript getElementsByClassName实现代码
Oct 11 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
Jan 24 Javascript
js中的push和join方法使用介绍
Oct 08 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
Nov 20 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
Apr 07 Javascript
js+canvas绘制五角星的方法
Jan 28 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
Jul 07 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
Apr 05 Javascript
JavaScript 反射和属性赋值实例解析
Oct 28 Javascript
详解element上传组件before-remove钩子问题解决
Apr 08 Javascript
vue+iview实现分页及查询功能
Nov 17 Vue.js
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
最省空间的计数器
2006/10/09 PHP
php笔记之:AOP的应用
2013/04/24 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
使用配置类定义Codeigniter全局变量
2014/06/12 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
初识JQuery 实例一(first)
2011/03/16 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
node.js中的fs.symlink方法使用说明
2014/12/15 Javascript
JavaScript中Cookies的相关使用教程
2015/06/04 Javascript
nodejs 的 session 简单使用
2016/06/06 NodeJs
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
脚本div实现拖放功能(两种)
2017/02/13 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
轻松掌握python设计模式之策略模式
2016/11/18 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
Django和Flask框架优缺点对比
2019/10/24 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
python 19个值得学习的编程技巧
2020/08/15 Python
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
经销商培训邀请函
2014/01/21 职场文书
学生会招新策划书
2014/02/14 职场文书
仓库主管岗位职责
2014/03/02 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
大一新生期末自我评价
2014/09/12 职场文书
2014年预备党员学习新党章思想汇报
2014/09/15 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis
Python 数据可视化之Matplotlib详解
2021/11/02 Python