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

鼠标悬停垂直导航栏时如何调整页面内容位置避免被遮挡

解决方案

有两种常用实现方式,优先推荐无JS的Flex布局方案,适配性更强:

方案1:Flex自动适配(推荐)

直接给body开启Flex横向布局,利用Flex自动分配剩余宽度的特性,不需要手动计算收缩值,导航栏伸缩时内容区会自动同步调整宽度:

/* 基础布局重置 */
body {
  margin: 0;
  padding: 0;
  display: flex; /* 横向排列导航和内容 */
  min-height: 100vh; /* 撑满视口高度 */
}
/* 导航栏样式 */
navbar {
  flex-shrink: 0; /* 禁止导航被压缩 */
  width: 5rem; /* 默认收起宽度 */
  transition: width 0.3s ease; /* 过渡动画和你原有动画保持一致即可 */
  /* 删掉你之前加的position: fixed相关代码 */
}
/* 导航栏悬停/聚焦展开 */
navbar:hover,
navbar:focus {
  width: 16rem;
}
/* 内容区样式 */
#content {
  flex-grow: 1; /* 占满导航外的所有剩余宽度 */
  overflow-x: auto; /* 内容过宽时自动出现横向滚动条,避免布局错乱 */
  transition: all 0.3s ease; /* 同步过渡动画 */
}

方案2:兼容Fixed定位的调整方案

如果你的导航栏必须保留position: fixed定位(比如需要滚动时固定在左侧),可以用兄弟选择器同步修改内容区的左边距:

body {
  margin: 0;
  padding: 0;
}
navbar {
  position: fixed;
  left: 0;
  top: 0;
  height: 100vh;
  width: 5rem;
  transition: width 0.3s ease;
  z-index: 100;
}
navbar:hover,
navbar:focus {
  width: 16rem;
}
#content {
  /* 默认边距匹配导航收起宽度 */
  margin-left: 5rem;
  transition: margin-left 0.3s ease;
}
/* 导航展开时同步修改内容区左边距 */
navbar:hover + #content,
navbar:focus + #content {
  margin-left: 16rem;
}

扩展说明

如果你的导航栏展开触发逻辑是点击切换(不是悬停),可以加简单JS控制类名即可:

const nav = document.querySelector('navbar')
// 点击切换展开状态
nav.addEventListener('click', () => {
  nav.classList.toggle('nav-active')
})

对应CSS里把:hover/:focus的选择器换成.nav-active即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 15:15:06