javascript - 动画 DOM 元素交换

标签 javascript html css animation swap

我想以普通的方式制作两个 DOM 元素交换的动画。

我在动画结束时遇到问题,但我不知道是什么原因造成的:/

这是我的代码:

HTML

<div class="container">
  <div class="child" id="childA">A</div>
  <div class="child" id="childB">B</div>
</div>

<button>Swap position</button>

JS

const childA = document.querySelector('#childA');
const childB = document.querySelector('#childB');
const finalChildAStyle = {
  x: null,
  y: null,
};
const finalChildBStyle = {
  x: null,
  y: null,
};

let swapDone = false;

document.querySelector('button').addEventListener('click', () => {
  if (swapDone === false) {
    finalChildAStyle.x = childA.getBoundingClientRect().left - childB.getBoundingClientRect().left;
    finalChildAStyle.y = childB.getBoundingClientRect().top - childA.getBoundingClientRect().top;
    finalChildBStyle.x = childB.getBoundingClientRect().left - childA.getBoundingClientRect().left;
    finalChildBStyle.y = childA.getBoundingClientRect().top - childB.getBoundingClientRect().top;
    childA.style.transform = `translate(${finalChildAStyle.x}px, ${finalChildAStyle.y}px)`;
    childB.style.transform = `translate(${finalChildBStyle.x}px, ${finalChildBStyle.y}px)`;

    setTimeout(() => {
      document.querySelector('.container').insertBefore(childB, childA);
      childB.removeAttribute('style');
      childA.removeAttribute('style');
    }, 300);
  }
  swapDone = true;
});

这是我的代码笔:https://codepen.io/ChucKN0risK/pen/pLWVro

提前致谢;)

最佳答案

我更新了您的代码笔:

https://codepen.io/anon/pen/VXMdwE

问题是你的CSS包含这个:

.child {
  transition: transform ease-in 0.3s; 
}

实际上,您只希望在特定时间在子进程上激活转换:在交换过程的中间。您不希望在交换过程结束时进行转换,所以我这样做了:

.css:

.child.transition {
  transition: transform ease-in 0.3s;
}

.js

document.querySelector('button').addEventListener('click', () => {
  if (swapDone === false) {
    childA.classList.add('transition');
    childB.classList.add('transition');

    ...
    setTimeout(() => {
      document.querySelector('.container').insertBefore(childB, childA);
      childA.classList.remove('transition');
      childB.classList.remove('transition');
      childB.removeAttribute('style');
      childA.removeAttribute('style');
    }, 300);

这样,当您删除过渡样式时就不再有过渡动画

关于javascript - 动画 DOM 元素交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49488035/

相关文章:

html - 为什么跨度为 : auto and display: inline-block parent of svg is getting bigger height than its svg child?

javascript - 如何知道 HTMLTableDataCellElement 的整个文本被选中

html - 如何应用具有透明到白色渐变的淡出文本效果?

java - Internet Explorer 6 中的 "Unknown Name"JSException 是什么?

HTML/CSS - 根据可用元素更改布局

javascript - 如何恢复覆盖的 javascript 打印方法

html - 如何在 W3.CSS 中将两张卡片并排放置

javascript - 从 JSON 属性加载 HTML img 元素的图像,而 URL 不能直接访问

javascript - JavaScript 中空格等于整数 0 吗?

javascript - Chrome 插件 - 上下文菜单插入文本