【问题标题】:Prevent animation on Loading React Component防止加载 React 组件时出现动画
【发布时间】:2018-03-22 13:07:09
【问题描述】:

基本上,我有一个带有一些动画的组件,但我只想在用户在某个断点调整页面大小时显示它们(如果宽度为

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

希望我已经足够清楚了

编辑: 在“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);
    }
}

这样,当窗口的宽度变为

我尝试过的一件事是让 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;
 }

【问题讨论】:

  • 您的动画基于调整大小事件?请向我们展示您的代码,以便我们查看问题所在。
  • 您是缺少媒体上的右大括号还是因为副本而缺少右括号?
  • 是因为抄袭,对不起! @MatanBobi 这实际上是所有代码(期望像类 Test extends ...).. 这里没有事件调整大小监听器,这一切都是由 CSS 媒体查询完成的.. 当屏幕尺寸小于 1000 时,加载 css对于每个容器更改

标签: javascript css reactjs css-animations


【解决方案1】:

好的,现在我明白你在说什么了。 问题是您仅在调整大小时才尝试制作动画,但每次宽度低于 1000 像素时都会发生媒体查询。

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 并添加动画类。如果它更大,请删除动画类。 不要忘记在构造函数中绑定事件监听处理程序。

【讨论】:

  • 事实上,即使我从不到 1000 到超过 1000 我也会有一个动画(但仍然必须写它).. 但我想我可以安排你的想法:我状态内可能有一个变量,例如“isResize”,它是错误的。只要它为假,动画就不会被再现,而且,一旦用户调整窗口大小,isResize 就会被设置为 true,这样动画就会被再现。听起来对吗?
  • 绝对有可能...只要记住检查宽度是否正确,这样您就不会在每次调整大小时制作动画。并且可能会为此考虑一个去抖/节流,这样您就不会调用 setState 太多次
  • 好吧,我想我不需要检查宽度..让我解释一下:一旦加载了 div,动画就不会被触发..所以动画只会在从 1000.. 我很确定。关于油门,你是完全正确的:在另一个组件中,我有调整大小事件的监听器,我认为油门是必须的。非常感谢!
  • 是的,如果您将动画保留在媒体查询中,您是对的。没问题,很高兴我能提供帮助。请将此标记为稍后搜索的答案。 @MatteoGesmundo
【解决方案2】:

你有代码spinet吗?听起来“componentDidMount”上发生了一些事情,您可以尝试以下操作。

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

【讨论】:

  • componentDidMount 没有 e 因为没有事件触发它,它是一个生命周期方法
  • 对不起,应该以前写过。我添加了一些代码。希望这足以让您了解我的意思
  • 看起来你正在调用一个生命周期方法“componentDidMount”并且它每次都运行动画..每次你的组件挂载动画都会运行
猜你喜欢
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多