是,因属性缺初始值或动了非合成属性。transition需明确起止值,且仅transform/opacity可GPU加速;避免all、left、height等触发布局重排,慎用will-change。
transition不会凭空生成中间状态,它只在“两个明确的、可计算的值之间”插帧。如果元素没设初始值(比如transform: translateX(0)),直接在:hover里写transform: translateX(20px),浏览器可能跳过过渡、直接渲染终点——尤其在首次触发时。
opacity: 1、transform: scale(1)、background-color: rgb(255, 255, 255)
auto、unset或未声明状态开始过渡(如height: auto → height: 100px)rgb()或hsla(),十六进制如#ff0000无法插值,必然跳变CSS中只有transform和opacity能稳定走GPU合成层。一旦你写了transition: left 0.3s、width 0.3s或background-color 0.3s,浏览器就得每帧做Layout + Paint,60fps基本保不住。
left/top换成transform: translateX()或translateY()
height,改用max-height或transform: scaleY()
opacity遮罩,而非直接过渡background-color
ease是默认值,但它“慢进慢出”,在悬停进入时显得拖沓;linear匀速运动又太机械,缺乏物理真实感。生硬感常来自节奏和预期不匹配。
ease-out:快进慢出,响应更干脆ease-in:慢进快出,收尾更利落cubic-bezier(0.25, 0.46, 0.45, 0.94)(Material Design标准曲线)transition: all 0.3s——它会把你不关心的属性也拉进来动,反而干扰主视觉will-change滥用will-change: transform不是开关,而是提示浏览器“这个元素即将变化”,让它提前分配合成层。但挂太久会吃内存,挂错地方(比如给整个body)反而拖慢首屏。
will-change: transform, opacity
transitionend或animationend)transform: translateZ(0)兜底,但现代Chrome已弱化其必要性