You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CSS动画汉堡菜单无法形成正确X形的解决方法咨询

解决汉堡菜单transform-origin导致无法形成正确X形的问题

嘿,这个问题我之前做汉堡菜单的时候也踩过坑!你现在的核心问题就是transform-origin的设置没适配顶部和底部线条的旋转需求,导致两条旋转后的线条没法在中心交叉,出不来规整的X效果。咱们一步步来修正:

问题原因分析

你给所有span统一设置了transform-origin: 0 50%;(也就是每个线条的左中点),这对顶部线条(第一个span)顺时针转45度是合适的,但底部线条(第三个span)绕左中点逆时针转-45度时,它的右端会向下偏移,两条线的交点不在汉堡的中心,自然就不是正确的X形了。

解决方案

我们需要给顶部和底部线条分别设置对应的旋转原点:

  • 顶部线条保持绕左中点旋转,顺时针转45度后右端会上移;
  • 底部线条改为绕右中点旋转,逆时针转45度后左端会上移;
  • 两者的交点就会落在汉堡的中心,完美形成标准X形。

另外,把中间线条的隐藏效果改成opacity: 0 + width: 0的组合,过渡会更顺滑自然。

修正后的完整代码

HTML(无需改动)

<div class="hamburger" onclick="handleNav()">
  <span></span>
  <span></span>
  <span></span>
</div>

CSS(关键修改transform-origin)

.hamburger {
  width: 25px;
  cursor: pointer;
  /* 可选:添加相对定位,确保旋转原点相对容器稳定 */
  position: relative;
}
span {
  display: block;
  width: 100%;
  height: 2px;
  background-color: black;
  margin-bottom: 4px;
  transition: all 0.3s ease; /* 用ease让动画更流畅自然 */
}
span:last-child {
  margin-bottom: 0;
}
.is-active span:first-child {
  transform-origin: 0 50%; /* 顶部线条绕左中点旋转 */
  transform: rotate(45deg);
}
.is-active span:nth-child(2) {
  opacity: 0; /* 先透明再缩窄,过渡更柔和 */
  width: 0;
}
.is-active span:last-child {
  transform-origin: 100% 50%; /* 底部线条绕右中点旋转 */
  transform: rotate(-45deg);
}

JavaScript(无需改动)

let active = false;
const handleNav = () => {
  const hamburger = document.querySelector(".hamburger");
  if (!active) {
    hamburger.classList.add("is-active");
  } else {
    hamburger.classList.remove("is-active");
  }
  active = !active;
}

额外小优化

如果想让X形的交叉点更精准,可以给.hamburger添加padding: 4px 0,让线条的上下空间更均匀,视觉效果会更舒服。

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:22:50