
当页面滚动后,绝对定位的下拉菜单错位,是因为它未被限制在最近的相对定位祖先内;只需为菜单的直接父元素(.row)添加 position: relative 即可确保菜单始终相对于该父容器定位。
当页面滚动后,绝对定位的下拉菜单错位,是因为它未被限制在最近的相对定位祖先内;只需为菜单的直接父元素(`.row`)添加 `position: relative` 即可确保菜单始终相对于该父容器定位。
在 CSS 定位体系中, 在你的结构中, ✅ 正确做法:为 此时, ⚠️ 注意事项: 总结:CSS 定位依赖明确的“定位上下文链”。绝对定位不是“固定在屏幕”,而是“相对于某个祖先”。修复错位问题,本质是显式声明该祖先的定位角色——一行 position: absolute 的元素会相对于最近的、非 static 定位的祖先元素进行定位。若所有祖先均为默认的 position: static(即未显式设置定位),则该元素将相对于 或初始包含块(viewport)定位——这正是滚动后菜单“回到原位”的根本原因。.menu 是 .row 的子元素,但 .row 缺少 position: relative 声明,导致 .menu 实际参照的是 或 .layout(若其有定位属性)而非视觉上紧邻的 .row。一旦页面滚动,top/left 等偏移值仍基于初始视口坐标计算,菜单便脱离预期位置。.row 添加 position: relative,使其成为 .menu 的定位上下文(containing block):.row {
height: 50px;
width: 100%;
border: solid 1px #a5a5a5;
cursor: pointer;
color: red;
position: relative; /* ? 关键修复:创建新的定位上下文 */
}
.menu 的 position: absolute 将严格以 .row 的内容边界为基准定位。配合你已有的居中逻辑(left: 0; right: 0; margin: 0 auto;),菜单将始终水平居中于 .row 内部,且不受页面滚动影响。
.menu 设置 top 或 bottom(除非需精确垂直偏移),否则可能因 .row 高度固定而遮挡内容;.row 内容动态变化或存在 padding/margin,建议用 top: 100% 实现菜单紧贴父元素底部弹出(常见于下拉菜单);classList.toggle() 更简洁,推荐替换原 if/else:document.getElementById("r3").addEventListener('click', function() {
document.getElementById("menu").classList.toggle("show");
});
position: relative,即可让菜单真正“粘住”其父容器,滚动无忧。











