東西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