暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

前端实战教程!让我们用HTML,CSS 和 JS 构建一个响应式导航栏和汉堡菜单

前端新世界 2022-02-16
979
喜欢就关注我们吧


本文翻译自:
https://dev.to/devggaurav/let-s-build-a-responsive-navbar-and-hamburger-menu-using-html-css-and-javascript-4gci

大家好!今天我们要介绍的是如何使用HTML,CSS和JavaScript来构建响应式导航栏和汉堡菜单。

就像这样:

好的,那就先从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
    的CSS类的,可以作为导航菜单的容器。
  • nav
    标签指定名为navbar
    的CSS类。
  • 具有nav-logo
    类的链接
  • 具有nav-menu
    类的ul
  • ul
    内部,我们有4个具有nav-item
    类的li
  • 在每个nav-item
    中,都有一个包含nav-link
    类的链接
  • 至于汉堡菜单,我已在代码中添加了一个具有hamburger
    类的div
    ,且此div
    中有3个带bar
    类的span

以上就是我们需要的HTML代码。

现在让我们添加CSS样式重置代码

(此处,我们将导入所需的字体,并添加一些基本的CSS来重置所有的默认样式。)

@import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,500;1,400&display=swap');

* {
    margin0;
    padding0;
    box-sizing: border-box;
}

html {
    font-size62.5%;
    font-family'Roboto', sans-serif;
}

li {
    list-style: none;
}

a {
    text-decoration: none;
}

现在让我们给每个元素逐个添加样式:

header
navbar

.header{
    border-bottom1px solid #E2E8F0;
}

.navbar {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding1rem 1.5rem;
}

hamburger
样式:

.hamburger {
    display: none;
}

.bar {
    display: block;
    width25px;
    height3px;
    margin5px auto;
    -webkit-transition: all 0.3s ease-in-out;
    transition: all 0.3s ease-in-out;
    background-color#101010;
}

其他元素的基本样式:

.nav-menu {
    display: flex;
    justify-content: space-between;
    align-items: center;
}

.nav-item {
    margin-left5rem;
}

.nav-link{
    font-size1.6rem;
    font-weight400;
    color#475569;
}

.nav-link:hover{
    color#482ff7;
}

.nav-logo {
    font-size2.1rem;
    font-weight500;
    color#482ff7;
}

完成这些之后,看起来应该是这样的:

但是它不是响应式的,所以我们还需要添加媒体查询css代码。

@media only screen and (max-width: 768px) {
    .nav-menu {
        position: fixed;
        left: -100%;
        top5rem;
        flex-direction: column;
        background-color#fff;
        width100%;
        border-radius10px;
        text-align: center;
        transition0.3s;
        box-shadow:
            0 10px 27px rgba(0000.05);
    }

    .nav-menu.active {
        left0;
    }

    .nav-item {
        margin2.5rem 0;
    }

    .hamburger {
        display: block;
        cursor: pointer;
    }

}

这里媒体查询就是通过设置position: fixed; left: -100%;
来隐藏nav-menu

此外,我们将hamburger
设置为display: block;
,所以现在可见。

我们还添加了一个额外的类.nav-menu.active
,它在nav-menu
上设置left: 0;
。现在,到了添加javascript的时候了,以便在我们单击汉堡菜单时,会在nav-menu
上添加此active
类。

添加JavaScript

const hamburger = document.querySelector(".hamburger");
const navMenu = document.querySelector(".nav-menu");

hamburger.addEventListener("click", mobileMenu);

function mobileMenu({
    hamburger.classList.toggle("active");
    navMenu.classList.toggle("active");
}

此处的函数mobileMenu()
在hamburger和nav-menu
上也添加了一个active
类,从而打开mobile menu。单击hamburger时,我们可以使用hamburger上的active类来创建X动画。现在就开始做吧。

// Inside the Media Query.

    .hamburger.active .bar:nth-child(2) {
        opacity0;
    }

    .hamburger.active .bar:nth-child(1) {
        transformtranslateY(8pxrotate(45deg);
    }

    .hamburger.active .bar:nth-child(3) {
        transformtranslateY(-8pxrotate(-45deg);
    }

现在看起来应该是这样的:

但是有一个问题,当我们单击链接时,汉堡菜单不会关闭。现在让我们解决一下这个问题。

const navLink = document.querySelectorAll(".nav-link");

navLink.forEach(n => n.addEventListener("click", closeMenu));

function closeMenu({
    hamburger.classList.remove("active");
    navMenu.classList.remove("active");
}

closeMenu()
函数从nav-menu
hamburger
中删除active
类,从而关闭mobile menu。

就是这样,我们实现了用HTML,CSS和javascript构建一个响应式的导航栏和汉堡菜单。希望你喜欢并分享这篇文章。感谢大家的阅读。

(文本完)

每日分享前端插件干货,欢迎关注!

点赞和在看就是最大的支持❤️

文章转载自前端新世界,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论