赞
踩
之前做了一个项目中,使用了类似手机中选项卡切换的导航栏,想着能够整理出来,写了一个demo,放在了Github中,欢迎大家提出意见啊 ^_^
本Demo源地址 请点击这里
本站下载地址 请点击这里
下面,我们分别介绍下面的四种应用场景:
首先是最简单的导航栏形式,只显示最简单的文本,点击文本可以自动切换对应的内容,本例是自动展示导航栏的标题描述。
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>自定义导航栏_简单文字</title> <link rel="stylesheet" href="./css/main.css" > <script src="./js/common/jquery/1.8.3/jquery-1.8.3.min.js"></script> <script src="./js/common/handlebars/1.0.6/handlebars.js"></script> <script src="./js/common/handlebars/1.0.6/helpers.js"></script> <script src="./js/common/navigationbar/1.0.0/navigation-bar.1.0.0.js"></script> </head> <body> <div id="find_nav" class="find_nav"> </div> <div id="content" class="content"> <h1>Title1</h1> </div> <script id="tpl_navigationbar" type="text/x-handlebars-template"> <div class="navigationbar_list"> {{#nav_list nav}} <a href="javascript:;"><label>{{title}}</label></a> {{/nav_list}} </div> </script> <script type="text/javascript"> var json = { nav:[ { title:"Title1"}, { title:"Title2"}, { title:"Title3"}, { title:"Title4"}, { title:"Title5"}, { title:"Title6"} ] } $(function() { $('#find_nav').navigationBar({ initLayout : layout },json); }); /** * 这里设置标签对应布局,根据index来决定 * * @param index * 标签的索引值 */ var layout = function handleClickEvent(index){ $('#content h1').html(json.nav[index - 1]['title']); } </script> </body> </html>
本示例也是一种简单的导航栏形式,每个选项卡只显示一张图片,点击不同的导航栏的选项卡,切换不同的内容。
<!DOCTYPE html> <!-- saved from url=(0045)http://down.admin5.com/demo/code_pop/19/2069/ --> <html> <head> <meta charset="utf-8" /> <title>自定义导航栏_简单图片</title> <link rel="stylesheet" href="./css/main.css" > <script src="./js/common/jquery/1.8.3/jquery-1.8.3.min.js"></script> <script src="./js/common/handlebars/1.0.6/handlebars.js"></script> <script src="./js/common/handlebars/1.0.6/helpers.js"></script> <script src="./js/common/navigationbar/1.0.0/navigation-bar.1.0.0.js"></script> </head> <body> <div id="find_nav" class="find_nav"> </div> <div id="content" class="content"> <img src=""/> </div> <script id="tpl_navigationbar" type="text/x-handlebars-template"> <div class="navigationbar_list"> {{#nav_list nav}} <a href="javascript:;"><img src="{{url}}"/></a> {{/nav_list}} </div> </script> <script type="text/javascript"> var json = { nav:[ { url:"./image/11.png"}, { url:"./image/12.png"}, { url:"./image/13.png"}, { url:"./image/14.png"}, { url:"./image/15.png"}, { url:"./image/16.png"} ] } $(function() { $('#find_nav').navigationBar({ initLayout : layout },json); }); /** * 这里设置标签对应布局,根据index来决定 * * @param index * 标签的索引值 */ var layout = function handleClickEvent(index){ $('#content img').attr("src", json.nav[index - 1]['url']); } </script> </body> </html>
本示例是1 和 2 的结合,算是稍微复杂点的导航栏形式;同样点击不同的导航栏的选项卡,切换不同的文字和图片。
<!DOCTYPE html> <!-- saved from url=(0045)http://down.admin5.com/demo/code_pop/19/2069/ --> <html> <head> <meta charset="utf-8" /> <title>自定义导航栏_文字和图片</title> <link rel="stylesheet" href="./css/main.css" > <script src="./js/common/jquery/1.8.3/jquery-1.8.3.min.js"></script> <script src="./js/common/handlebars/1.0.6/handlebars.js"></script> <script src="./js/common/handlebars/1.0.6/helpers.js"></script> <script src="./js/common/navigationbar/1.0.0/navigation-bar.1.0.0.js"></script> </head> <body> <div id="find_nav" class="find_nav"> </div> <div id="content" class="content"> <img src=""/> <h1>Title1</h1> </div> <script id="tpl_navigationbar" type="text/x-handlebars-template"> <div class="navigationbar_list"> {{#nav_list nav}} <a href="javascript:;"> <img src="{{url}}" /> <label>{{title}}</label> </a> {{/nav_list}} </div> </script> <script type="text/javascript"> var json = { nav:[ { title:"Title1", url:"./image/11.png"}, { title:"Title2", url:"./image/12.png"}, { title:"Title3", url:"./image/13.png"}, { title:"Title4", url:"./image/14.png"}, { title:"Title5", url:"./image/15.png"}, { title:"Title6", url:"./image/16.png"} ] } $(function() { $('#find_nav').navigationBar({ navWidth : 150, navHeight : 60, initLayout : layout },json); //var navigationBar = new $.NavigationBar( {}, $('#find_nav') ); }); /** * 这里设置标签对应布局,根据index来决定 * * @param index * 标签的索引值 */ var layout = function handleClickEvent(index){ $('#content h1').html(json.nav[index - 1]['title']); $('#content img').attr("src", json.nav[index - 1]['url']); } </script> </body> </html>
本示例是演示自适应布局,能够实现导航栏的自适应大小,不过下划线的适应有些问题,欢迎各位讨论交流~~
<!DOCTYPE html> <!-- saved from url=(0045)http://down.admin5.com/demo/code_pop/19/2069/ --> <html> <head> <meta charset="utf-8" /> <title>自定义导航栏_简单文字自适应大小</title> <link rel="stylesheet" href="./css/main.css" > <script src="./js/common/jquery/1.8.3/jquery-1.8.3.min.js"></script> <script src="./js/common/handlebars/1.0.6/handlebars.js"></script> <script src="./js/common/handlebars/1.0.6/helpers.js"></script> <script src="./js/common/navigationbar/1.0.0/navigation-bar.1.0.0.js"></script> </head> <body> <p>这个可以根据屏幕分辨率适应大小,不过下划线的适应有些问题,欢迎大家帮忙解决</p> <div id="find_nav" class="find_nav"> </div> <div id="content" class="content"> <h1>Title1</h1> </div> <script id="tpl_navigationbar" type="text/x-handlebars-template"> <div class="navigationbar_list"> {{#nav_list nav}} <a href="javascript:;"><label>{{title}}</label></a> {{/nav_list}} </div> </script> <script type="text/javascript"> var json = { nav:[ { title:"Title1"}, { title:"Title2"}, { title:"Title3"}, { title:"Title4"}, { title:"Title5"}, { title:"Title6"} ] } $(function() { $('#find_nav').navigationBar({ autoAdaptation : true, initLayout : layout },json); }); /** * 这里设置标签对应布局,根据index来决定 * * @param index * 标签的索引值 */ var layout = function handleClickEvent(index){ $('#content h1').html(json.nav[index - 1]['title']); } </script> </body> </html>
/** * navigation-bar.1.0.0.js * 自定义导航栏插件 * (1). 依赖jQuery第三方库,详细请至官网了解:http://jquery.com/ * (2). 依赖Handlebars第三方库,详细请至官网了解:http://handlebarsjs.com/ * * Author: Huazie * Date: 2016/10/15 * Version: 1.0.0 */ (function( $, undefined ) { /* * NavigationBar object. */ $.NavigationBar = function( options, element ) { this.$el = $( element ); this._init( options ); }; $.NavigationBar.defaults = { currPosition : 1, // 当前被选中的标签,默认为1 navWidth : 100, // 导航栏标签的宽度 navHeight : 50, // 导航栏标签的高度 sideLineHeight : 3, // 导航栏的下边线的高度 sideLineColor : '#48a5f4', // 导航栏的下边线的颜色 textSize : 18, // 导航栏标签文字的大小 textColor : '#666', // 导航栏标签文字的颜色 autoAdaptation : false, // 标签宽度是否自动适应所在容器大小 initLayout : function(index){} // 标签内容展示函数,需要自行定义实现 }; $.NavigationBar.prototype = { _init : function( options ) { this.options = $.extend( true, {}, $.NavigationBar.defaults, options ); // 父容器 this.$el.css({ height : this.options.navHeight, 'position' : 'relative' }); // 导航栏容器 this.$list = this.$el.find('.navigationbar_list'); this.$list.css({ left : 0, height : this.options.navHeight, margin : 0, padding : 0 }); // ul 标签 this.$ul = this.$list.find('ul'); this.$ul.css({ 'white-space' : 'nowrap', margin : 0, padding : 0 }); // ul 下的 li 标签 this.$li = this.$ul.children(); this.$li.css({ 'display' : 'inline-block', margin : 0, padding : 0 }); // a 标签 this.$a = this.$ul.find('li a'); this.$a.css({ 'display' : 'block', 'line-height' : this.options.navHeight + 'px', 'font-size' : this.options.textSize + 'px', 'text-align' : 'center', 'color' : this.options.textColor, 'text-decoration' : 'none', margin : 0, padding : 0 }); // 导航线 this.$sideline = this.$list.find('ul .sideline'); this.$sideline.css({ 'position' : 'absolute', 'background-color' : this.options.sideLineColor, height : this.options.sideLineHeight, left : 0, top : (this.options.navHeight - this.options.sideLineHeight), margin : 0, padding : 0 }); // 导航图片标签 this.$image = this.$a.find('img'); if(this.$image.length > 0){ this.$image.css({ 'vertical-align' : 'middle', 'cursor' : 'pointer', margin : 0, padding : 0 }); } // 导航文字标签 this.$label = this.$a.find('label'); if(this.$label.length > 0){ this.$label.css({ 'vertical-align' : 'middle', 'cursor' : 'pointer', margin : 0, padding : 0 }); } this.count = this.$a.length; // 导航标签的数目 if(this.options.autoAdaptation){ // 开启自动适应,将以父容器大小决定每个导航标签的大小 this.navWidth = (1 / this.count) * 100 + '%'; // 能够根据父容器大小改变自身大小 }else{ // 关闭自动适应,则使用定义的宽度决定整个导航栏的大小 this.navWidth = this.options.navWidth; this.$el.width(this.navWidth * this.count); } this.$sideline.width(this.navWidth); this._each(); // 初始化导航标签页 this._click(); // 绑定导航页点击事件 }, _each : function(){ var _self = this; var num = 0; this.$li.each(function(){ num++; if(num == _self._getCurrentPosition()){ _self.$sideline.css({left:$(this).position().left}); $(this).addClass("current").siblings().removeClass("current"); } $(this).css({width:_self.navWidth}); }); this.options.initLayout(_self._getCurrentPosition()); // 展示对应标签的内容 }, _click : function(){ var _self = this; this.$li.on('click', function(){ var _li = this; _self.navWidth = $(this).width(); _self.$sideline.stop(true); _self.$sideline.animate({left:$(this).position().left},300); $(this).addClass("current").siblings().removeClass("current"); var num = 0; _self.$li.each(function(){ num++; if(this == _li){ // 判断是不是点击的对象 _self._setCurrentPosition(num); } }); _self.options.initLayout(_self._getCurrentPosition()); // 展示对应标签的内容 }); }, _setCurrentPosition : function(currPosition){ sessionStorage.setItem(this.$el.selector, currPosition); this.options.currPosition = currPosition; }, _getCurrentPosition : function(){ var currPosition = sessionStorage.getItem(this.$el.selector); if(currPosition){ this.options.currPosition = currPosition; } return this.options.currPosition; } }; $.fn.navigationBar = function( options, data) { if (arguments.length == 1){ data = options; options = {}; } var source = $('#tpl_navigationbar').html(); var template = Handlebars.compile(source); this.html(template(data)); var nav = $.data( this, 'navigationBar' ); if ( !nav ) { $.data( this, 'navigationBar', new $.NavigationBar( options, this ) ); } return this; }; })( jQuery );
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。