当前位置: 代码迷 >> JavaScript >> 用于将元素从一个父元素移动到另一个父元素的反应动画
  详细解决方案

用于将元素从一个父元素移动到另一个父元素的反应动画

热度:40   发布时间:2023-06-12 13:34:40.0

我正在尝试创建一个动画,用于使用 React 将子元素从一个父元素移动到另一个父元素。

用户应该能够点击一个元素并看到它移动到另一个 div 中。

我制作了一个简单的演示组件(没有动画)来展示我的意思。 单击元素时,状态会更新,元素会在正确的位置重新呈现。

class App extends React.Component {

  state = {
    list: ['Alice', 'Bob', 'Charlie', 'David', 'Emily', 'Frank'],
    top: [0, 1, 2],
    bottom: [3, 4, 5]
  }

  moveDown = (item) => {
    let { top, bottom } = this.state
    this.setState({
      top: top.filter(x => x !== item),
      bottom: [...bottom, item]
    })
  }

  moveUp = (item) => {
    let { top, bottom } = this.state
    this.setState({
      top: [...top, item],
      bottom: bottom.filter(x => x !== item)
    })
  }

  render() {
    let { top, bottom, list } = this.state
    return (
      <div style={{
          display: 'flex',
          flexDirection: 'column',
          justifyContent: 'space-between',
          alignItems: 'center',
          height: '90vh',
          width: '100%'
        }}>
        <div>
          {top.map((item) =>
            <div
              onClick={() => this.moveDown(item)}
              style={{color:'red'}}>{list[item]}</div>
          )}
        </div>
        <div>
          {bottom.map((item) =>
            <div
              onClick={() => this.moveUp(item)}
              style={{color:'green'}}>{list[item]}</div>
          )}
        </div>
      </div>
    )
  }
}

Codepen 演示: ://codepen.io/ee92/pen/LqrBjL editors 0010

非常感谢并提前感谢有关如何实现此 div-to-div 动画的任何帮助或建议。

不,这是不可能的

以这种方式制作动画是不可能的,因为 DOM 认为您正在删除一个div然后添加一个新的div 即使它对您来说是同一个div ,DOM 也没有那个上下文。 动画由 CSS 的更改控制,而不是 HTML。

...但这是如何做到的

如果您确实需要两个列表都保留在不同的div ,那么您可以做的最好的事情是:

  1. old item动画到new item位置,然后删除old item并显示new item
  2. 卸下old item ,并创建一个new item ,其中old item为,并将其移动到new item位置。

相同的概念,两种方法。

我修改了您现有的示例以显示选项 2 的简化版本。请注意,需要做出许多动画决定,例如列表变小时会发生什么、项目应该如何从红色变为绿色等,而我没有不要试图客观地解决它们。 此外,如果您可以将两个列表的所有item都放在一个div ,并absolute控制它们的位置,这会容易得多。 但是如果他们需要以单独的div结束......

这是怎么回事

  1. .item添加transition ,我们可以在调整transform属性时使动画发生。
  2. 单击项目时,我们更新状态列表并添加...
  3. transition.item知道哪个项目正在动画......
  4. transition.startTop以了解项目应该从其移动到的列表底部开始的偏移y位置,并且...
  5. transition.startAnim作为控制动画的标志。
  6. 由于transition需要在它们动画之前改变一些东西,我们使用setTimeout来延迟transition.startAnim的变化,这基本上导致动画从计算位置回到0
  相关解决方案