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>
通过这些代码,我们实现了:
以上就是我们需要的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画出来。
菜单栏通常有2级结构,第一级菜单是分类,第二级菜单是页面。一般位于页面左侧,并且是每个页面都有它。
1、先画首页文字。从默认元件库中拖动“矩形1”到工作区合适位置,修改尺寸为(160,40),双击输入文字表示首页,字号修改为16px,左侧对齐然后左侧边距修改为40px。
2、再画首页图标。从默认元件库中拖动“图片”到矩形中合适位置,尺寸修改为(20,20),样式点击“调整颜色”图标,勾选调整颜色,饱和度拖动到最左边变成0。
3、再画首页文字的选中样式。右键点击交互样式,切换到选中状态,然后勾选字色然后输入蓝色#0000FF,点击“确定”按钮。
4、再画首页图标的选中样式。右键点击交互样式,切换到选中状态,然后勾选图像滤波,点击“确定”按钮。
5、再画一级分类。方法同上述4步。
6、再画二级页面。方法步骤同1和3,除了字号保持默认。根据需要复制多份二级页面。
7、复制多份一级分类和二级页面。
8、在左侧页面区域,添加文件夹来作为一级分类,添加页面来作为二级页面。然后右键分类名称-重复-分支来快速复制。
9、同时选择所有的菜单栏元件和顶部导航组件,然后右键点击“转换为母版”,然后命名为“菜单栏”。
10、在左侧母版区域,右键母版“菜单栏”,点击“添加到页面中…”然后点击“全选”,勾选“置于底层”,最后点击确定。
11、生成原型HTML并查看原型效果。
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; }
然后就能实现我们这个实用又美观的侧边导航栏啦
*请认真填写需求信息,我们会在24小时内与您取得联系。