为什么在转换父级时会影响子位置?
我希望蓝色框保持在黄色框的右下角位置。但是当我翻译红色框时,蓝色框将移动到他的(红色)父级。
在现实生活中,红色代表我在Angular中的ui-view。视图正在滑入和滑出。我无法更改HTML层次结构。
查看我的codepen https://codepen.io/benbesuijen/pen/GPOQjM
HTML
<div class="box-yellow">
<div class="box-red">
<div class="box-blue"></div>
</div>
</div>
CSS
.box-yellow {
background-color: yellow;
position: relative;
height: 200px;
width: 200px;
}
.box-red {
background-color: red;
height: 100px;
width: 100px;
}
.box-blue {
background-color: blue;
bottom: 0;
height: 50px;
position: absolute;
right: 0;
width: 50px;
}
.box-move {
transform: translateX(100%);
}
答案 0 :(得分:3)
查看规范:The Transform Rendering Model
为'transform'属性指定'none'以外的值 在元素处建立一个新的局部坐标系 适用于。
这意味着蓝色元素将变为相对于具有变换的元素(红色父元素) - 不相对于视口(类似于常规静态元素)
但是,我们可以通过将变换应用到黄色框来解决这种情况,并使用蓝色的position: fixed
。
以下是一个例子:
var button = document.querySelector('button'),
boxRed = document.querySelector('.box-red');
button.addEventListener('click', function() {
boxRed.classList.toggle('box-move');
});
&#13;
.box-yellow {
background-color: yellow;
position: relative;
height: 200px;
width: 200px;
transform: translate(0, 0);
float: left;
}
.box-red {
background-color: red;
height: 100px;
width: 100px;
}
.box-blue {
background-color: blue;
bottom: 0;
height: 50px;
position: fixed;
right: 0;
width: 50px;
}
.box-move {
left: 100%;
position: relative;
margin-left: -50%;
}
button {
margin-left: 20px;
}
&#13;
<div class="box-yellow">
<div class="box-red">
<div class="box-blue"></div>
</div>
</div>
<button>Translate red box</button>
&#13;
希望这会有所帮助:)
答案 1 :(得分:0)
我认为您唯一的方法是使用margin-left
并计算框的大小。类似的东西:
button.addEventListener('click', function() {
var boxRedWidth = boxRed.getBoundingClientRect().width;
boxRed.style.marginLeft = boxRedWidth +"px";
});
这是由于translateX
基本上使它成为relative
位置对象,这意味着.box-blue
跳转到它作为其相对父级。
使用margin-left
时,.box-red
仍然为static
,这意味着它不会成为框蓝色的相对父级。