jquery动态导航插件dynamicNav用法实例分析


Posted in Javascript onSeptember 06, 2015

本文实例讲述了jquery动态导航插件dynamicNav用法。分享给大家供大家参考。具体如下:

这是一款自己写的jquery动态导航插件—dynamicNav,具体思路是:

第一、给所有的li里插入一个span标签,且包含li里面的a标签
第二、复制一份a标签,插入到span里,现在span里有两个a标签
第三、根据传入的参数判断是垂直切换还是水平的,如果是垂直的,将span的宽度改为一个a标签的宽度,这时两个a标签就垂直排列了,这里一定要将li的overflow:hidden;否则会看到2个a标签。如果是水平的,将span的宽度改为2个a标签的宽度,且将li的宽度改为一个a标签的宽度,因为我没有在css中设置li的宽度,它是随a标签的宽度而改变,如果你像将所有导航菜单的宽度设为一样宽,可以在css中给li加上width属性。
第四、就是开始制作动画效果,使用hover事件,处理鼠标经过和离开时的效果。

使用jquery的animate改变span的margin-top(垂直方向)和margin-left(水平方向)就可以了。

运行效果截图如下:

jquery动态导航插件dynamicNav用法实例分析

在线演示地址如下:

具体代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>动态导航插件</title>
<style type="text/css">
<!--
body, td, th {
 font-size: 14px;
 background-color:#FFF
}
h1{border-bottom:1px solid #999; margin:50px 60px;}
/*导航默认样式,可根据实际情况修改*/
* {
 margin:0;
 padding:0
}
.nav {
 width:980px;
 height:30px;
 left:50%;
 margin-left:-490px;
 list-style:none;
 position:relative;
}
.nav li {
 display:inline-block;
 margin:0 3px;
 position:relative;
 overflow:hidden;
 height:30px; /*建议此高度大于等于里面的a标签高度*/
 float:left;
}
.nav li span {
 display:inline-block;
 overflow:hidden
}
.nav li a {
 text-decoration:none;
 outline:none;
 color:#666;
 display:inline-block;
 padding:0 10px; 
 text-align:center;
 background-color: #E1E1E1;
 font-weight:bold;
 height:30px;
 line-height:30px;
}
/*鼠标经过时样式*/
.nav li a.over {
 background-color:#666;
 color:#FFF
}
-->
</style>
<script type=text/javascript src="jquery-1.6.2.min.js"></script>
<script type="text/javascript">
(function($){
  $.fn.dynamicNav=function(options){
  //默认配置
   var defaults = {
   direction:"up", //动画切换方向,总共4种up 、down 、left 、right
   duration:100 //三种预定速度之一的字符串("slow", "normal", or "fast")或表示动画时长的毫秒数值(如:1000)
   }; 
 // 覆盖默认配置
  var opts = $.extend(defaults, options);
  this.each(function(){
   var navList=$(this).find("li"),
   navLink=navList.find("a");
   //在a标签外侧插入span
   navList.wrapInner("<span></span>");
   var span=navLink.parent();
   //判断是否垂直切换
   if(opts.direction=="up" || opts.direction=="down"){
    var v=true;
     }
   //判断是否改变span初始位置及a样式 
   if(opts.direction=="right" || opts.direction=="down"){
    var restSpan=true;
     }
    navLink.each(function(){
    //获取a高度和宽度
    var w=$(this).outerWidth(),
    p=$(this).parent();
    //初始复制现有a标签 
    $(this).clone().appendTo(p).addClass("over");
    //如果是垂直切换
    if(v){ 
     p.css("width",w);   
     }else{
     p.css("width",2*w).parent().css("width",w); 
     }
     });
   //如果向右或向下切换,改变span初始位置及a样式
   if(restSpan){
   span.each(function(){
     if(opts.direction=="right"){
     $(this).css({"margin-left":-$(this).outerWidth()/2});
     }
    if(opts.direction=="down"){
     $(this).css({"margin-top" : -$(this).outerHeight()/2});
     }
    $(this)
    .find('a')
    .last()
    .removeClass("over")
    .prev()
    .addClass("over");
    });
     }
   //鼠标经过时动画函数
   function over(o){
    o.animate(v?{"margin-top": -o.outerHeight()/2}:{"margin-left": -o.outerWidth()/2}, opts.duration);
     }
   //鼠标移开时动画函数
   function out(o){
    o.animate(v?{"margin-top":0}:{"margin-left": 0}, opts.duration);
     }
   //鼠标经过和离开 
   span.hover(function(){
     restSpan ? out($(this)) : over($(this));
      },function(){
      restSpan ? over($(this)) : out($(this));
      });
   });
  };
 })(jQuery);
 $(function(){
  //向左 
  $("#nav1").dynamicNav({
    direction:"left", //动画切换方向,总共4种up 、down 、left 、right
    duration:300 //三种预定速度之一的字符串("slow", "normal", or "fast")或表示动画时长的毫秒数值(如:1000)
    });
  //向右 
  $("#nav2").dynamicNav({
    direction:"right", 
    duration:200 
    });
  //向上
  $("#nav3").dynamicNav({
    direction:"up", 
    duration:100 
    });
  //向下 
  $("#nav4").dynamicNav({
    direction:"down",
    duration:400
    });
  });
</script>
</head>
<body>
<h1>向左(速度300毫秒)</h1>
<ul class="nav" id="nav1">
 <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>
 <li><a href="#">关于我</a></li>
</ul>
<h1>向右(速度200毫秒)</h1>
<ul class="nav" id="nav2">
 <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>
 <li><a href="#">关于我</a></li>
</ul>
<h1>向上(速度100毫秒)</h1>
<ul class="nav" id="nav3">
 <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>
 <li><a href="#">关于我</a></li>
</ul>
<h1>向下(速度400毫秒)</h1>
<ul class="nav" id="nav4">
 <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>
 <li><a href="#">关于我</a></li>
</ul>
</body>
</html>

希望本文所述对大家的jquery程序设计有所帮助。

Javascript 相关文章推荐
jquery插件corner实现圆角边框的方法
Mar 09 Javascript
JavaScript定时器和优化的取消定时器方法
Jul 03 Javascript
js实现简易的单数字随机抽奖(0-9)
Mar 19 Javascript
详解javascript遍历方式
Nov 11 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
Dec 01 Javascript
jQuery循环遍历子节点并获取值的方法
Apr 14 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
Mar 07 Javascript
JavaScript实现省市县三级级联特效
May 16 Javascript
微信小程序报错:this.setData is not a function的解决办法
Sep 27 Javascript
Mint UI 基于 Vue.js 移动端组件库
Nov 07 Javascript
JS实现简易留言板增删功能
Feb 08 Javascript
vue-cli设置publicPath小记
Apr 14 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
Sep 06 #Javascript
jquery实现初次打开有动画效果的网页TAB切换代码
Sep 06 #Javascript
js实现简洁的TAB滑动门效果代码
Sep 06 #Javascript
js实现左侧网页tab滑动门效果代码
Sep 06 #Javascript
浅谈javascript函数式编程
Sep 06 #Javascript
JS简单实现多级Select联动菜单效果代码
Sep 06 #Javascript
Javascript实现快速排序(Quicksort)的算法详解
Sep 06 #Javascript
You might like
php adodb操作mysql数据库
2009/03/19 PHP
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
php中smarty区域循环的方法
2015/06/11 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
PHP接口类(interface)的定义、特点和应用示例
2020/05/18 PHP
JS小框架 fly javascript framework
2009/11/26 Javascript
JavaScript中实现块作用域的方法
2010/04/01 Javascript
浅析JavaScript动画
2015/06/10 Javascript
javascript学习笔记之函数定义
2015/06/25 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
[01:08]DOTA2次级职业联赛 - Shield战队宣传片
2014/12/01 DOTA
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
Python中的迭代器与生成器高级用法解析
2016/06/28 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
详解python分布式进程
2018/10/08 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
python 经典数字滤波实例
2019/12/16 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
python 通过文件夹导入包的操作
2020/06/01 Python
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
如何写一个自定义标签
2012/12/28 面试题
Java面试题:Java类的Main方法如果是Private将会怎么样
2016/08/18 面试题
实习销售业务员自我鉴定
2013/09/21 职场文书
护士岗前培训自我评鉴
2014/02/28 职场文书
学生保证书
2015/01/16 职场文书