如何用CSS依次触发两个带延迟的transform实现汉堡按钮转X动画
汉堡按钮分步变换(平移后旋转)的实现方案
要实现translate完成后再触发rotate的分步动画,核心是拆分变换到嵌套元素上,因为单个元素的transform是复合属性,无法单独给translate和rotate设置独立过渡。通过嵌套元素分别承载平移和旋转动作,再利用transition-delay让旋转在平移完成后启动,完全符合你要求的transition实现方式。
完整代码
HTML结构
<div class="hamburger"> <div class="line"><span></span></div> <div class="line"><span></span></div> <div class="line"><span></span></div> </div>
CSS样式
/* 基础重置 */ * { margin: 0; padding: 0; box-sizing: border-box; } .hamburger { width: 40px; height: 40px; position: relative; cursor: pointer; /* 可选:调整按钮位置 */ margin: 20px; } /* 外层容器负责平移 */ .line { width: 100%; height: 4px; position: absolute; left: 0; /* 平移过渡:0.4s完成,无延迟 */ transition: transform 0.4s ease; } /* 内层元素负责旋转 */ .line span { display: block; width: 100%; height: 100%; background-color: #333; border-radius: 2px; /* 旋转过渡:0.4s完成,延迟0.4s(等平移结束) */ transition: transform 0.4s ease 0.4s; } /* 三条线初始位置 */ .line:nth-child(1) { top: 8px; } .line:nth-child(2) { top: 50%; transform: translateY(-50%); } /* 中间线只做淡出 */ .line:nth-child(2) span { transition: opacity 0.4s ease; } .line:nth-child(3) { bottom: 8px; } /* 激活状态(转为X形) */ .hamburger.active .line:nth-child(1) { /* 平移到中间位置 */ transform: translateY(10px); } .hamburger.active .line:nth-child(1) span { /* 平移完成后旋转45度 */ transform: rotate(45deg); } .hamburger.active .line:nth-child(2) span { opacity: 0; } .hamburger.active .line:nth-child(3) { /* 平移到中间位置 */ transform: translateY(-10px); } .hamburger.active .line:nth-child(3) span { /* 平移完成后旋转-45度 */ transform: rotate(-45deg); }
JavaScript交互
const hamburger = document.querySelector('.hamburger'); hamburger.addEventListener('click', () => { hamburger.classList.toggle('active'); });
关键细节说明
- 拆分变换动作:用外层
.line处理平移,内层span处理旋转,两个元素的transition独立设置,避免单个transform属性的冲突。 - 延迟控制顺序:旋转的transition设置了
0.4s的延迟,正好等于平移的过渡时长,确保平移完全完成后才启动旋转。 - 居中旋转保障:内层
span的旋转默认以自身中心为轴,外层平移到按钮中间位置后,旋转自然形成对称的X形,解决了你提到的居中旋转问题。
内容的提问来源于stack exchange,提问作者TheDudeofDC
相关产品推荐
相关产品推荐

