|
|
@@ -94,26 +94,11 @@ export default {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- children.forEach(c => {
|
|
|
- /* istanbul ignore if */
|
|
|
- if (c.elm._moveCb) {
|
|
|
- c.elm._moveCb()
|
|
|
- }
|
|
|
- /* istanbul ignore if */
|
|
|
- if (c.elm._enterCb) {
|
|
|
- c.elm._enterCb()
|
|
|
- }
|
|
|
- const oldPos = c.data.pos
|
|
|
- const newPos = c.data.pos = c.elm.getBoundingClientRect()
|
|
|
- const dx = oldPos.left - newPos.left
|
|
|
- const dy = oldPos.top - newPos.top
|
|
|
- if (dx || dy) {
|
|
|
- c.data.moved = true
|
|
|
- const s = c.elm.style
|
|
|
- s.transform = s.WebkitTransform = `translate(${dx}px,${dy}px)`
|
|
|
- s.transitionDuration = '0s'
|
|
|
- }
|
|
|
- })
|
|
|
+ // we divide the work into three loops to avoid mixing DOM reads and writes
|
|
|
+ // in each iteration - which helps prevent layout thrashing.
|
|
|
+ children.forEach(callPendingCbs)
|
|
|
+ children.forEach(recordPosition)
|
|
|
+ children.forEach(applyTranslation)
|
|
|
|
|
|
// force reflow to put everything in position
|
|
|
const f = document.body.offsetHeight // eslint-disable-line
|
|
|
@@ -124,7 +109,6 @@ export default {
|
|
|
var s = el.style
|
|
|
addTransitionClass(el, moveClass)
|
|
|
s.transform = s.WebkitTransform = s.transitionDuration = ''
|
|
|
- el._moveDest = c.data.pos
|
|
|
el.addEventListener(transitionEndEvent, el._moveCb = function cb (e) {
|
|
|
if (!e || /transform$/.test(e.propertyName)) {
|
|
|
el.removeEventListener(transitionEndEvent, cb)
|
|
|
@@ -152,3 +136,31 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+function callPendingCbs (c) {
|
|
|
+ /* istanbul ignore if */
|
|
|
+ if (c.elm._moveCb) {
|
|
|
+ c.elm._moveCb()
|
|
|
+ }
|
|
|
+ /* istanbul ignore if */
|
|
|
+ if (c.elm._enterCb) {
|
|
|
+ c.elm._enterCb()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function recordPosition (c) {
|
|
|
+ c.data.newPos = c.elm.getBoundingClientRect()
|
|
|
+}
|
|
|
+
|
|
|
+function applyTranslation (c) {
|
|
|
+ const oldPos = c.data.pos
|
|
|
+ const newPos = c.data.newPos
|
|
|
+ const dx = oldPos.left - newPos.left
|
|
|
+ const dy = oldPos.top - newPos.top
|
|
|
+ if (dx || dy) {
|
|
|
+ c.data.moved = true
|
|
|
+ const s = c.elm.style
|
|
|
+ s.transform = s.WebkitTransform = `translate(${dx}px,${dy}px)`
|
|
|
+ s.transitionDuration = '0s'
|
|
|
+ }
|
|
|
+}
|