关于通过JS移动脱标盒子left或top值时遇到设置的值与展示效果不一样的问题

最近自己写些案例时遇到了这样的问题:

//先写一个简单的布局和样式(省略了html,head,body标签)
//布局:在一个父盒子中嵌入一个子盒子
<div id="parent">
	<div id="child"></div>
</div>

//样式
<style type="text/css">
	* {
			margin: 0;
			padding: 0;
		}
		#parent {
			width: 200px;
			height: 200px;
			margin: 100px auto;
			background-color: red;
			position: relative;
		}
		#child {
			width: 100px;
			height: 100px;
			background-color: green	;
			position: absolute;
			top: 0;
			left: 50%;
			transform: translateX(-50%);
			//margin-left = -50px; 也可以
		}
</style>

现在的效果是这样:
在这里插入图片描述
现在盒子在父级元素中居中了,我通过JS去移动子盒子:

<script type="text/javascript">
//先获取子元素对象
	var childObj = document.getElementById("child");
//通过下面两种方式都可以获取对象的属性
//获取元素距离左边的距离
	console.log(childObj.offsetLeft);//结果:100	返回值数字类型
	console.log(getComputedStyle(childObj,null).left);//结果:100px  返回值字符串类型
</script>

那么疑问来了,父级元素宽度是200px,子级元素的宽度是100px,居中之后,左右距离应该为50px才对,如下图所示:
在这里插入图片描述
那么,如果此时我们设置子级元素的left值为0时,会是怎样的呢?我们来试一下下面的代码:

<script type="text/javascript">
//先获取子元素对象
	var childObj = document.getElementById("child");
//设置属性值,令子级元素的left = 0px;
	childObj.style.left = "0px";
</script>

看下效果图:
在这里插入图片描述
那么,为什么不是下图那样呢?
在这里插入图片描述
因为,此时子级元素的左外边距边界在子级元素的中间,在样式中设置了transform: translateX(-50%);,图像往左移动了一半,但是子级元素的左外边距还是在原来的位置,下面通过图片帮助大家更好理解:

  1. 如果在样式中,没有添加transform: translateX(-50%);或者margin-left = -50px;时,此时左外边距边界(坐标Y轴)就是绿色盒子的左边界
    在这里插入图片描述
  2. 当添加transform: translateX(-50%);或者margin-left = -50px;时,此时相当于绿色盒子往左移动-50px,但是左外边界还是Y轴
    在这里插入图片描述
    所以这就是为什么我们执行console.log(childObj.offsetLeft);的结果会得到100,因为子元素的左边界与父元素左边界之间的偏移为100px。

注意:对于bottom,top,right也是同样的道理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值