必须添加transition声明才能实现平滑旋转,推荐在常态规则中设置transform 0.3s ease-in-out;通过transform-origin调整旋转中心点;用translateZ(0)触发硬件加速避免卡顿。
transform: rotate() 悬停时不转或卡顿直接写 :hover { transform: rotate(180deg); } 通常没动画——因为缺少过渡声明。CSS 不会自动补全动画,必须显式告诉浏览器“哪个属性要过渡”“用什么缓动”“持续多久”。
transition 才能平滑旋转只对 transform

transform 0.3s ease-in-out,比 all 0.3s 更精准、性能更好。
transition 要写在**常态规则里**(非 :hover),否则首次悬停无过渡ease 或 linear——ease-in-out 起止更自然,适合图标旋转0.2s–0.4s 最稳妥;太短像闪,太长显得迟钝icon {
display: inline-block;
transition: transform 0.3s ease-in-out;
}
icon:hover {
transform: rotate(180deg);
}默认以元素中心点旋转,但图标常靠左/靠上对齐,结果看起来像“晃动”而非原地转。用 transform-origin 锁定旋转锚点。
transform-origin: center
transform-origin: left center
transform-origin: 50% 50%,兼容性更稳某些浏览器(尤其旧版 Safari 或移动端 WebView)对 rotate() 不触发 GPU 加速,滚动或悬停时掉帧。加 translateZ(0) 强制启用。
icon {
transition: transform 0.3s ease-in-out;
transform: translateZ(0); /* 触发硬件加速 */
}
icon:hover {
transform: rotate(180deg) translateZ(0);
}注意:不要只加在 :hover 里,常态也要有 translateZ(0),否则切换时仍有跳变。