关于导航栏的一些思考和实现

导航栏在我们的页面开发中相当重要。而且方法也多种多样,实现效果多种多样。这次先整理2级横向的导航栏,有空再整理纵向和多级导航栏。

首先是页面的基础样式,后面的所有样式和js都是根据这个样式为基础进行改写。

其实对于14行的样式需要注意的是a.on和a .on的区别。a.on是同级关系,a标签内的class类on。a .on是父子关系,a标签下子类元素的on类。这是不同的。需要注意!

另外一个比较重要大的点是jquery里面[attribute^=value]是指匹配给定的属性是以某些值开始的元素。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<title>下拉导航栏</title>
	<style type="text/css">
		*{ margin:0; padding: 0; }
		a{ text-decoration: none; }
		.nav{ width: 100%; height: 40px; margin-top: 70px; background-color: #222; }
		.list{ width: 90%; height: 40px; margin: 0 auto; list-style-type: none; }
		.list li{ float: left; }
		.list li a{ padding: 0 30px; color: #aaa; line-height: 40px; display: block; }
		.list li a:hover{ background:#333; color:#fff; }
		.list li a.on{ background:#333; color:#fff; }
		h1{ margin: 20px auto; text-align: center; }
	</style>
</head>
<body>
    <header class="header">
    	<div class="nav">
    		<ul class="list">
    			<li><a href="index.html">echoaiyaya</a>
    			<li><a href="dropDownMenu.html">下拉菜单</a></li>
    			<li><a href="cssChange.html">样式改变</a></li>
    			<li><a href="jsChange.html">js改变</a></li>
    			<li><a href="flexible.html">弹性菜单</a></li>
    			<li><a href="css1Flexible1.html">纯CSS下拉1</a></li>
    			<li><a href="css2Flexible2.html">纯CSS下拉2</a></li>
    			<li><a href="css3Flexible3.html">纯CSS下拉3</a></li>
    			<li><a href="css4Flexible4.html">js+css</a></li>
    		</ul>
    	</div>
    </header>
    <h1>首页</h1>
    <script src="./jquery.min.js" type="text/javascript"></script>
    <script type="text/javascript">
    	$(function(){
		  //当前链接以/分割后最后一个元素索引
		  var index = window.location.href.split("/").length-1;
		  //最后一个元素前四个字母,防止后面带参数
		  var href = window.location.href.split("/")[index].substr(0,4);
		  
		  if(href.length>0){
		    //如果匹配开头成功则更改样式
		    $(".list li a[href^='"+href+"']").addClass("on");
		    //[attribute^=value]:匹配给定的属性是以某些值开始的元素。
		  }else {
		    //默认主页高亮
		    $(".list li a[href^='index']").addClass("on");
		  }
		});
    </script>
</body>
</html>

这段代码得到的的样式如图:


前面的“样式改变”和“js改变”都是实现导航滚动改变导航名字的功能。因为主要想记录的是下拉导航的实现,这里就不写出来了,有兴趣的可以到下面地址下载源码自己看看就好。


1.弹性菜单

实现思路:

(1).先给html添加二级菜单。

(2).编写css样式,改变二级菜单展示的位置和展示效果。

(3).编写js样式,实现动态效果。

实现代码:

第一步:给html添加二级菜单:

<header class="header">
    <div class="nav">
    	<ul class="list">
    	    <li><a href="index.html">echoaiyaya</a>
    		<li><a href="dropDownMenu.html">下拉菜单</a></li>
    		<li><a href="cssChange.html">样式改变</a></li>
    		<li><a href="jsChange.html">js改变</a>
    		    <div class="down">
    			<a href="#">1111</a>
    			<a href="#">1111</a>
    			<a href="#">1111</a>
    			<a href="#">1111</a>
    			<a href="#">1111</a>
    		    </div>
    		</li>
    		<li><a href="flexible.html">弹性菜单</a>
    		    <div class="down">
    			<a href="#">1111</a>
    			<a href="#">2222</a>
    			<a href="#">3333</a>
    			<a href="#">4444</a>
    		    </div>
    		</li>
    		<li><a href="555">hello555</a></li>
    	</ul>
    </div>
 </header>
第二步:添加css样式:

.list .down{ position: absolute; top: 40px; background-color: #222; display: none; }
.list .down a{ color: #aaa; padding-left: 30px; display: block; }
这里我们采用相对定位,所以要给一个父级元素添上position:relative;

.nav{ width: 100%; height: 40px; margin-top: 70px; background-color: #222; position: relative;}
这里的relative不一定要是.nav。放在.list里面也是可以的。
第三步:添加js动态效果:

首先要先引入jquery和jquery的扩展包easing。

<script src="./jquery.min.js" type="text/javascript"></script>
<script src="./jquery.easing.min.js" type="text/javascript"></script>
然后通过js获取li标签的hover动作进行效果实现,代码如下:

$(".list li").hover(function(){
    $(this).find(".down").stop().slideDown({duration:500, easing:"easeOutBounce"});
},function(){
    $(this).find(".down").stop().slideUp({duration:500, easing:"easeOutBounce"});
});
stop()的作用是当进行其他标签动作时停止这个动作。如果不进行stop()的话,你就会发现动作不停叠加,当你的鼠标离开后动作也在不停进行。

你看,宛若zz。当然,就算填了stop()解决了这个问题后,其实还是有些小bug。这里就不演示了。

2.纯css下拉方法一

实现思路:

这个实现思路就简单多了,就是把二级菜单先隐藏起来,然后鼠标浮动到导航栏上面的时候再把二级菜单显示出来。

实现代码:

第一步:对html添加二级菜单,如同弹性菜单一样,这里不重复了。

第二步:对css样式进行改写。代码如下:

.list .down{ position: absolute;  top: 40px; background-color: #222; display: none; }
.list .down a{ color: #aaa; padding-left: 30px; display: block; }
.list li:hover .down{ display: block; }
这里和弹性菜单差不多,但是直接在通过鼠标浮动到li上的时候直接将二级菜单显示出来。就是第三列的作用。


3.纯css下拉方法二
实现思路:

(1).这里的实现方法是将li标签固定高度,溢出的部分隐藏掉。

(2).然后当鼠标浮动到li标签上的时候将隐藏样式显示出来。

实现代码:

第一步:同样先给一级菜单添加二级菜单。

第二步:编写css代码,代码如下:

.list li{ float: left; overflow: hidden; position: relative;}
.list .down{ position: absolute; top: 40px; background-color: #222; }
.list .down a{ color: #aaa; padding-left: 30px; display: block; }
.list li:hover{ overflow: visible; }
先给.list下的li标签添加overflow和position。这里和弹性菜单不一样,不能把position放在.nav上。因为是针对.list下的li标签的溢出。然后当浮动的时候将overflow显示出来。

4.纯css下拉三

前面两种css实现下拉太过僵硬,没有过渡效果。就怕领导给差评。所以这里在做一个有过渡效果的。

实现思路:这里我们用css的transition属性来进行过渡操作,先把二级菜单大高度设置为0,然后鼠标浮动上去的时候显示高度,也就是显示二级菜单。

实现代码:

第一步:添加二级菜单标签,设置position设置二级菜单的位置。

第二步:编写css样式设置高度,代码如下:

.list .down{ position: absolute; top: 40px; background-color: #222; opacity: 0; height: 0; overflow: hidden; transition: all 1s ease;}
.list .down a{ padding-left: 30px; color: #aaa; display: block; }
.list li:hover .down{ opacity: 1; height: 400%;}
那个opacity的透明度属性可以注释掉,不影响过渡属性。

事实上,在实际过程中,我们设置这个.down的高度我们不知道二级菜单有多少,界面骗骗领导好了,给后台去写,后台估计会日狗了。固定高度的后果如下:

你看吧。这就直接留白了。如果二级菜单更多,就要溢出了。

5.js+css实现下拉

实现思路:其实就是在下拉方法3的基础上添加js样式,通过js来获取二级菜单的高度来进行过渡效果的展现。

实现代码:

第一步:添加二级菜单的html和设置position的样式,和上面的一样,这里不重复说明了。

第二步:添加css样式,代码如下:

.list li a.on{ background:#333; color:#fff; }
.list .down{ position: absolute; top: 40px; background-color: #222; height: 0; overflow: hidden; transition: all 1s ease;}
.list .down a{ color: #aaa; padding-left: 30px; display: block; }
这里就没有鼠标浮动的样式添加了,因为动态效果将在js里面实现。

第三步:通过js来获取二级菜单的高度来设置,代码如下:

$(".list li").hover(function(){
    var num = $(this).find(".down a").size();
    height = num * 100 + '%';
    //alert(height);
    $(this).find(".down").height(height);
},function(){
    $(this).find(".down").height(0);
});
计算.down的高度,然后当鼠标浮动,就将这个高度赋值上去,离开就设置为0。

效果献上:


总结:

因为公司没了前端,只能后台自己写前端。所以博主正在努力学前端,欢迎大家来指出文章的错误。

源代码百度云:http://pan.baidu.com/s/1gfpFyjp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值