function move_into(el, destEl) { if(el.classList.contains('transition-deplacement')) { console.log('! already movin'); } else { el.classList.add('transition-deplacement'); let startPos = el.getBoundingClientRect(); console.log('déplacement depuis', startPos.left, startPos.top); destEl.appendChild(el); let endPos = el.getBoundingClientRect(); console.log("destination", endPos.left, endPos.top); // Remove transitional class on completion. el.addEventListener('transitionend', function declasse() { console.log("élément", el, "déclassé"); el.removeEventListener('transitionend', declasse); el.classList.remove('transition-deplacement'); }); // Move to initial position, coords from final position : console.log( startPos.left - endPos.left + "px", startPos.top - endPos.top + "px"); el.style.transition = "0s"; el.style.left = startPos.left - endPos.left + "px"; el.style.top = startPos.top - endPos.top + "px"; // Let javascript notice current state. void el.offsetLeft; // Trigger transition : move to final position. el.style.transition = ""; el.style.left = ""; el.style.top = ""; } } function toggle(el, destEl) { if(el.classList.contains('ouvert')) { el.classList.remove('ouvert'); move_into(el, destEl.parentElement); } else { el.classList.add('ouvert'); move_into(el, destEl); } }