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

如何无需CSS框架编写一套同时适配移动端与桌面端的HTML导航栏

实现方案(单HTML结构适配双端导航)

核心思路是复用同一组导航链接节点,通过媒体查询和状态类切换不同设备下的样式,完全不需要CSS框架,原生代码即可实现。

第一步:重构HTML结构,删除重复导航项

只保留一组导航链接,把汉堡触发按钮、关闭按钮都整合到同一个nav容器内,避免重复定义导航项:

<nav class="navbar">
  <div class="logo-position">
    <a href="#" class="logo">LOGO</a>
  </div>
  <!-- 汉堡按钮 移动端显示 -->
  <div class="navbar-toggle" onclick="openNav()">
    <div class="bar1"></div>
    <div class="bar2"></div>
    <div class="bar3"></div>
  </div>
  <!-- 唯一一组导航链接 双端复用 -->
  <ul id="sidenav" class="main-nav">
    <!-- 关闭按钮 移动端显示 -->
    <li class="close-wrapper">
      <a href="javascript:void(0)" class="closebutton" onclick="closeNav()">&times;</a>
    </li>
    <li><a href="#" class="nav-links">Home</a></li>
    <li><a href="#" class="nav-links">About</a></li>
    <li><a href="#" class="nav-links">Portfolio</a></li>
    <li><a href="#" class="nav-links">Contact</a></li>
  </ul>
</nav>

第二步:调整CSS样式,通过媒体查询区分双端表现

.navbar {
  background-color: white;
  padding-bottom: 10px;
  width: 100%;
  position: relative;
}
/* 移动端默认样式:侧边抽屉 */
.main-nav {
  height: 100%;
  width: 0;
  position: fixed;
  z-index: 2;
  top: 0;
  right: 0;
  background-color: white;
  overflow-x: hidden;
  padding-top: 80px;
  margin: 0;
  padding-left: 0;
  list-style: none;
  transition: width 0.3s ease; /* 平滑展开收起动画 */
}
.main-nav li a {
  display: block;
  padding: 8px 24px;
}
.close-wrapper {
  position: absolute;
  top: 0;
  right: 5px;
}
.closebutton {
  font-size: 56px;
  padding: 0 !important;
}
.navbar-toggle {
  position: absolute;
  top: 8px;
  right: 20px;
  font-size: 19px;
  cursor: pointer;
}
.bar1,.bar2,.bar3 {
  width: 25px;
  height: 2px;
  background-color: black;
  margin: 6px 0;
}
/* 桌面端样式:768px以上生效 */
@media (min-width: 768px) {
  .main-nav {
    width: auto !important; /* 覆盖JS动态设置的width属性 */
    position: static;
    height: auto;
    padding-top: 0;
    overflow: visible;
    display: flex;
    margin-right: 30px;
    flex-direction: row;
    justify-content: flex-end;
  }
  .close-wrapper, .navbar-toggle {
    display: none;
  }
  .navbar {
    display: flex;
    justify-content: space-between;
    align-items: center;
  }
}

第三步:复用原有JS逻辑

原有JS代码不需要修改,直接沿用即可:

function openNav() {
  document.getElementById("sidenav").style.width = "250px";
}
function closeNav() {
  document.getElementById("sidenav").style.width = "0";
}

补充说明

  • 代码完全复用了同一组导航链接,后续修改导航项只需要改一处即可,不会出现双端内容不一致的问题
  • 没有依赖任何CSS框架,全部是原生CSS和JS实现,兼容性覆盖绝大多数主流浏览器
  • 可以根据自己的需求调整媒体查询的断点(当前为768px)、侧边栏宽度、动画效果等参数
  • 如果不想使用JS实现,也可以通过隐藏的checkbox+兄弟选择器的纯CSS方案实现菜单的展开收起,不需要任何JS代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:45:05