Appearance
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
#box1 {
width: 150px;
height: 150px;
background: skyblue;
position: relative;
}
#box2 {
width: 100px;
height: 100px;
background: #bfa;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}
#box3 {
width: 50px;
height: 50px;
background: pink;
margin: 0 auto;
margin-top: 25px;
}
</style>
</head>
<body>
<!--
编写一个offset方法,获取当前元素距离body的左/上偏移,无论其父参照物是谁
box3父参照物是box2
box2父参照物是box1
box1父参照物是body
求box3相对于body偏移
首先获取当前元素距离其父参照物的偏移,其次在这个基础上加上父参照物
边框
父参照物距离其父参照物的偏移
-->
<div id="box1">
<div id="box2">
<div id="box3"></div>
</div>
</div>
<script>
function offset (ele) {
let offsetLeft = ele.offsetLeft,
offsetTop = ele.offsetTop,
parent = ele.offsetParent
while (parent && parent.tagName !== 'BODY') {
// 在标准IE8中,获取的offsetLeft/Top包括了边框
if (!/MSIE 8/.test(navigator.userAgent)) {
offsetLeft += parent.clientLeft
offsetTop += parent.clientTop
}
offsetLeft += parent.offsetLeft
offsetTop += parent.offsetTop
parent = parent.offsetParent
}
return {
top: offsetTop,
left: offsetLeft
}
}
console.log(offset(box3))
</script>
</body>
</html>