插件窝 干货文章 CSS动画如何实现元素的非线性突变式移动?

CSS动画如何实现元素的非线性突变式移动?

动画 突变 实现 使用 386    来源:    2025-03-21

在CSS中,动画通常是通过@keyframes规则和animation属性来实现的。默认情况下,CSS动画是线性过渡的,但你可以通过使用animation-timing-function属性来实现非线性突变式移动。

1. 使用 steps() 函数

steps() 函数可以让动画在关键帧之间以离散的步骤进行,而不是平滑过渡。这可以用来实现突变式移动。

@keyframes jump {
  0% {
    transform: translateY(0);
  }
  50% {
    transform: translateY(-100px);
  }
  100% {
    transform: translateY(0);
  }
}

.element {
  animation: jump 2s steps(2, jump-end) infinite;
}

在这个例子中,steps(2, jump-end)表示动画将在两个步骤中完成,jump-end表示每个步骤结束时突变。

2. 使用 cubic-bezier() 函数

如果你想实现更复杂的非线性动画,可以使用cubic-bezier()函数来定义自定义的贝塞尔曲线。

@keyframes move {
  0% {
    transform: translateX(0);
  }
  100% {
    transform: translateX(200px);
  }
}

.element {
  animation: move 2s cubic-bezier(0.68, -0.55, 0.27, 1.55) infinite;
}

在这个例子中,cubic-bezier(0.68, -0.55, 0.27, 1.55)定义了一个自定义的贝塞尔曲线,使得元素在移动过程中产生非线性突变效果。

3. 使用 animation-play-statesetTimeout

如果你需要更精确的控制,可以使用JavaScript来动态控制动画的播放状态。

<div class="element"></div>
@keyframes move {
  0% {
    transform: translateX(0);
  }
  100% {
    transform: translateX(200px);
  }
}

.element {
  width: 50px;
  height: 50px;
  background-color: red;
  animation: move 2s linear infinite;
  animation-play-state: paused;
}
const element = document.querySelector('.element');

function startAnimation() {
  element.style.animationPlayState = 'running';
  setTimeout(() => {
    element.style.animationPlayState = 'paused';
  }, 500); // 500ms后暂停动画
}

setInterval(startAnimation, 1000); // 每1秒启动一次动画

在这个例子中,JavaScript代码每1秒启动一次动画,并在500ms后暂停动画,从而实现突变式移动。

总结

  • 使用steps()函数可以实现离散的突变式移动。
  • 使用cubic-bezier()函数可以实现复杂的非线性动画。
  • 使用JavaScript可以更精确地控制动画的播放状态,实现突变效果。

根据你的具体需求,可以选择合适的方法来实现元素的非线性突变式移动。