【问题标题】:How does the cubic-bezier() function work?三次贝塞尔()函数如何工作?
【发布时间】:2021-04-05 19:33:48
【问题描述】:

我目前正在尝试学习如何使用cubic-bezier(),但我有点挣扎。

据我了解,它有助于创建由 4 个点组成的贝塞尔曲线,比如说 P0、p1、p2、p3。

P0 和 p3 的坐标分别为 (0, 0) (1, 1),它们代表曲线的起点和终点。

X代表时间,Y代表进度。

所以如果我的函数看起来像

transition-timing-function: cubic-bezier(0.7, 0.2, 1, 1);

在过渡时间的 7/10 之前,我的动画不应该真的很慢吗(所以在过渡时间的 7/10 时,我得到了 0.2 的进度)并且在其余时间非常快? (所以从 7/10 -> 10/10 的时间应该有 0.8 的动画 - 所以应该很快)

这就是我假设它工作的方式,实际上它没有。 这是我的代码

.transitionTest {
    width: 200px;
    height: 200px;
    background-color: blue;
    margin: 100px 0 0 100px;
    transition-property: all;
    transition-duration: 2s;
    transition-timing-function: cubic-bezier(0.7, 0.2, 1, 1);
}

.transitionTest:hover {
    transform: rotate(180deg);
    background-color: red;
    width: 100px;
    height: 100px;
}
<div class="transitionTest"></div>

另外,如果我在这个函数中使用负值会发生什么?

【问题讨论】:

  • 抱歉,您能否向我们展示预期的结果,以便我们了解您的问题。因为对我来说你的代码工作得很好。

标签: css css-transitions


【解决方案1】:

在过渡时间的 7/10 之前,我的动画不应该真的很慢(所以在过渡时间的 7/10 处,我得到了 0.2 的进度)并且在其余时间非常快?

并非如此,因为点不会定义计算,但会定义曲线,然后您需要考虑曲线以找到进展。这是您的点的贝塞尔曲线:

黑色曲线是你的动画,一开始你会有点慢。在大约70% 的时间你将到达动画的50%,另一个50% 将从70%100%

要得到你想要的(20% 到 70%),你需要像下面这样的东西

.box {
  width: 200px;
  height: 200px;
  background-color: blue;
  margin: 100px 0 0 100px;
  transition-property: all;
  transition-duration: 2s;
  transition-timing-function: cubic-bezier(0.6, 0.05, 1, 0.2);
}

.box:hover {
  transform: rotate(180deg);
  background-color: red;
  width: 100px;
  height: 100px;
}
<div class="box"></div>

当然,它不是获得预期效果的唯一组合。有很多组合可以获得它。

获取有关计算的更多详细信息的相关问题:When exactly does an ease animation reach its midpoint?

一个有用的在线工具,可以绘制曲线并轻松了解正在发生的事情:https://www.desmos.com/calculator/d1ofwre0fr?lang=fr

另一个:https://cubic-bezier.com/


另外,如果我在这个函数中使用负值会发生什么?

没什么特别的。您的点将在区域 (0,0) (1,1) 之外,我们以相同的方式绘制曲线。示例:

.box {
  width: 200px;
  height: 200px;
  background-color: blue;
  margin: 100px 0 0 100px;
  transition-property: all;
  transition-duration: 2s;
  transition-timing-function: cubic-bezier(0, 0, 0, -1);
}

.box:hover {
  transform: rotate(180deg);
  background-color: red;
  width: 100px;
  height: 100px;
}
<div class="box"></div>

【讨论】:

  • 嗯,我明白了。所以基本上我不应该像以前那样考虑值 - 我需要看看曲线的样子。
  • @JohnSmith 没错,曲线会给你输出,而不是值。这些值只会绘制曲线
  • 我明白了。谢谢你的时间。你自己怎么用?如果,比方说,你想得到我在帖子中所说的组合。你将如何开始投射它?
  • @JohnSmith 使用我在最后一个链接中提供的工具.. 你把你的 4 个点(两个固定在 (0,0) 和 (1,1))然后你开始玩其他两个并调整它们。你会看到输出随着点的变化而变化,当你得到需要的结果时你会停止它们......背后的数学有点复杂,所以最好依靠这种可视化工具来获得你想要的东西
  • 但是你怎么知道需要使用这2个点(在最后一张图片中)才能得到我想要的效果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 2011-05-08
  • 2011-03-10
  • 2016-10-05
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多