在该笔记中将学到一些常用的网页导航菜单的制作方法与展示效果
导航菜单的制作
导航菜单的特点
门户类网站的导航特点:导航在上方平铺展示(因为不需要展开)
商城类网站的导航特点:竖向列表,横向伸缩
垂直菜单的制作
用无序列表构建垂直菜单
因为在点击菜单的时候,要实现跳转功能,所以在 li 里面包裹 a 标签来实现跳转。同时,li 是块级元素,可以设置 width,height 属性,但是 a 不是块级元素无法设置这些属性,我们可以使用 display:block 将 a 设置为块元素,从而将 li 里面的属性都放在 a 之中,不会影响显示效果。
使用了 a:hover 设置了鼠标进入的样式:
<html>
<head>
<title>导航菜单制作</title>
<meta charset="utf-8">
<style type="text/css">
*{
margin:0;
padding:0;
}
ul {
list-style:none;
width:none;
font-size:14px;
}
a{
text-decoration:none;
display:block;
height:30px;
line-height:30px;
background-color:#ccc;
width:100px;
margin-top:1px;
text-indent:10px;
}
a:hover{
background-color:#f60;
color:#fff;
}
</style>
</head>
<body>
<ul>
<li><a href="">首 页</a></li>
<li><a href="">新闻快讯</a></li>
<li><a href="">
产品展示</a></li>
<li><a href="">售后服务</a></li>
<li><a href="">联系我们</a></li>
</ul>
</body>
</html>
显示效果如下:
水平菜单的设置
水平菜单的结构和垂直菜单一模一样,只需要在 CSS 样式中添加 float:left 就可以将菜单变成水平。
可以在 li 的父元素设置 overflow:hidden 来清除浮动,也可以在 a 中设置 text-align:center 将文字居中,以获得更好的显示效果。
<html>
<head>
<title>导航菜单制作</title>
<meta charset="utf-8">
<style type="text/css">
*{
margin:0;
padding:0;
}
ul {
list-style:none;
font-size:14px;
overflow:hidden;
}
li{
float:left;
}
a{
text-decoration:none;
display:block;
height:30px;
line-height:30px;
background-color:#ccc;
width:100px;
margin-right:1px;
margin-top:1px;
text-align:center;
}
a:hover{
background-color:#f60;
color:#fff;
}
</style>
</head>
<body>
<ul>
<li><a href="">首 页</a></li>
<li><a href="">新闻快讯</a></li>
<li><a href="">产品展示</a></li>
<li><a href="">售后服务</a></li>
<li><a href="">联系我们</a></li>
</ul>
</body>
</html>
显示效果如下:
圆角菜单的制作
通过设置背景来改变外观样式,通过 a:hover 为菜单添加交互效果。
圆角菜单的制作,可以通过在 a:hover 设置背景来实现。
<html>
<head>
<title>导航菜单制作</title>
<meta charset="utf-8">
<style type="text/css">
*{
margin:0;
padding:0;
}
ul {
list-style:none;
font-size:14px;
overflow:hidden;
height:50px;
border-bottom:5px solid #f60;
padding-left:30px;
}
li{
float:left;
margin-top:20px;
}
a{
text-decoration:none;
display:block;
height:30px;
line-height:30px;
width:120px;
margin-right:1px;
text-align:center;
background:url(http://ofjjubwp5.bkt.clouddn.com/image/jpg/img20.jpg)
}
.on, a:hover{
color:#fff;
background-position:0 -30px;
}
</style>
</head>
<body>
<ul>
<li><a class="on" href="">首 页</a></li>
<li><a href="">新闻快讯</a></li>
<li><a href="">产品展示</a></li>
<li><a href="">售后服务</a></li>
<li><a href="">联系我们</a></li>
</ul>
</body>
</html>
显示效果如下:
改变高度的伸缩菜单
通过设置 height 可以使得菜单的高度变得更高。但是伸缩的时候,菜单栏是向下伸缩的。这时需要重新设置 line-height=height 来修改居中的效果。
<html>
<head>
<title>导航菜单制作</title>
<meta charset="utf-8">
<style type="text/css">
*{
margin:0;
padding:0;
}
ul {
list-style:none;
font-size:14px;
overflow:hidden;
height:50px;
border-bottom:5px solid #f60;
padding-left:30px;
}
li{
float:left;
margin-top:20px;
}
a{
text-decoration:none;
display:block;
height:30px;
line-height:30px;
width:120px;
margin-right:1px;
text-align:center;
}
.on, a:hover{
color:#fff;
background-color:#f60;
height:40px;
margin-top:-10px;
line-height:40px;
}
</style>
</head>
<body>
<ul>
<li><a class="on" href="">首 页</a></li>
<li><a href="">新闻快讯</a></li>
<li><a href="">产品展示</a></li>
<li><a href="">售后服务</a></li>
<li><a href="">联系我们</a></li>
</ul>
</body>
</html>
显示效果如下:
水平方向的伸缩菜单(带有 js 动画效果)
实现的效果为:当鼠标放在菜单的选项上的时候,菜单选项的长度从原来的 120px 扩展成 160px,当鼠标从菜单选项上移开的时候,菜单选项的长度又变回 120px。
要实现以上效果,可以使用 JavaScript 对菜单选项添加 onmouseover 和 onmouseout 事件,使用 setinterval 来逐渐改变菜单栏的长度。需要注意的是,在进入这两个事件后,首先要 使用 clearInterval 来清除其他的事件的动作,否则会对显示效果产生印象。
<html>
<head>
<title>导航菜单制作</title>
<meta charset="utf-8">
<style type="text/css">
*{
margin:0;
padding:0;
}
ul {
list-style:none;
font-size:14px;
overflow:hidden;
height:50px;
border-bottom:5px solid #f60;
padding-left:30px;
}
li{
float:left;
margin-top:20px;
}
a{
text-decoration:none;
display:block;
height:30px;
line-height:30px;
width:120px;
margin-right:1px;
text-align:center;
}
.on, a:hover{
color:#fff;
background-color:#f60;
}
</style>
<script>
window.onload=function(){
var as = document.getElementsByTagName("a"),
a, i, len;
for(i=0, len=as.length; i<len; i++) {
a = as[i];
a.onmouseover=function(){
var This = this;
clearInterval(This.time);
This.time = setInterval(function(){
This.style.width = This.offsetWidth + 4 + "px";
if(This.offsetWidth >= 160) {
This.style.width="160px";
clearInterval(This.time);
}
}, 30);
}
a.onmouseout=function(){
var This = this;
clearInterval(This.time);
This.time = setInterval(function(){
This.style.width = This.offsetWidth - 4 + "px";
if(This.offsetWidth <= 120) {
This.style.width="120px";
clearInterval(This.time);
}
}, 30);
}
}
}
</script>
</head>
<body>
<ul>
<li><a class="on" href="">首 页</a></li>
<li><a href="">新闻快讯</a></li>
<li><a href="">产品展示</a></li>
<li><a href="">售后服务</a></li>
<li><a href="">联系我们</a></li>
</ul>
</body>
</html>
可以通过设置 setinterval 的时间间隔和每次宽度变化的长短,来使得动画效果更加流畅
显示效果如下:
京东商城的导航菜单的实现
纯 CSS 实现商城导航菜单
显示效果如下:
<html>
<head>
<title>test</title>
<meta charset="utf-8">
<style type="text/css">
*{
padding: 0;
margin: 0;
}
.leftmenu{
display: block;
width: 220px;
border: 2px solid #e4393c;
margin-left: 20px;
}
.leftmenu-head{
background-color: #e4393c;
color: white;
font-size: 11pt;
font-weight: bold;
height: 40px;
line-height: 40px;
padding-left: 20px;
}
.leftmenu-content li{
height: 30px;
line-height: 30px;
font-size: 11pt;
list-style: none;
padding-left: 8px;
background: url("http://ofjjubwp5.bkt.clouddn.com/image/png/img48.jpg") no-repeat;
background-position:right;
}
.leftmenu-content li:hover{
height: 28px;
line-height: 28px;
border: 1px solid #DDD;
border-right: none;
box-shadow: 0 0 8px #DDD;
background-image: none;
background-color: white;
}
.leftmenu-content li a {
text-decoration: none;
color: #313131
}
.leftmenu-content li a:hover{
text-decoration: underline;
font-weight: bold;
color: #e4393c;
}
.leftmenu-content .left-menu-line{
height: 30px;
line-height: 30px;
border: 1px solid #313131;
margin: 0 6px;
}
.leftmenu-content li:hover .submenu{
display: block;
}
.submenu{
display: none;
width: 715px;
height: 220px;
position: absolute;
border: 1px solid #DDD;
margin-left: 208px;
margin-top: -28px;
background-color: white;
box-shadow: 0 0 8px #DDD;
}
.submenu span{
display: block;
width: 4px;
height: 27px;
background-color: white;
float: left;
margin-left: -2px;
z-index: 1;
}
.submenu-left{
background-color: white;
width: 490px;
float: left;
margin: 5px;
}
.submenu-left dl{
border-bottom: 1px solid #aaa;
display: block;
overflow: hidden;
}
.submenu-left dl dt{
display: block;
height: 22px;
line-height: 22px;
width: 60px;
float: left;
text-align: right;
margin-top: 4px;
padding-right: 6px;
}
.submenu-left dl dt a{
color: #e4393c;
text-decoration: underline;
font-size: 10pt;
font-weight: bold;
}
.submenu-left dl dd{
display: block;
float: left;
border-left: 1px solid #CCC;
color: #737373;
font-size: 9pt;
height: 14px;
line-height: 14px;
padding: 0 8px;
margin: 8px 0;
}
.submenu-right{
float: left;
margin: 5px;
width: 200px;
height: 200px;
}
.submenu-right a img{
display: block;
width: 150px;
height: 70px;
margin: 5px auto;
}
</style>
</head>
<body>
<div class="leftmenu">
<ul class="leftmenu-content">
<div class="leftmenu-head">全部商品分类</div>
<li><a href="">家用电器</a>
<div class="submenu">
<span></span>
<div class="submenu-left">
<dl>
<dt><a href="">电视</a></dt>
<dd><a href="">合资品牌</a></dd>
<dd><a href="">国产品牌</a></dd>
<dd><a href="">互联网品牌</a></dd>
</dl>
<dl>
<dt><a href="">空调</a></dt>
<dd><a href="">挂壁式空调</a></dd>
<dd><a href="">柜式空调</a></dd>
<dd><a href="">中央空调</a></dd>
<dd><a href="">空调配件</a></dd>
</dl>
<dl>
<dt><a href="">洗衣机</a></dt>
<dd><a href="">滚筒式洗衣机</a></dd>
<dd><a href="">洗烘一体机</a></dd>
<dd><a href="">迷你洗衣机</a></dd>
</dl>
</div>
<div class="submenu-right">
<a href="">
<img src="http://ofjjubwp5.bkt.clouddn.com/image/jpg/avatar.jpg" alt="">
</a>
<a href="">
<img src="http://ofjjubwp5.bkt.clouddn.com/image/jpg/avatar.jpg" alt="">
</a>
</div>
</div>
</li>
<li><a href="">手机</a><span class="left-menu-line"></span><a href="">运营商</a><span class="left-menu-line"></span><a href="">数码</a>
<div class="submenu">
<span></span>
<div class="submenu-left">
<dl>
<dt><a href="">电视</a></dt>
<dd><a href="">合资品牌</a></dd>
<dd><a href="">国产品牌</a></dd>
<dd><a href="">互联网品牌</a></dd>
</dl>
<dl>
<dt><a href="">空调</a></dt>
<dd><a href="">挂壁式空调</a></dd>
<dd><a href="">柜式空调</a></dd>
<dd><a href="">中央空调</a></dd>
<dd><a href="">空调配件</a></dd>
</dl>
<dl>
<dt><a href="">洗衣机</a></dt>
<dd><a href="">滚筒式洗衣机</a></dd>
<dd><a href="">洗烘一体机</a></dd>
<dd><a href="">迷你洗衣机</a></dd>
</dl>
</div>
<div class="submenu-right">
右侧推荐品牌
</div>
</div>
</li>
<li><a href="">电脑办公</a>
<div class="submenu">
<span></span>
<div class="submenu-left">
<dl>
<dt><a href="">电视</a></dt>
<dd><a href="">合资品牌</a></dd>
<dd><a href="">国产品牌</a></dd>
<dd><a href="">互联网品牌</a></dd>
</dl>
<dl>
<dt><a href="">空调</a></dt>
<dd><a href="">挂壁式空调</a></dd>
<dd><a href="">柜式空调</a></dd>
<dd><a href="">中央空调</a></dd>
<dd><a href="">空调配件</a></dd>
</dl>
<dl>
<dt><a href="">洗衣机</a></dt>
<dd><a href="">滚筒式洗衣机</a></dd>
<dd><a href="">洗烘一体机</a></dd>
<dd><a href="">迷你洗衣机</a></dd>
</dl>
</div>
<div class="submenu-right">
右侧推荐品牌
</div>
</div>
</li>
</ul>
</div>
</body>
使用 JavaScript 修改鼠标悬浮的效果
实现方法是,将原来的 hover 修改的效果写在一个新类里面,在出发 mouseover 事件后,绑定该类以触发显示效果。
如下面代码所示,鼠标触发的效果在 lihover 这个类中,当 li 出发 mouseover 事件后,使用 className 动态添加样式类。
<html>
<head>
<title>test</title>
<meta charset="utf-8">
<style type="text/css">
*{
padding: 0;
margin: 0;
}
.leftmenu{
display: block;
width: 220px;
border: 2px solid #e4393c;
margin-left: 20px;
}
.leftmenu-head{
background-color: #e4393c;
color: white;
font-size: 11pt;
font-weight: bold;
height: 40px;
line-height: 40px;
padding-left: 20px;
}
.leftmenu-content li{
height: 30px;
line-height: 30px;
font-size: 11pt;
list-style: none;
padding-left: 8px;
background: url("http://ofjjubwp5.bkt.clouddn.com/image/png/img48.jpg") no-repeat;
background-position:right;
}
.leftmenu-content li a {
text-decoration: none;
color: #313131
}
.leftmenu-content li a:hover{
text-decoration: underline;
font-weight: bold;
color: #e4393c;
}
.leftmenu-content .left-menu-line{
height: 30px;
line-height: 30px;
border: 1px solid #313131;
margin: 0 6px;
}
.leftmenu-content .lihover .submenu{
display: block;
}
.leftmenu-content .lihover{
height: 28px;
line-height: 28px;
border: 1px solid #DDD;
border-right: none;
box-shadow: 0 0 8px #DDD;
background-image: none;
background-color: white;
}
.submenu{
display: none;
width: 715px;
height: 220px;
position: absolute;
border: 1px solid #DDD;
margin-left: 208px;
margin-top: -28px;
background-color: white;
box-shadow: 0 0 8px #DDD;
}
.submenu span{
display: block;
width: 4px;
height: 27px;
background-color: white;
float: left;
margin-left: -2px;
z-index: 1;
}
.submenu-left{
background-color: white;
width: 490px;
float: left;
margin: 5px;
}
.submenu-left dl{
border-bottom: 1px solid #aaa;
display: block;
overflow: hidden;
}
.submenu-left dl dt{
display: block;
height: 22px;
line-height: 22px;
width: 60px;
float: left;
text-align: right;
margin-top: 4px;
padding-right: 6px;
}
.submenu-left dl dt a{
color: #e4393c;
text-decoration: underline;
font-size: 10pt;
font-weight: bold;
}
.submenu-left dl dd{
display: block;
float: left;
border-left: 1px solid #CCC;
color: #737373;
font-size: 9pt;
height: 14px;
line-height: 14px;
padding: 0 8px;
margin: 8px 0;
}
.submenu-right{
float: left;
margin: 5px;
width: 200px;
height: 200px;
}
.submenu-right a img{
display: block;
width: 150px;
height: 70px;
margin: 5px auto;
}
</style>
<script>
window.onload = function(){
var lists = document.getElementsByClassName("leftmenu-content")[0].getElementsByTagName("li"),
i, len;
for(i=0,len = lists.length; i<len; i++){
lists[i].onmouseover = function(){
var This = this
console.log(This.className);
This.className = "lihover";
}
lists[i].onmouseout = function(){
var This = this;
console.log(This.className);
This.className = null;
}
}
}
</script>
</head>
<body>
<div class="leftmenu">
<ul class="leftmenu-content">
<div class="leftmenu-head">全部商品分类</div>
<li><a href="">家用电器</a>
<div class="submenu">
<span></span>
<div class="submenu-left">
<dl>
<dt><a href="">电视</a></dt>
<dd><a href="">合资品牌</a></dd>
<dd><a href="">国产品牌</a></dd>
<dd><a href="">互联网品牌</a></dd>
</dl>
<dl>
<dt><a href="">空调</a></dt>
<dd><a href="">挂壁式空调</a></dd>
<dd><a href="">柜式空调</a></dd>
<dd><a href="">中央空调</a></dd>
<dd><a href="">空调配件</a></dd>
</dl>
<dl>
<dt><a href="">洗衣机</a></dt>
<dd><a href="">滚筒式洗衣机</a></dd>
<dd><a href="">洗烘一体机</a></dd>
<dd><a href="">迷你洗衣机</a></dd>
</dl>
</div>
<div class="submenu-right">
<a href="">
<img src="http://ofjjubwp5.bkt.clouddn.com/image/jpg/avatar.jpg" alt="">
</a>
<a href="">
<img src="http://ofjjubwp5.bkt.clouddn.com/image/jpg/avatar.jpg" alt="">
</a>
</div>
</div>
</li>
<li><a href="">手机</a><span class="left-menu-line"></span><a href="">运营商</a><span class="left-menu-line"></span><a href="">数码</a>
<div class="submenu">
<span></span>
<div class="submenu-left">
<dl>
<dt><a href="">电视</a></dt>
<dd><a href="">合资品牌</a></dd>
<dd><a href="">国产品牌</a></dd>
<dd><a href="">互联网品牌</a></dd>
</dl>
<dl>
<dt><a href="">空调</a></dt>
<dd><a href="">挂壁式空调</a></dd>
<dd><a href="">柜式空调</a></dd>
<dd><a href="">中央空调</a></dd>
<dd><a href="">空调配件</a></dd>
</dl>
<dl>
<dt><a href="">洗衣机</a></dt>
<dd><a href="">滚筒式洗衣机</a></dd>
<dd><a href="">洗烘一体机</a></dd>
<dd><a href="">迷你洗衣机</a></dd>
</dl>
</div>
<div class="submenu-right">
右侧推荐品牌
</div>
</div>
</li>
<li><a href="">电脑办公</a>
<div class="submenu">
<span></span>
<div class="submenu-left">
<dl>
<dt><a href="">电视</a></dt>
<dd><a href="">合资品牌</a></dd>
<dd><a href="">国产品牌</a></dd>
<dd><a href="">互联网品牌</a></dd>
</dl>
<dl>
<dt><a href="">空调</a></dt>
<dd><a href="">挂壁式空调</a></dd>
<dd><a href="">柜式空调</a></dd>
<dd><a href="">中央空调</a></dd>
<dd><a href="">空调配件</a></dd>
</dl>
<dl>
<dt><a href="">洗衣机</a></dt>
<dd><a href="">滚筒式洗衣机</a></dd>
<dd><a href="">洗烘一体机</a></dd>
<dd><a href="">迷你洗衣机</a></dd>
</dl>
</div>
<div class="submenu-right">
右侧推荐品牌
</div>
</div>
</li>
</ul>
</div>
</body>
</html>