【问题标题】:How to animate dynamic width content? [duplicate]如何为动态宽度内容设置动画? [复制]
【发布时间】:2019-07-14 19:08:00
【问题描述】:

假设我们有一个带有输入字段的按钮,其中输入字段增长到占用可用空间:

单击按钮时,按钮旁边会出现额外的上下文:

内容的宽度是动态的 - 我们无法对其进行硬编码。输入自然会缩小。

如何为动态内容的外观设置动画,使其从按钮后面滑动?

我正在寻找 CSS 动画解决方案。

Playground

【问题讨论】:

标签: javascript css animation flexbox css-animations


【解决方案1】:

您可以使用关键帧动画来做到这一点。关键是设置max-width 大于元素的大小。请注意,动画时间考虑了总最大宽度。

CSS

.test {
  animation-name: test;
  animation-duration: 1s;
  animation-direction: forwards;
  overflow: hidden;
  white-space: nowrap;
}
@keyframes test {
  0% {
    max-width: 0;
  }
  100% {
    max-width: 200px;
  }
}

然后你需要将类添加到你的动态对象中

function App() {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <div className="container">
      <button onClick={() => setIsOpen(!isOpen)}>
        {isOpen ? "Hide" : "Show"}
      </button>
      {isOpen && <div class='test'>Dynamic Content</div>}
      <input type="text" />
    </div>
  );
}

如果你愿意,你可以切换动画持续时间并让它在移除时发生,但我会留给你玩。

https://codesandbox.io/s/6wj6z1ppxr

【讨论】:

  • 非常好的内森。
  • @nathan.medz 有趣的想法!介意分享一个包含移除动画的完整示例吗?
  • @MishaMoroshko 我已经编辑了沙盒
  • 这是个好主意,但如果内容非常动态,可能会出现问题。当您隐藏内容并且max-height 比实际内容大得多时,这一点尤其明显。在这种情况下有一个明显的延迟。
  • @MishaMoroshko 这是不利的一面。始终可以使用三次贝塞尔曲线来优化计时功能,但要获得完美的解决方案,您需要一个脚本来设置动画的宽度或高度值。
猜你喜欢
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 2020-10-29
  • 2017-12-15
  • 2011-08-06
  • 2019-02-20
  • 1970-01-01
  • 2011-09-18
相关资源
最近更新 更多