判断盒子的绝对偏移值

124 阅读1分钟
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JS盒子模型属性</title>
<style>
* {
	margin: 0;
	padding: 0;
}

.outer {
	box-sizing: border-box;
	margin: 20px auto;
	width: 500px;
	height: 500px;
	background: lightcoral;
	border: 10px solid orangered;
	position: relative;
}

.box {
	box-sizing: border-box;
	margin: 20px auto;
	padding: 15px;
	width: 300px;
	height: 300px;
	border: 10px solid lightblue;
	background: lightcyan;
	font-size: 18px;
	line-height: 30px;
	overflow: auto;
}
</style>
</head>

<body>
	<div class="outer" id="outer">
		<div id="box" class="box">
			夫君子之行,静以修身,俭以养德,非淡泊无以明志,非宁静无以致远。夫学须静也,才须学也,非学无以广才,非志无以成学。淫漫则不能励精,险躁则不能冶性,年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及~~
		</div>
	</div>

<script>
	/*
	 * offset:获取当前元素距离BODY的左/上偏移(不论其父参照物是谁)
	 *   @params
	 *      curEle:current element当前要操作的元素
	 *   @return
	 *      [object]包含上/左偏移的信息  => {top:xxx,left:xxx} 
	 * by LYR on 2019/08/14
	 */
	function offset(curEle) {
		let par = curEle.offsetParent,
			l = curEle.offsetLeft,
			t = curEle.offsetTop;
		//存在父参照物,而且还没有找到BODY
		while (par && par.tagName !== "BODY") {
			//在原有偏移的基础上累加:父参照物的边框、父参照物的偏移
			if (!/MSIE 8\.0/.test(navigator.userAgent)) {
				//IE8中偏移值自已就算了边框了,不需要我们在加边框的值 navigator.userAgent获取当前浏览器的版本信息
				l += par.clientLeft;
				t += par.clientTop;
			}
			l += par.offsetLeft;
			t += par.offsetTop;
			//继续获取上级参照物
			par = par.offsetParent;
		}
		return {
			top: t,
			left: l
		};
	}
</script>

</body>

</html>