东西janky是怎么回事,当你getCurrentPosAll()
从默认static
改变position
到absolute
你可以改变top
和left
正确设置的默认值之前运行getCurrentPosAll()
。
var selected = document.getElementById("selected");
var selectedX = selected.offsetLeft;
var selectedY = selected.offsetTop;
parties = ['opt1', 'opt2', 'opt3', 'opt4'];
getCurrentPosAll(); // (NEW) Make sure their defaults are set.
function moreTest(e) {
var party = e.target
party.style.left = selectedX + "px";
party.style.top = selectedY + "px";
}
function getCurrentPosAll() {
for (var idx = 0; idx < parties.length; idx++) {
var currentDiv = document.getElementById(parties[idx]);
var x = currentDiv.offsetLeft;
var y = currentDiv.offsetTop;
currentDiv.style.left = x + "px";
currentDiv.style.top = y + "px";
}
for (var idx = 0; idx < parties.length; idx++) {
var currentDiv = document.getElementById(parties[idx]);
currentDiv.style.position = "absolute";
}
}
.wrapper {
display: flex;
justify-content: space-around;
width: 75%;
margin: 0 auto;
}
.selected {
width: 100px;
height: 150px;
position: absolute;
left: 0;
right: 0;
margin-left: auto;
margin-right: auto;
background-color: black;
opacity: 0.6;
z-index: 1;
}
.opt {
width: 100px;
height: 150px;
cursor: pointer;
transition: top 0.7s, left 0.7s;
}
.opt1 {
background-color: red;
}
.opt2 {
background-color: blue;
}
.opt3 {
background-color: orange;
}
.opt4 {
background-color: green;
}
<div class="wrapper">
<div class="selected" id="selected"></div>
<div class="opt opt1" id="opt1" onclick="moreTest(event)"></div>
<div class="opt opt2" id="opt2" onclick="moreTest(event)"></div>
<div class="opt opt3" id="opt3" onclick="moreTest(event)"></div>
<div class="opt opt4" id="opt4" onclick="moreTest(event)"></div>
</div>
我不知道为什么它的行为这样。我认为它与和浏览器计算转换的初始值有关。最后一个元素CSS变化得到成批成1更新。
因此,它将立即接收更新的top
和left
值,而其他元素将接收2个更新,其中一个具有默认的top
和left
,然后一个具有更新的值。导致他们的过渡正常工作。
很可能是因为最后的元素CSS改变,他们的CSS更新2组中应用的更新1.
而不是呀,我想它有一些东西需要与功能不在最后div移动之前完成。我之前称这个函数为onclick,因为它之前的工作方式不同。现在我意识到没有理由在onclick函数中使用它。非常感谢! –
这并不是说移动前的功能没有完成,这是因为出于性能方面的原因,CSS更改被批量更新为单个更新。就像更新循环中的左侧属性一样,[所有更改都被批量化为1次更新](https://jsfiddle.net/zjystr2u/2/)。我们没有看到前三个元素,因为另一个元素CSS被改变了。导致分开的批次 – Lars