当前位置 : 主页 > 编程语言 > c语言 >

自定义导航栏(navigation-bar.1.0.0.js)

来源:互联网 收集:自由互联 发布时间:2023-09-06
(自定义导航栏) navigation-bar.1.0.0.js 前言 之前做了一个项目中,使用了类似手机中选项卡切换的导航栏,想着能够整理出来,写了一个demo,放在了Github中,欢迎大家提出意见啊 ^_^ 本De

(自定义导航栏)

navigation-bar.1.0.0.js

前言

之前做了一个项目中,使用了类似手机中选项卡切换的导航栏,想着能够整理出来,写了一个demo,放在了Github中,欢迎大家提出意见啊 ^_^

本Demo源地址 请点击这里

下面,我们分别介绍下面的四种应用场景:

  • 简单文字
  • 简单图片
  • 文字和图片
  • 自适应布局

1. 简单文字

首先是最简单的导航栏形式,只显示最简单的文本,点击文本可以自动切换对应的内容,本例是自动展示导航栏的标题描述。

1.1 演示代码

<!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">
	Title1
</div>
<script id="tpl_navigationbar" type="text/x-handlebars-template">
    <div class="navigationbar_list">
    	{{#nav_list nav}}
    		<a rel="nofollow" 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>

1.2 效果图

这里写图片描述

2. 简单图片

本示例也是一种简单的导航栏形式,每个选项卡只显示一张图片,点击不同的导航栏的选项卡,切换不同的内容。

2.1 演示代码

<!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 rel="nofollow" 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>

2.2 效果图

这里写图片描述

3. 文字和图片

本示例是1 和 2 的结合,算是稍微复杂点的导航栏形式;同样点击不同的导航栏的选项卡,切换不同的文字和图片。

3.1 演示代码

<!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=""/>
	Title1
</div>

<script id="tpl_navigationbar" type="text/x-handlebars-template">
    <div class="navigationbar_list">
    	{{#nav_list nav}}
    		<a rel="nofollow" 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>

3.2 效果图

这里写图片描述

4. 自适应布局

本示例是演示自适应布局,能够实现导航栏的自适应大小,不过下划线的适应有些问题,欢迎各位讨论交流~~

4.1 演示代码

<!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">
	Title1
</div>

<script id="tpl_navigationbar" type="text/x-handlebars-template">
    <div class="navigationbar_list">
    	{{#nav_list nav}}
    		<a rel="nofollow" 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>

4.2 效果图

这里写图片描述

5. 核心JS代码

/**
 * 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 );
上一篇:【stm32】基于stm32的蓝牙音响
下一篇:没有了
网友评论