让我们使用 HTML、CSS 和 Javascript 构建一个响应式导航栏和汉堡菜单。
那么让我们从 HTML 开始吧,
现在让我们添加 CSS 重置
现在让我们逐个为元素添加样式,
大家好!在本教程中,我们将使用 html、css 和少量 JavaScript 代码构建一个响应式导航栏和汉堡菜单。
它看起来是这样的,
Github链接:
那么让我们从 HTML 开始吧,
HTML
<header class="header">
<nav class="navbar">
<a href="#" class="nav-logo">WebDev.</a>
<ul class="nav-menu">
<li class="nav-item">
<a href="#" class="nav-link">Services</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">Blog</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">About</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">Contact</a>
</li>
</ul>
<div class="hamburger">
<span class="bar"></span>
<span class="bar"></span>
<span class="bar"></span>
</div>
</nav>
</header>
在这里,我们有
header
其类header
作为我们的导航栏的容器nav
与类navbar
- 与以下类别的链接
nav-logo
ul
与类nav-menu
- 里面
ul
有 4 个li
类nav-item
- 在每个里面,
nav-item
我们都有一个与类的链接nav-link
- 对于我们的汉堡包,我添加了一个
div
带有类的hamburger
,其中我们有 3span
个带有类的bar
这就是我们需要的 HTML。
现在让我们添加 CSS 重置
(这里我们将导入我们需要的字体并添加一些基本的 CSS 来重置所有默认样式。
CSS
@import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,500;1,400&display=swap');
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
font-size: 62.5%;
font-family: 'Roboto', sans-serif;
}
li {
list-style: none;
}
a {
text-decoration: none;
}
现在让我们逐个为元素添加样式,
header
和navbar
CSS
.header{
border-bottom: 1px solid #E2E8F0;
}
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
}
hamburger
样式
CSS
.hamburger {
display: none;
}
.bar {
display: block;
width: 25px;
height: 3px;
margin: 5px auto;
-webkit-transition: all 0.3s ease-in-out;
transition: all 0.3s ease-in-out;
background-color: #101010;
}
- 我们其他元素的基本样式 ``` CSS .nav-menu { display: flex; justify-content: space-between; align-items: center; }
.nav-item {
左边距:5rem;
}
.nav-link{
字体大小:1.6rem;
字体粗细:400;
颜色:#475569;
}
.nav-link:悬停{
颜色:#482ff7;
}
.nav-logo {
字体大小:2.1rem;
字体粗细:500;
颜色:#482ff7;
}
### After this, It should look like this,

# But It's not responsive yet, so let's add the media queries.
CSS
@media仅屏幕和(最大宽度:768px){
.nav-menu {
位置:固定;
左侧:-100%;
顶部:5rem;
弹性方向:列;
背景颜色:#fff;
宽度
:100%;边框半径:10px;
文本对齐:居中;
过渡:0.3s;
盒子阴影:
0 10px 27px rgba(0,0,0,0.05);
}
.nav-menu.active {
left: 0;
}
.nav-item {
margin: 2.5rem 0;
}
.hamburger {
display: block;
cursor: pointer;
}
}
What this media query does is, hides our `nav-menu` by setting `position: fixed;` `left: -100%;` on it.
Also, we set our `hamburger` to `display: block;` so it's visible now.
We have also added an extra class that is `.nav-menu.active` which sets `left: 0;` on the `nav-menu`. Now we will have to add the javascript which will add this `active` class on the nav-menu when we click our hamburger.
# Let's add the javascript.
Javascript
const hamburger = document.querySelector(".hamburger");
const navMenu = document.querySelector(".nav-menu");
hamburger.addEventListener(“点击”, mobileMenu);
函数 mobileMenu() {
hamburger.classList.toggle("active");
navMenu.classList.toggle("active");
}
Here the function `mobileMenu()` also adds an `active` class on our `hamburger` and our `nav-menu` which makes our mobile menu open. we can use the active class on the hamburger to create that X animation when we click on the `hamburger`. so let's do that now.
CSS
// 媒体查询内部。
.hamburger.active .bar:nth-child(2) {
opacity: 0;
}
.hamburger.active .bar:nth-child(1) {
transform: translateY(8px) rotate(45deg);
}
.hamburger.active .bar:nth-child(3) {
transform: translateY(-8px) rotate(-45deg);
}
### It should look like this now,

## But there is a catch, the hamburger menu doesn't close when we click a link. So let's add that now,
Javascript
const navLink = document.querySelectorAll(".nav-link");
navLink.forEach(n => n.addEventListener("点击", closeMenu));
函数 closeMenu() {
hamburger.classList.remove("active");
navMenu.classList.remove("active");
}
The `closeMenu()` function removes the `active` class from both the `nav-menu` and the `hamburger` which makes our mobile menu close.

So that's it guys we built a responsive navbar and hamburger menu with HTML CSS and javascript. Hope u liked it. Share this article. Thank you 😀