0

0

响应式导航栏与下拉菜单实现指南(含汉堡菜单)

DDD

DDD

发布时间:2025-11-18 11:55:21

|

829人浏览过

|

来源于php中文网

原创

响应式导航栏与下拉菜单实现指南(含汉堡菜单)

本教程详细介绍了如何构建一个具备响应式设计、下拉菜单以及在小屏幕上自动切换为汉堡菜单的导航栏。通过结合html结构、css媒体查询和javascript动画,我们将实现一个功能完善且用户友好的导航系统,确保在不同设备上都能提供流畅的浏览体验。

在现代Web开发中,响应式导航栏是不可或缺的一部分,它能确保网站在各种屏幕尺寸下都能提供一致且优化的用户体验。本教程将引导您从零开始,使用HTML、CSS和JavaScript构建一个包含下拉菜单并在小屏幕上自动转换为汉堡菜单的响应式导航栏。

1. HTML结构:构建导航骨架

首先,我们需要一个清晰的HTML结构来承载导航栏、Logo、主菜单和下拉菜单。为了实现汉堡菜单,我们将引入一个隐藏的复选框(checkbox)和对应的标签(label),利用它们的状态来控制移动端菜单的显示与隐藏。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>响应式导航栏示例</title>
  <link rel="stylesheet" href="style.css">
  <link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
  <script src="https://kit.fontawesome.com/afde9d8d8e.js" crossorigin="anonymous"></script>
</head>
<body class="prevent-select">
  <header class="header">
    <div class="container">
      <div class="navbar">
        <div class="logo">
          <a href="#">
            <img src="framelogo1.png" alt="Business Sample Logo">
          </a>
        </div>
        <nav>
          <!-- 汉堡菜单结构 -->
          <div class="hamburger-menu">
            <input id="menu__toggle" type="checkbox" />
            <label class="menu__btn" for="menu__toggle">
              <span></span>
            </label>
            <ul class="main_menu menu__box">
              <li><a href="index.html" class="menu__item" id="home">首页</a></li>
              <li><a href="gallery.html" class="menu__item" id="gallery">画廊</a></li>
              <li><a href="about.html" class="menu__item" id="about-us">关于我们</a></li>
              <li class="dropdown">
                <button class="dropbtn" onclick="toggleDropdown()">立即预订<i class="fa fa-sort-desc"></i></button>
                <div class="dropdown-content" id="myDropdown">
                  <a href="#music"><i class="fa-solid fa-music"></i>音乐视频</a>
                  <a href="#photo"><i class="fa-solid fa-camera"></i>摄影</a>
                  <a href="#webdev"><i class="fa-solid fa-globe"></i>网站开发</a>
                  <a href="#graphic"><i class="fa-solid fa-palette"></i>平面设计</a>
                  <a href="#commercial"><i class="fa-solid fa-clapperboard"></i>商业广告</a>
                  <a href="#marketing"><i class="fa-solid fa-chart-line"></i>营销内容</a>
                </div>
              </li>
            </ul>
          </div>
        </nav>
      </div>
    </div>
  </header>
  <script src="script.js"></script>
</body>
</html>

关键点说明:

AI Web Designer
AI Web Designer

AI网页设计师,快速生成个性化的网站设计

下载
  • <meta name="viewport" ...>:这是实现响应式设计的关键,它指示浏览器根据设备宽度调整页面缩放。
  • .navbar:使用Flexbox布局来排列Logo和导航菜单。
  • .hamburger-menu:包含了用于汉堡菜单的 input (隐藏的复选框) 和 label (汉堡图标本身)。
  • ul.main_menu.menu__box:主导航菜单,在移动端会作为侧边栏显示。
  • .dropdown:包含下拉按钮和下拉内容。

2. CSS样式:实现布局与响应式转换

CSS是实现导航栏外观和响应式行为的核心。我们将定义桌面端的样式,然后通过媒体查询 (@media) 在小屏幕上调整布局,显示汉堡菜单并隐藏常规导航。

/* 通用样式 */
.container {
  width: 1200px;
  margin: 0 auto;
  padding: 0 15px;
}

ul {
  list-style: none;
  padding: 0;
  margin: 0;
}

.header {
  padding: 20px 50px;
  background-color: rgba(255, 255, 255, 0.7);
  box-shadow: 0px -3px 21px rgba(0, 0, 0, 0.25);
  backdrop-filter: blur(5px);
  z-index: 1;
  width: 100%;
}

.navbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap; /* 允许元素换行 */
}

.logo img {
  width: 120px;
}

/* 桌面端主菜单样式 */
.header .main_menu {
  display: flex;
}

.header .main_menu li a {
  display: block;
  font-family: 'Josefin Sans', sans-serif;
  font-weight: 700;
  color: black;
  text-decoration: none;
  font-size: 18px;
  padding: 10px 25px;
  margin: 0px 3px;
  border-radius: 5px;
}

#home {
  background-color: #CD285B;
  color: #f1f1f1;
}

.main_menu li:hover > a {
  background-color: #FFD7E3;
}

/* 下拉菜单按钮样式 */
.dropbtn {
  display: flex;
  align-items: center;
  font-family: 'Josefin Sans', sans-serif;
  font-weight: 600;
  background-color: #CD285B;
  color: white;
  padding: 12px 20px;
  border-radius: 5px;
  font-size: 18px;
  border: none;
  cursor: pointer;
  height: 100%;
}

.dropdown {
  position: relative;
  display: inline-block;
}

.dropbtn .fa {
  padding-left: 10px;
  margin-left: 5px;
  font-size: 12px;
}

/* 下拉菜单内容样式 */
.dropdown-content {
  display: none;
  position: absolute;
  font-family: 'Josefin Sans', sans-serif;
  font-weight: 600;
  font-size: 18px;
  margin-top: 25px;
  right: -27%; /* 调整下拉菜单位置 */
  background-color: rgba(255, 255, 255, 0.7);
  border: 1px solid rgba(255, 255, 255, 0.7);
  box-shadow: 0px 182px 73px rgba(205, 40, 91, 0.01), 0px 103px 62px rgba(205, 40, 91, 0.05), 0px 46px 46px rgba(205, 40, 91, 0.09), 0px 11px 25px rgba(205, 40, 91, 0.1), 0px 0px 0px rgba(205, 40, 91, 0.1);
  border-radius: 10px;
  width: 235px;
  z-index: 1;
}

.dropdown-content a {
  display: flex;
  flex-direction: row;
  align-items: center;
  padding: 15px 20px;
  margin: 6px;
  color: #303030;
  font-size: 16px;
  text-decoration: none;
  border-radius: 10px; /* 添加圆角 */
}

.dropdown-content a:hover {
  background-color: #f1f1f1;
  border: 1px solid rgba(219, 0, 84, 0.588);
}

.dropdown:hover .dropbtn {
  background-color: #cd285cdc;
  transition: all .3s ease-in-out;
}

.dropdown-content .fa-solid {
  color: #303030;
  font-size: 16px;
  padding-right: 10px;
}

.show {
  display: block;
}

/* 汉堡菜单的隐藏复选框 */
#menu__toggle {
  opacity: 0; /* 隐藏复选框 */
  position: absolute; /* 防止占据空间 */
}

/* 媒体查询:在小屏幕上启用响应式布局 */
@media (max-width: 1320px) {
  .container {
    width: 100%; /* 小屏幕下宽度自适应 */
    padding: 0 20px;
  }

  .header {
    padding: 15px 20px;
    position: relative; /* 调整头部定位,避免与汉堡菜单冲突 */
  }

  .navbar {
    justify-content: space-between; /* Logo和汉堡菜单按钮左右对齐 */
  }

  /* 隐藏桌面端主菜单,显示汉堡菜单图标 */
  .header .main_menu {
    display: none; /* 默认隐藏主菜单 */
  }

  .hamburger-menu {
    display: block; /* 确保汉堡菜单容器可见 */
  }

  /* 汉堡菜单按钮样式 */
  .menu__btn {
    position: relative; /* 相对于父元素定位 */
    top: 0;
    left: 0;
    width: 26px;
    height: 26px;
    cursor: pointer;
    z-index: 2; /* 确保在最上层 */
    display: flex;
    align-items: center;
    padding-top: 10px;
  }

  .menu__btn > span,
  .menu__btn > span::before,
  .menu__btn > span::after {
    display: block;
    position: absolute;
    width: 100%;
    height: 2px;
    background-color: #616161;
    transition-duration: .25s;
  }

  .menu__btn > span::before {
    content: '';
    top: -8px;
  }

  .menu__btn > span::after {
    content: '';
    top: 8px;
  }

  /* 汉堡菜单动画:点击后变成X */
  #menu__toggle:checked + .menu__btn > span {
    transform: rotate(45deg);
  }
  #menu__toggle:checked + .menu__btn > span::before {
    top: 0;
    transform: rotate(0deg);
  }
  #menu__toggle:checked + .menu__btn > span::after {
    top: 0;
    transform: rotate(90deg);
  }

  /* 移动端菜单盒子样式 */
  .menu__box {
    display: block;
    position: fixed;
    top: 0;
    left: -100%; /* 默认隐藏在屏幕左侧 */
    width: 300px;
    height: 100%;
    margin: 0;
    padding: 80px 0;
    list-style: none;
    background-color: #ECEFF1;
    box-shadow: 2px 2px 6px rgba(0, 0, 0, .4);
    transition-duration: .25s;
    z-index: 1;
    overflow-y: auto; /* 允许菜单内容滚动 */
  }

  /* 移动端菜单项样式 */
  .menu__item {
    display: block;
    padding: 12px 24px;
    color: #333;
    font-family: 'Roboto', sans-serif;
    font-size: 20px;
    font-weight: 600;
    text-decoration: none;
    transition-duration: .25s;
  }

  .menu__item:hover {
    background-color: #CFD8DC;
  }

  /* 菜单打开时移入视图 */
  #menu__toggle:checked ~ .menu__box {
    left: 0 !important;
  }

  /* 调整移动端下拉菜单的样式,使其在侧边栏中表现良好 */
  .menu__box .dropdown {
    display: block; /* 确保在侧边栏中独立一行 */
    width: 100%;
    padding: 0 24px; /* 与其他菜单项对齐 */
    box-sizing: border-box;
  }

  .menu__box .dropbtn {
    width: 100%;
    justify-content: space-between; /* 按钮内容左右对齐 */
    margin-top: 10px;
  }

  .menu__box .dropdown-content {
    position: static; /* 在侧边栏中取消绝对定位 */
    width: 100%;
    margin-top: 10px;
    right: auto;
    left: 0;
    box-shadow: none; /* 移除阴影 */
    border: none; /* 移除边框 */
    background-color: #f8f8f8; /* 调整背景色 */
  }

  .menu__box .dropdown-content a {
    padding-left: 30px; /* 增加缩进 */
  }
}

关键点说明:

  • 桌面样式: 默认情况下,.header .main_menu 使用 display: flex 水平排列菜单项。
  • 汉堡菜单隐藏: #menu__toggle 复选框被设置为 opacity: 0 隐藏,但其功能依然存在。
  • 媒体查询 (@media (max-width: 1320px)): 当屏幕宽度小于等于1320px时,以下样式生效:
    • .header .main_menu 被 display: none 隐藏。
    • .menu__btn (汉堡图标) 显示。
    • .menu__box (移动端菜单) 默认 left: -100% 隐藏在屏幕外。
    • 当 #menu__toggle:checked 时,.menu__btn 的 span 元素会旋转,形成“X”图标,同时 .menu__box 的 left 属性变为 0,使其滑入视图。
  • 下拉菜单在移动端的调整: 移动端菜单内的下拉菜单样式需要特别调整,例如将 position: absolute 改为 position: static,使其在垂直堆叠的菜单中表现正常。

3. JavaScript:实现下拉菜单的动态效果

JavaScript主要用于控制下拉菜单的显示/隐藏动画(淡入淡出效果)以及点击页面其他区域时自动关闭下拉菜单的功能。请注意,汉堡菜单本身的切换逻辑完全由CSS控制,无需JavaScript。

var dropdownContent = document.getElementById("myDropdown");
var isOpen = false; // 跟踪下拉菜单的开闭状态

// 切换下拉菜单显示/隐藏
function toggleDropdown() {
  if (!isOpen) {
    fadeIn(dropdownContent);
  } else {
    fadeOut(dropdownContent);
  }
}

// 元素淡入效果
function fadeIn(element) {
  var opacity = 0;
  element.style.display = "block"; // 先显示元素
  var fadeInInterval = setInterval(function() {
    if (opacity < 1) {
      opacity += 0.1; // 逐步增加透明度
      element.style.opacity = opacity;
    } else {
      clearInterval(fadeInInterval); // 达到完全不透明后停止
    }
  }, 30); // 每30毫秒执行一次
  isOpen = true;
}

// 元素淡出效果
function fadeOut(element) {
  var opacity = 1;
  var fadeOutInterval = setInterval(function() {
    if (opacity > 0) {
      opacity -= 0.1; // 逐步降低透明度
      element.style.opacity = opacity;
    } else {
      clearInterval(fadeOutInterval); // 达到完全透明后停止
      element.style.display = "none"; // 完全透明后隐藏元素
    }
  }, 30);
  isOpen = false;
}

// 点击页面其他区域时关闭下拉菜单
window.onclick = function(event) {
  // 如果点击的不是下拉按钮,则关闭下拉菜单
  if (!event.target.matches('.dropbtn')) {
    if (isOpen) { // 只有在下拉菜单打开时才执行淡出
      fadeOut(dropdownContent);
    }
  }
}

// 确保在移动端点击汉堡菜单时,下拉菜单不会意外关闭
// 这需要额外处理,因为 window.onclick 会捕获所有点击
document.getElementById('menu__toggle').addEventListener('click', function(event) {
    event.stopPropagation(); // 阻止事件冒泡,避免触发 window.onclick
});

document.querySelector('.menu__box').addEventListener('click', function(event) {
    event.stopPropagation(); // 阻止事件冒泡,避免点击菜单项时关闭下拉菜单
});

关键点说明:

  • toggleDropdown(): 根据 isOpen 状态调用 fadeIn 或 fadeOut 函数。
  • fadeIn() / fadeOut(): 使用 setInterval 逐步改变元素的 opacity 属性,实现平滑的淡入淡出效果。当完全淡出后,将 display 设置为 none 以彻底隐藏元素并释放空间。
  • window.onclick: 监听全局点击事件,如果点击的不是 .dropbtn 元素,则关闭下拉菜单。
  • 事件冒泡阻止: 为了避免在移动端点击汉堡菜单或其内部元素时意外触发 window.onclick 导致下拉菜单关闭,我们为汉堡菜单的复选框和菜单盒子添加了 stopPropagation()。

4. 注意事项与最佳实践

  • 语义化HTML: 使用 <header>, <nav>, <ul>, <li> 等标签来构建导航,增强可访问性和SEO。
  • 可访问性 (Accessibility):
    • 为图片添加 alt 属性。
    • 确保键盘用户可以通过 Tab 键导航并使用 Enter 键激活菜单项。对于下拉菜单,可能需要额外的JavaScript来处理键盘事件。
    • 使用 aria 属性可以进一步提升可访问性。
  • 性能优化:
    • CSS过渡 (transition) 通常比JavaScript动画更流畅高效,尤其是在处理简单的显示/隐藏或位置变化时。本例中汉堡菜单的动画就采用了CSS过渡。
    • 避免在JavaScript中频繁操作DOM,如果可以,尽量使用CSS。
  • 移动优先 (Mobile-First): 在设计响应式布局时,从最小屏幕开始设计,然后逐步向上扩展到桌面端,这样可以更好地控制样式和性能。
  • 字体图标: 使用 Font Awesome 等字体图标库可以方便地引入各种图标,且具有良好的可伸缩性。
  • 测试: 在不同设备和浏览器上进行测试,确保导航栏在各种场景下都能正常工作。特别注意在移动设备上测试触摸事件和滚动行为。

总结

通过本教程,您应该已经掌握了如何使用HTML、CSS(特别是媒体查询)和JavaScript来构建一个功能完善的响应式导航栏。这种方法不仅能提供良好的用户体验,还能确保您的网站在任何设备上都具有专业的外观和交互。理解并实践这些技术,将为您的前端开发技能打下坚实的基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

447

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

4347

2024.08.14

CSS position定位有几种方式
CSS position定位有几种方式

有4种,分别是静态定位、相对定位、绝对定位和固定定位。更多关于CSS position定位有几种方式的内容,可以访问下面的文章。

83

2023.11.23

css3transition
css3transition

css3transition属性用于指定如何从一个CSS样式过渡到另一个CSS样式,本专题为大家提供transition相关的文章、相关下载和相关课程,大家可以免费体验。

261

2023.06.27

flex教程
flex教程

php中文网为大家带来了flex教程合集,Flex是采用Flex布局的元素,称为Flex容器(flex container),简称"容器",它的所有子元素自动成为容器成员,有三个核心概念: flex项,需要布局的元素;flex容器,其包含flex项;排列方向,这决定了flex项的布局方向。php中文网还为大家带来flex的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

371

2023.06.14

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

197

2023.11.24

li是什么元素
li是什么元素

li是HTML标记语言中的一个元素,用于创建列表。li代表列表项,它是ul或ol的子元素,li标签的作用是定义列表中的每个项目。本专题为大家li元素相关的各种文章、以及下载和课程。

437

2023.08.03

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 42.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号