我在用 CSS 做一个下拉菜单的展开动画,用了 transition: height 0.3s ease-out,但感觉不够自然。查资料说可以自定义 cubic-bezier,但我试了几个值效果都不对,要么太生硬要么卡顿。
有没有推荐的缓动函数写法?或者是不是我应该改用 JavaScript 配合 requestAnimationFrame 来控制?比如下面这样写是不是更合适?
.menu {
transition: height 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
这个是 ease-in-out 的效果,看起来挺自然的。如果还是不满意,可以试试其他预设的贝塞尔曲线,或者用工具调整直到满意为止。
cubic-bezier(0.25, 0.46, 0.45, 0.94)是个比较常用的缓动函数,接近于 ease-in-out 效果,如果觉得不够自然,可以稍微调整一下参数。CSS 的 cubic-bezier 工具网站比如 cubic-bezier.com 很好用,可以在上面拖动曲线找到适合的效果。一般来说,移动设备上流畅的动画过渡时间在 200ms 到 500ms 之间,你可以试试
transition: height 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);这种弹跳效果,或者cubic-bezier(0.77, 0, 0.175, 1)这种接近于 easeInOutQuad 的效果。如果觉得 CSS 满足不了需求,可以尝试用 JavaScript 和 requestAnimationFrame,这样可以完全自定义动画过程。不过要注意性能问题,尤其是在低端设备上,频繁操作 DOM 可能会导致卡顿。下面是一个简单的例子:
这段代码简单实现了从某个高度到另一个高度的动画,你可以根据需要调整起始高度、结束高度和持续时间。记得在实际项目中要做适当的错误处理和边界条件检查。