加载React组件时阻止动画

时间:2018-03-22 13:07:10

标签: javascript css reactjs css-animations

基本上,我有一个带有动画的组件,但我想只在用户在某个断点处调整页面大小时才显示它们(如果宽度是<800px,那么我重新排列div,在那种情况下我想要展示动画。)

我设法做到这一点,但问题是,当我第一次加载页面时,动画将开始,当我不显示它们时。

希望我已经足够清楚了

编辑:在'Test'组件的render()函数中有这个div,其中'main-content'是flex,前两个div在第一行各占50%宽度,第三个内部div在第二行,宽度为100%。

<div className="main-content">
    <div className="content-box admin-setting-container">
    </div>

    <div className="content-box change-password-container">
    </div>

    <div className="content-box organization-setting-container">
    </div>
</div>

在.css文件中我有这段代码:

@media only screen and (max-width: 1000px) {
    .change-password-container, .organization-setting-container {
        animation: fadeDown 0.5s ease-out;
    }
}

@keyframes fadeDown {
    0% {
        opacity: 0.01;
        transform: translateX(-25%);
    }
    100% {
        opacity: 1;
        transform: translateX(0);
    }
}

这样,当窗口的宽度变为<1000时,我将有三行,每个div内部一行。它可以工作,但问题是,如果我打开页面的宽度已经<1000;动画仍会执行,即使我会阻止它们。

我尝试过的一件事就是让div'main-content'带有一个特殊的类'preload',然后在组件挂载后删除该类。 CSS类预加载会阻止动画。让我告诉你代码。

/* IN REACT COMPONENT FILE */
componentDidMount() {
    document.getElementsByClassName("preload")[0].classList.remove("preload");
}
... <div className="main-content preload"> ... </div> ...

/*IN CSS FILE */
.preload * {
     animation-duration: 0s !important;
     -webkit-animation-duration: 0s !important;
 }

2 个答案:

答案 0 :(得分:1)

好的,现在我看到你正在谈论的内容。 问题是,您只是在调整大小时尝试制作动画,但每次宽度低于1000px时都会进行媒体查询。

IMO你应该为调整大小事件添加一个类。 我会用这种方式构建它:

  updateWidth() {
    if(window.innerWidth < 1000 && this.state.width > 1000 || window.innerWidth > 1000 && this.state.width < 1000) {
      this.setState({ width window.innerWidth });
    }
  }


  componentDidMount() {
    window.addEventListener("resize", this.updateWidth);
  }

  componentWillUnmount() {
    window.removeEventListener("resize", this.updateWidth);
  }

在组件中我会检查状态下的宽度是否低于1000并添加animate类。如果它更大,请删除动画类。 别忘了在构造函数中绑定事件监听器处理程序。

答案 1 :(得分:-2)

你有一个代码spinet吗?听起来像是在“componentDidMount”上发生了一些事情,你可以尝试以下内容。

componentDidMount = (e) => {
e.preventDefault();
}