整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

用HTML、CSS 和 JS 构建一个响应式导航栏菜单-教程

5自适应是现在主流的技术,导航栏菜单是最常见的一种,今天我们一起来学习一下它是如何使用HTML,CSS和JavaScript来构建响应式导航栏和汉堡菜单的。

这就是它的样子,是不是很熟悉呢?

H5导航菜单

好的,那就先从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’);

* {
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:

.header{
border-bottom: 1px solid #E2E8F0;
}

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


hamburger样式:

.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;
}


其他元素的基本样式:

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

.nav-item {
margin-left: 5rem;
}

.nav-link{
font-size: 1.6rem;
font-weight: 400;
color: #475569;
}

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

.nav-logo {
font-size: 2.1rem;
font-weight: 500;
color: #482ff7;
}

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

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

@media only screen and (max-width: 768px) {
.nav-menu {
position: fixed;
left: -100%;
top: 5rem;
flex-direction: column;
background-color: #fff;
width: 100%;
border-radius: 10px;
text-align: center;
transition: 0.3s;
box-shadow:
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;
}

}


这里媒体查询就是通过设置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) {
opacity: 0;
}

.hamburger.active .bar:nth-child(1) {
transform: translateY(8px) rotate(45deg);
}

.hamburger.active .bar:nth-child(3) {
transform: translateY(-8px) rotate(-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。

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

更多干货等着你~ 点赞、分享,关注哦

辑导语:Web后台的菜单栏通常用来展示产品的整体功能导航,是最常用的Web组件之一,PM一定要了解并学会它的原型画法。本文仔细介绍了用Axure画出Web后台产品的菜单栏组件的步骤与注意要点,希望对你有所启发。

我们先来看下Web菜单栏的原型交互效果,详见下图或者访问原型https://kgnha1.axshare.com

由于菜单栏比较常用并且画起来比较麻烦,建议产品经理根据本文的原型步骤制作一份菜单栏rp源文件,方便后续多个项目使用。

仔细查看上图原型,会发现包含以下这些交互用例,接下来作者会详细讲解每一步如何通过Axure RP 9画出来。

  1. 默认展开左侧菜单的二级页面
  2. 处于某一页面的时候,对应菜单项都会处于选中状态并呈现不同的样式。
  3. 点击一级分类即可收起对应的二级页面,再次点击即可展开。
  4. 默认进入首页,同时首页对应的菜单处于选中状态。此时所有菜单处于展开状态。

菜单栏通常有2级结构,第一级菜单是分类,第二级菜单是页面。一般位于页面左侧,并且是每个页面都有它。

01 画出无交互原型

1、先画首页文字。从默认元件库中拖动“矩形1”到工作区合适位置,修改尺寸为(160,40),双击输入文字表示首页,字号修改为16px,左侧对齐然后左侧边距修改为40px。

2、再画首页图标。从默认元件库中拖动“图片”到矩形中合适位置,尺寸修改为(20,20),样式点击“调整颜色”图标,勾选调整颜色,饱和度拖动到最左边变成0。

3、再画首页文字的选中样式。右键点击交互样式,切换到选中状态,然后勾选字色然后输入蓝色#0000FF,点击“确定”按钮。

4、再画首页图标的选中样式。右键点击交互样式,切换到选中状态,然后勾选图像滤波,点击“确定”按钮。

5、再画一级分类。方法同上述4步。

6、再画二级页面。方法步骤同1和3,除了字号保持默认。根据需要复制多份二级页面。

7、复制多份一级分类和二级页面。

8、在左侧页面区域,添加文件夹来作为一级分类,添加页面来作为二级页面。然后右键分类名称-重复-分支来快速复制。

9、同时选择所有的菜单栏元件和顶部导航组件,然后右键点击“转换为母版”,然后命名为“菜单栏”。

10、在左侧母版区域,右键母版“菜单栏”,点击“添加到页面中…”然后点击“全选”,勾选“置于底层”,最后点击确定。

11、生成原型HTML并查看原型效果。

02 画出有交互原型

12、先画进入首页的交互。双击母版“菜单栏”进入,选择首页,右侧边栏切换到“交互”,点击“新建交互”按钮,选择触发事件“单击时”,添加动作“打开链接”,链接到“首页”,点击“确定”按钮。(需要提前选择首页文字&首页图标并右键设为组合并命名为首页)

13、再画每个页面的交互。右侧边栏切换到“交互”,点击“新建交互”按钮,选择触发事件“单击时”,添加动作“打开链接”,链接到“对应的页面”,点击“确定”按钮。

14、再画一级分类的交互。同时选择分类名称&分类图标并右键设为组合并命名为一级分类;同时选择多个页面名称并右键设为组合并命名为二级页面。

然后点击组合“一级分类”,右侧边栏切换到“交互”,点击“新建交互”按钮,选择触发事件“单击时”,添加动作“显示/隐藏”,目标选择组合“二级页面”,操作选择“切换”,点击更多选项然后设置“展开收起”,点击“确定”按钮。(同理设置其他一级分类的交互。注意组合需要单独命名,方便选择目标)

15、设置首页载入的交互。进入页面“首页”,点击空白区域,右侧边栏切换到“交互”,点击“新建交互”按钮,选择触发事件“页面载入时”,添加动作“设置选中”,目标选择组合“首页”,点击“完成”按钮。

16、设置页面载入的交互。进入页面“页面名称”,点击空白区域,右侧边栏切换到“交互”,点击“新建交互”按钮,选择触发事件“页面载入时”,添加动作“设置选中”,目标选择“页面名称”,点击“完成”按钮(注意需要提前命名页面名称来方便选择目标)

17、生成原型HTML并查看原型效果。

总结

如果页面特别多,可以采用三级菜单栏,即第一级菜单是分类,第二级菜单是分类,第三级菜单是页面。

另外Axure左侧页面结构中也需要以相应的分类名称页面名称进行使用,方便开发和测试理解。

#相关阅读#

Axure教程:制作APP折叠面板

APP下导航如何用Axure画出来

#专栏作家#

浪子,个人微信langzipm,公众号:浪子画原型(langzisay)。专注于Axure原型设计和产品规范。

本文由 @浪子 原创发布于人人都是产品经理。未经许可,禁止转载。

题图来自Unsplash,基于CC0协议。

果图

html部分:先写用div画好六个导航的卡片,再利用css添加响应效果

<div class='card-holder'>
    <div class='card-wrapper'>
        <a href='#'>
            <div class='card bg-01'>
                <span class='card-content'>item #1</span>
            </div>
        </a>
    </div>
    <div class='card-wrapper'>
        <a href='#'>
            <div class='card bg-02'>
                <span class='card-content'>long menu item #2</span>
            </div>
        </a>
    </div>
    <div class='card-wrapper'>
        <a href='#'>
            <div class='card bg-03'>
                <span class='card-content'>menu item #3</span>
            </div>
        </a>
    </div>
    <div class='card-wrapper'>
        <a href='#'>
            <div class='card bg-04'>
                <span class='card-content'>item #4</span>
            </div>
        </a>
    </div>
    <div class='card-wrapper'>
        <a href='#'>
            <div class='card bg-05'>
                <span class='card-content'>menu item #5</span>
            </div>
        </a>
    </div>
    <div class='card-wrapper'>
        <a href='#'>
            <div class='card bg-06'>
                <span class='card-content'>long menu item #1</span>
            </div>
        </a>
    </div>
</div>

css部分:通过hover选择器和transition属性实现导航响应式操作,即可实现如图效果

a:link,
a:hover,
a:visited,
a:active {
  color: #fff;
  text-decoration: none;
}
body {
  height: 100%;
  width: 100%;
  margin: 0;
  padding: 0;
  background: #fff;
}
.card-holder {  
  position: fixed;
  width: 0px;
  overflow: visible;
}
.card-wrapper {
  display: inline-block;
  float: right;
  clear: both;
}
.card {
  position: relative;
  left: 32px;
  padding: 16px 32px 16px 64px;
  margin: 8px;  
  background: #fff;
  transition: all 0.3s ease-in-out 0.1s;
}
//添加导航的响应式效果
.card:hover {
  position: relative;
  left: 100%;
  margin-left: -32px;
  transition: all 0.3s ease-in-out;
}
.card-content {
  display: inline-block;
  color: #fff;
  font-family: 'Droid Sans', sans-serif;
  font-size: 16px;
  font-weight: bold;
  white-space: nowrap;
}
.bg-01 { background: #539770; }
.bg-02 { background: #4B7D74; }
.bg-03 { background: #8DC2BC; }
.bg-04 { background: #EDD6B4; }
.bg-05 { background: #BE7467; }
.bg-06 { background: #E2AE63; }

然后就能实现我们这个实用又美观的侧边导航栏啦