动效应服务层级与反馈,而不是装饰噪音。按钮悬停用 transition;入场、循环则用 keyframes。

0% 50% 100%
图:属性随时间从起始值过渡到结束值
.card {
  transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.card:hover {
  transform: translateY(-4px);
}

@keyframes rise {
  from { opacity: 0; transform: translateY(12px); }
  to   { opacity: 1; transform: translateY(0); }
}
.hero-title { animation: rise 0.8s ease both; }
性能:优先动画 transform 与 opacity,少直接动画宽高。