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 相关文章推荐
js封装的textarea操作方法集合(兼容很好)
Nov 16 Javascript
基于jquery实现的鼠标拖拽元素复制并写入效果
Aug 23 Javascript
javascript 保存文件到本地实现方法
Nov 29 Javascript
js实现简单的星级选择器提交效果适用于评论等
Oct 18 Javascript
jQuery中extend()和fn.extend()方法详解
Jun 03 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
Sep 01 Javascript
jQuery Ajax和getJSON获取后台普通json数据和层级json数据用法分析
Jun 08 Javascript
基于vue-router 多级路由redirect 重定向的问题
Sep 03 Javascript
vue的for循环使用方法
Feb 12 Javascript
微信小程序云开发之模拟后台增删改查
May 16 Javascript
Nest.js 授权验证的方法示例
Feb 22 Javascript
JavaScript+HTML实现学生信息管理系统
Apr 20 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
PHP CKEditor 上传图片实现代码
2009/11/06 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
js报$ is not a function 的问题的解决方法
2014/01/20 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
javascript制作的简单注册模块表单验证
2015/04/13 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
解决使用vue.js路由后失效的问题
2018/03/17 Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
2018/04/18 jQuery
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
Element UI框架中巧用树选择器的实现
2018/12/12 Javascript
详解Vue.js v-for不支持IE9的解决方法
2018/12/29 Javascript
js实现图片无缝循环轮播
2019/10/28 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
Vue实现简易购物车页面
2020/12/30 Vue.js
[06:07]DOTA2-DPC中国联赛 正赛 Ehome vs VG 选手采访
2021/03/11 DOTA
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
一些Unix笔试题和面试题
2013/01/22 面试题
设计模式的基本要素是什么
2014/04/21 面试题
医院护士的求职信
2014/01/03 职场文书
大学生活动总结模板
2014/07/02 职场文书
创先争优个人承诺书
2014/08/30 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书
flex布局中使用flex-wrap实现换行的项目实践
2022/06/21 HTML / CSS
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python