使用React实现弹出框的动画效果

11

我在我的Web应用程序中有一个模态框,我希望当用户单击“打开”按钮时它可以滑入。我正在使用react-transition-group来实现这一点。但是,我无法让动画效果工作。不确定问题出在哪里?

import React from 'react';
import ReactDOM from 'react-dom';
import { CSSTransition } from 'react-transition-group';
import Modal from 'react-modal';

import './styles.css';

class Example extends React.Component {
  state = {
    isOpen: false,
  };

  toggleModal = () => {
    this.setState(prevState => ({
      isOpen: !prevState.isOpen,
    }));
  };
  render() {
    const modalStyles = {
      overlay: {
        backgroundColor: '#ffffff',
      },
    };
    return (
      <div>
        <button onClick={this.toggleModal}>
          Open Modal
        </button>
        <CSSTransition
          in={this.state.isOpen}
          timeout={300}
          classNames="dialog"
        >
          <Modal
            isOpen={this.state.isOpen}
            style={modalStyles}
          >
            <button onClick={this.toggleModal}>
              Close Modal
            </button>
            <div>Hello World</div>
          </Modal>
        </CSSTransition>
      </div>
    );
  }
}

CSS文件:

.dialog-enter {
  left: -100%;
  transition: left 300ms linear;
}
.dialog-enter-active {
  left: 0;
}
.dialog-exit {
  left: 0;
  transition: left 300ms linear;
}
.dialog-exit-active {
  left: -100%;
}

这里 是可行的代码。

1个回答

35
这里的问题是react-modal使用react-portal作为其挂载点。因此,它不会被呈现为CSSTransition组件的子级。因此,您不能与其一起使用CSSTransition。
您可以使用一些自定义CSS来创建过渡效果。它在react-modal文档中有介绍。
因此,如果您将此添加到您的CSS中,就会出现过渡效果。
.ReactModal__Overlay {
  opacity: 0;
  transform: translateX(-100px);
  transition: all 500ms ease-in-out;
}

.ReactModal__Overlay--after-open {
  opacity: 1;
  transform: translateX(0px);
}

.ReactModal__Overlay--before-close {
  opacity: 0;
  transform: translateX(-100px);
}

我们需要在模态框中添加closeTimeoutMS属性,以便关闭动画能够正常工作。

      <Modal
        closeTimeoutMS={500}
        isOpen={this.state.isOpen}
        style={modalStyles}
      >

https://codesandbox.io/s/csstransition-component-forked-7jiwn


1
这是一些进展,但是当关闭模态框时淡出效果不起作用。我们能以某种方式实现吗?我已经成功实现了“滑入”效果。代码链接:https://codesandbox.io/s/csstransition-component-11mew - darKnight
我在模态框内使用CSSTransition来动画化其不透明度。该盒子是Modal的直接子元素。但它没有起作用。你能找出原因吗?https://codesandbox.io/s/csstransition-component-z1y2r。谢谢。 - darKnight
我不熟悉CSSTransition,但我会检查它的classNames属性,它真的必须是“modal”吗? - Peter Ambruzs
我认为语法是正确的。请查看此链接:http://reactcommunity.org/react-transition-group/css-transition - darKnight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接