├── example ├── child.wxss ├── index.wxss ├── index.json ├── child.json ├── index.js ├── child.wxml ├── index.wxml └── child.js ├── components └── navigationBar │ ├── index.json │ ├── index.wxml │ ├── index.wxss │ └── index.js ├── assets ├── example1.gif ├── example2.gif ├── example3.gif ├── example4.gif ├── example5.gif ├── example6.gif ├── example7.gif ├── example8.gif └── example9.gif ├── app.js ├── sitemap.json ├── app.wxss ├── app.json ├── CHANGELOG.md ├── project.config.json └── README.md /example/child.wxss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/navigationBar/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "component": true 3 | } -------------------------------------------------------------------------------- /example/index.wxss: -------------------------------------------------------------------------------- 1 | /* src/pages/xml2can/xml2can.wxss */ 2 | 3 | -------------------------------------------------------------------------------- /assets/example1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mulook/weapp-navigation-bar/HEAD/assets/example1.gif -------------------------------------------------------------------------------- /assets/example2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mulook/weapp-navigation-bar/HEAD/assets/example2.gif -------------------------------------------------------------------------------- /assets/example3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mulook/weapp-navigation-bar/HEAD/assets/example3.gif -------------------------------------------------------------------------------- /assets/example4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mulook/weapp-navigation-bar/HEAD/assets/example4.gif -------------------------------------------------------------------------------- /assets/example5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mulook/weapp-navigation-bar/HEAD/assets/example5.gif -------------------------------------------------------------------------------- /assets/example6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mulook/weapp-navigation-bar/HEAD/assets/example6.gif -------------------------------------------------------------------------------- /assets/example7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mulook/weapp-navigation-bar/HEAD/assets/example7.gif -------------------------------------------------------------------------------- /assets/example8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mulook/weapp-navigation-bar/HEAD/assets/example8.gif -------------------------------------------------------------------------------- /assets/example9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mulook/weapp-navigation-bar/HEAD/assets/example9.gif -------------------------------------------------------------------------------- /example/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents":{ 3 | "navigationBar":"/components/navigationBar/index" 4 | } 5 | } -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | //app.js 2 | App({ 3 | onLaunch: function () { 4 | 5 | }, 6 | globalData: { 7 | userInfo: null 8 | } 9 | }) -------------------------------------------------------------------------------- /example/child.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents":{ 3 | "navigationBar":"/components/navigationBar/index" 4 | }, 5 | "disableSwipeBack": true 6 | } -------------------------------------------------------------------------------- /sitemap.json: -------------------------------------------------------------------------------- 1 | { 2 | "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", 3 | "rules": [{ 4 | "action": "allow", 5 | "page": "*" 6 | }] 7 | } -------------------------------------------------------------------------------- /app.wxss: -------------------------------------------------------------------------------- 1 | /**app.wxss**/ 2 | #container { 3 | position: relative; 4 | width: 100%; 5 | min-height: 100vh; 6 | background-color: #ffffff; 7 | display: flex; 8 | flex-direction: column; 9 | justify-content: center; 10 | } -------------------------------------------------------------------------------- /example/index.js: -------------------------------------------------------------------------------- 1 | Page({ 2 | /** 3 | * 页面的初始数据 4 | */ 5 | data: { 6 | title: '标题', 7 | barBg: '#f8f8f8',//#ff6600 8 | color: '#000000'//#ffffff 9 | }, 10 | 11 | /** 12 | * 生命周期函数--监听页面初次渲染完成 13 | */ 14 | onReady: function () { 15 | 16 | }, 17 | shareEnter(){ 18 | wx.reLaunch({url:'/example/child?title=从分享进入'}) 19 | } 20 | }); 21 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages": [ 3 | "example/index", 4 | "example/child" 5 | ], 6 | "window": { 7 | "navigationStyle": "custom", 8 | "backgroundTextStyle": "light", 9 | "navigationBarBackgroundColor": "#fff", 10 | "navigationBarTitleText": "自定义导航栏", 11 | "navigationBarTextStyle": "black" 12 | }, 13 | "debug": true, 14 | "sitemapLocation": "sitemap.json" 15 | } -------------------------------------------------------------------------------- /example/child.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 页面容器 5 | 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # weapp-navigation-bar 2 | ## v1.1.0 3 | 1. 增加normal风格的返回按钮,旧版本的定义为simple风格,支持两种风格切换。 4 | 2. 点击返回按钮和点击首页按钮,支持在外部绑定事件,使用方法,请参考example。[ISSUE #6](https://github.com/mulook/weapp-navigation-bar/issues/6) 5 | ## v1.0.2 6 | 1. 修复安卓系统下,页面滚动指定距离,切换导航栏隐藏不全的问题。[ISSUE #3](https://github.com/mulook/weapp-navigation-bar/issues/3) 7 | ## v1.0.1 8 | 1. 新增支持页面滚动指定距离,切换导航栏的显示或隐藏。[ISSUE #1](https://github.com/mulook/weapp-navigation-bar/issues/1) 9 | ## v1.0.0 10 | 1. 可根据手机状态栏高度适配。 11 | 2. 可自定义设置包括字体颜色、字体大小、背景颜色、无标题、导航栏是否置顶。 12 | 3. 可自动识别是否首页launch。 -------------------------------------------------------------------------------- /project.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "项目配置文件。", 3 | "packOptions": { 4 | "ignore": [] 5 | }, 6 | "setting": { 7 | "urlCheck": false, 8 | "es6": true, 9 | "postcss": true, 10 | "minified": true, 11 | "newFeature": true 12 | }, 13 | "compileType": "miniprogram", 14 | "libVersion": "1.9.95", 15 | "appid": "wx526a786b7e5f0a7c", 16 | "projectname": "%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AF%BC%E8%88%AA%E6%A0%8F", 17 | "isGameTourist": false, 18 | "simulatorType": "wechat", 19 | "simulatorPluginLibVersion": {}, 20 | "condition": { 21 | "search": { 22 | "current": -1, 23 | "list": [] 24 | }, 25 | "conversation": { 26 | "current": -1, 27 | "list": [] 28 | }, 29 | "plugin": { 30 | "current": -1, 31 | "list": [] 32 | }, 33 | "game": { 34 | "currentL": -1, 35 | "list": [] 36 | }, 37 | "miniprogram": { 38 | "current": -1, 39 | "list": [] 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /example/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 页面容器 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /components/navigationBar/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 首页 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | {{title!='none'?title:''}} 14 | 15 | -------------------------------------------------------------------------------- /example/child.js: -------------------------------------------------------------------------------- 1 | Page({ 2 | /** 3 | * 页面的初始数据 4 | */ 5 | data: { 6 | title: '子页面', 7 | barBg: '#f8f8f8',//#ff6600 8 | fixed: true, 9 | color: '#000000',//#ffffff 10 | touchStartY: 0,//触摸开始的Y坐标 11 | toggleBarShow: false, 12 | backStyle: 'normal', 13 | backEvent: false, 14 | backHomeEvent: false 15 | }, 16 | onLoad: function (options) { 17 | console.log(options); 18 | var obj = {}; 19 | console.log(obj); 20 | if(options.title){ 21 | obj.title = options.title 22 | } 23 | if(options.nofixed){ 24 | obj.fixed = false 25 | } 26 | if(options.toggleBarShow){ 27 | obj.toggleBarShow = true; 28 | } 29 | if (options.backStyle) { 30 | obj.backStyle = options.backStyle; 31 | } 32 | if (options.backHomeEvent) { 33 | obj.backHomeEvent = true; 34 | } 35 | if (options.backEvent) { 36 | obj.backEvent = true; 37 | } 38 | this.setData(obj); 39 | }, 40 | /** 41 | * 生命周期函数--监听页面初次渲染完成 42 | */ 43 | onReady: function () { 44 | 45 | }, 46 | touchstart(e) { 47 | // this.data.touchStartY = e.changedTouches[0].clientY; 48 | this.setData({ touchStartY: e.changedTouches[0].clientY }); 49 | }, 50 | touchmove(e) { 51 | if(!this.data.toggleBarShow){ 52 | return; 53 | } 54 | console.log(this.data.touchStartY - e.changedTouches[0].clientY, e.changedTouches[0].clientY); 55 | if ((e.changedTouches[0].clientY - this.data.touchStartY) > 0 && (e.changedTouches[0].clientY - this.data.touchStartY) > 3) {//向上滚动 56 | this.selectComponent("#navigationBar").toggleShow(); 57 | } 58 | if ((e.changedTouches[0].clientY - this.data.touchStartY) < 0 && (this.data.touchStartY - e.changedTouches[0].clientY) > 30) {//向下滚动 59 | this.selectComponent("#navigationBar").toggleHide(); 60 | } 61 | }, 62 | onPageScroll(e){ 63 | // console.log(e.scrollTop, e.scrollTop - this.data.touchStartY); 64 | if (e.scrollTop < 10) {//判断向上滚动顶部 65 | // this.setData({ touchStartY: e.scrollTop }); 66 | this.selectComponent("#navigationBar").toggleShow(); 67 | } 68 | 69 | }, 70 | onShareAppMessage(res){ 71 | return { 72 | title: '分享标题', 73 | path: '/exmaple/child?title=来自分享页' 74 | } 75 | }, 76 | /** 77 | * 返回按钮触发事件 78 | * @param {Object} e 事件对象 79 | */ 80 | backEvent(e){ 81 | // 这里可以写点击返回按钮相关的业务逻辑,下面逻辑提供参考 82 | let self = this; 83 | wx.showModal({ 84 | title: '提示,触发返回按钮事件', 85 | content: '确定要退出当前页面吗?', 86 | success(res) { 87 | res.confirm && self.selectComponent('#navigationBar').runBack();//这里之所以调用了组件内部的返回上一页的方法,因为里面有判断逻辑,不想调用可以自行处理 88 | } 89 | }) 90 | }, 91 | /** 92 | * 返回按钮触发事件 93 | * @param {Object} e 事件对象 94 | */ 95 | backHomeEvent(e) { 96 | // 这里可以写点击返回首页按钮相关的业务逻辑,下面逻辑提供参考 97 | let self = this; 98 | wx.showModal({ 99 | title: '提示,触发返回首页按钮事件', 100 | content: '确定要退出当前页面吗?', 101 | success(res) { 102 | res.confirm && self.selectComponent('#navigationBar').runBackHome();//这里之所以调用了组件内部的返回首页的方法,因为里面有判断逻辑,不想调用可以自行处理 103 | } 104 | }) 105 | } 106 | }); 107 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # weapp-navigation-bar 2 | 3 | 因为小程序原生导航栏的一些限制,比如:不能设置字体大小,ios标题居中而安卓居左,从非首页启动小程序返回首页菜单不明显,屏幕空间不能最大化使用。因此微信开放了小程序自定义导航栏,允许用户最大化的使用屏幕空间。但是自定导航栏不支持只指定某些页面使用,而是全局的,所以也带来了一些适配问题。 4 | ## 本导航栏组件支持 5 | 1. 可根据手机状态栏高度适配。 6 | 2. 可自定义设置包括字体颜色、字体大小、背景颜色、无标题、导航栏是否置顶。 7 | 3. 可自动识别是否首页launch。 8 | 4. 更多请[查看组件更新内容](https://github.com/mulook/weapp-navigation-bar/blob/master/CHANGELOG.md) 9 | 10 | ## 演示 11 | 1 自定义导航栏 12 | 13 | 14 | 15 | 16 | 2 模拟非首页启动小程序 17 | 18 | 19 | 20 | 3 设置导航栏跟随页面滚动 21 | 22 | 23 | 24 | 4 页面上下滚动指定像素值,切换导航栏的显示或隐藏 25 | 26 | 27 | 28 | 5 绑定返回按钮事件 29 | 30 | 31 | 6 绑定返回首页按钮事件 32 | 33 | 34 | 35 | ## 使用说明 36 | 使用前需要了解[小程序自定义组件](https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/)和[自定义导航栏](https://developers.weixin.qq.com/miniprogram/dev/framework/config.html#window)。 37 | app.json配置以下属性 38 | ``` json 39 | "window":{ 40 | "navigationStyle": "custom", 41 | "backgroundTextStyle":"light", 42 | "navigationBarBackgroundColor": "#fff", 43 | "navigationBarTitleText": "自定义导航栏", 44 | "navigationBarTextStyle":"white" 45 | } 46 | ``` 47 | 如果已了解,可直接把组件拷贝到项目里引用,用法可参考example。 48 | > 额外说明:小程序右上角胶囊颜色,可通过navigationBarTextStyle设置,支持black和white。 49 | > 为了提高兼容性,建议把所有页面内容写在设置的页面容器里,参考example。 50 | ## 组件内部自定义方法 51 | > toggleShow()/toggleHide()用于切换自定义导航栏的显示/隐藏。 52 | ## 组件自定义属性说明 53 | | 属性 | 说明 | 类型 | 默认值 | 54 | | ------------- | --------------------------- | ------- | ----------- | 55 | | title | 标题 | String | none | 56 | | color | 标题字体颜色 | String | #000000 | 57 | | fontSize | 导航栏字体大小,单位rpx、px | String | 16px | 58 | | background | 导航栏背景颜色 | String | #ffffff | 59 | | placeholderBg | 导航栏占位栏背景色 | String | transparent | 60 | | back | 是否显示导航栏返回按钮 | Boolean | false | 61 | | fixed | 导航栏是否fixed定位置顶 | Boolean | true | 62 | | backStyle | 导航栏返回按钮的风格支持simple和normal| String | normal | 63 | | backEvent | 是否绑定返回按钮事件 | Boolean | false | 64 | | backHomeEvent | 是否绑定返回首页按钮事件 | Boolean | false | 65 | ## 组件外部绑定事件说明 66 | > 绑定事件前,先打开事件监听属性backEvent="{{true}}",然后使用bind:事件名="callback"来绑定回调函数 67 | 68 | | 事件名 | 说明 | 事件是否冒泡 | 事件是否拥有捕获阶段 | 69 | | ------------- | --------------------------- | ------- | ----------- | 70 | | back | 返回按钮被点击 | 否 | 否 | 71 | | backHome | 返回首页按钮被点击 | 否 | 否 | 72 | 73 | >绑定事件参考 74 | 75 | >wxml 76 | ``` html 77 | 78 | ``` 79 | >js 80 | ``` js 81 | Page({ 82 | /** 83 | * 返回按钮触发事件 84 | * @param {Object} e 事件对象 85 | */ 86 | backEvent(e){ 87 | // 这里可以写点击返回按钮相关的业务逻辑,下面逻辑提供参考 88 | let self = this; 89 | wx.showModal({ 90 | title: '提示,触发返回按钮事件', 91 | content: '确定要退出当前页面吗?', 92 | success(res) { 93 | res.confirm && self.selectComponent('#navigationBar').runBack();//这里之所以调用了组件内部的返回上一页的方法,因为里面有判断逻辑,不想调用可以自行处理 94 | } 95 | }) 96 | }, 97 | /** 98 | * 返回按钮触发事件 99 | * @param {Object} e 事件对象 100 | */ 101 | backHomeEvent(e) { 102 | // 这里可以写点击返回首页按钮相关的业务逻辑,下面逻辑提供参考 103 | let self = this; 104 | wx.showModal({ 105 | title: '提示,触发返回首页按钮事件', 106 | content: '确定要退出当前页面吗?', 107 | success(res) { 108 | res.confirm && self.selectComponent('#navigationBar').runBackHome();//这里之所以调用了组件内部的返回首页的方法,因为里面有判断逻辑,不想调用可以自行处理 109 | } 110 | }) 111 | } 112 | }); 113 | 114 | ``` 115 | -------------------------------------------------------------------------------- /components/navigationBar/index.wxss: -------------------------------------------------------------------------------- 1 | .navigation-bar{ 2 | position: relative; 3 | left: 0; 4 | top: 0; 5 | width: 750rpx; 6 | color: #ffffff; 7 | background: #45b9e5; 8 | z-index: 99; 9 | text-align: center; 10 | transition: 300ms; 11 | } 12 | .back{ 13 | position: absolute; 14 | left: 0; 15 | top: 0; 16 | min-width: 70rpx; 17 | display: flex; 18 | justify-content: flex-start; 19 | align-items: center; 20 | } 21 | .icon{ 22 | display: inline-block; 23 | font-family: 'iconfont' !important; 24 | speak: none; 25 | font-style: normal; 26 | font-weight: bold; 27 | font-variant: normal; 28 | text-transform: none; 29 | text-rendering: auto; 30 | -webkit-font-smoothing: antialiased; 31 | -moz-osx-font-smoothing: grayscale; 32 | vertical-align: middle; 33 | font-size: 38rpx; 34 | } 35 | .style-simple{ 36 | display: flex; 37 | margin-left: 16rpx; 38 | align-items: center; 39 | } 40 | .style-simple .icon-fanhui:before { content: "\e624";} 41 | .style-simple .back-home{ 42 | width: auto; 43 | text-align: center; 44 | font-size: 30rpx; 45 | } 46 | .black{ 47 | background: #ffffff; 48 | border-color:#e5e5e5 !important; 49 | } 50 | .white{ 51 | background: rgba(0, 0, 0, 0.15); 52 | border-color: rgba(255, 255, 255, 0.25) !important; 53 | } 54 | .style-normal{ 55 | border: 1rpx solid #ededed; 56 | border-radius: 32rpx; 57 | height: 64rpx; 58 | width: 176rpx; 59 | display: flex; 60 | margin-left: 16rpx; 61 | align-items: center; 62 | } 63 | .style-normal .icon-fanhui{ 64 | line-height: 64rpx; 65 | width: 87rpx; 66 | font-size: 44rpx; 67 | } 68 | .style-normal .icon-fanhui:before { content: "\e7eb";} 69 | .style-normal .back-home{ 70 | width: 87rpx; 71 | text-align: center; 72 | font-size: 44rpx; 73 | } 74 | .style-normal .back-home:before { content: "\e7c6";} 75 | .style-normal .split{ 76 | border-left: 1rpx solid #e5e5e5; 77 | height: 32rpx; 78 | width: 1rpx; 79 | } 80 | .title{ 81 | font-weight: bold; 82 | } 83 | .navigation-bar-holder{ 84 | background: transparent; 85 | position: relative; 86 | z-index: 2; 87 | } 88 | @font-face { 89 | font-family: 'iconfont'; 90 | src: url(data:application/font-woff2;charset=utf-8;base64,d09GMgABAAAAAAOgAA0AAAAAB4QAAANLAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP0ZGVE0cGh4GVgCCYhEICoQsgzgLEAABNgIkAxYEIAWDDwdIGxgGUVRQUsg+EqrbejExJkZMFIeJQzwIETcn38XD0/74zp2Zhw8tgOhMpk0/L0N1dVPfbWBIanLaRuX3Y93by6CYlCumkE/QyZz9NZPCx8HSPnVP5sEtOYOzmAJ6qZ8/kLIogQKLKHqeZ8PnxwU20OFUh7wBdybxpIadEPDq0kITwLuhLyu5SyP0YwKQhFALBQlRxD8i6WJ6CJwFsuMrvzAlqTMOhgFb2bUnuhTgw7yPrzPtqNFMHUMAMjKmQWAULzCNYBXQr5UUub2MfLz48WvX4Xp38vtZhyZFzZoLCISKmoAlEpKfJwCbja6TQAMGUeMKngJQABBCFnNXTxOmVMzoLFWWA10xvUxV8biu64jNKNc0DbGZMmXRpDGlM+nhQ63H/fv0wQM8/ihD12YkaMo0RSH2230/7vJYwsabrid99zK/ZefcTiVeG4+/EqFOT1IUNDBN1VEGm6Z0lrtqqY3SzUBV4UAYc5Y8Ht80cxsrlRDO4CTEtkrS2GYAKUuyS1krYtoYZVbo9DJVR+2RZB3q617Seuzc4jPmlreXnDhsu14UlfJ4EbfaPtaBMwQsHz9rl0A+9z8W90Pw812doQnb00oaTtfWnX5Ve/pMXcPQoyVu7VMcSD9J5tC0adyK/PwnvyZ+PS9t/bdi18SumzEt/6+gL/Dk/btbJxXOFv1n7XT1Ti1wu/f4LAibPczYkrTPf9OWLbOda+x58MTmC3db1w13YtzM20amBExk1F2ve9Ies3TSes/Iarnn5NINhfV15dlZcO/ydt6/trlbcJgcRi2+/eJ2k1R5FvHV1nY8gECwZGHjwQLL8P8tLgbtvLCO5geZopVAMNA8F4D8oJtrpTD+BQp/lQvzA0JjNR4khMAqAOh3ToDQGgOBpLYYAtk8HRAoWjcFqPR5DoFa6xdelB5hGJCQ9JsK2SbeUAxbBZUJjlbVhr1kUKJWjXJObgKjLDkL1AFsV6aUQbNq8C80DWBDGlL/5AayMoQvT96IUKQsOmSMr0AeAnjw5c1HCHhpisspDXIZ8fX0JqGkTsLSfQM9Ajw2I7ahachuo0EjQ7BC+LSAhwOjex9P76xO0mg2t0FIkSJHiareU1SzqNlgtDQywjLBCLMCAA==) format('woff2'), 91 | url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAWoAA0AAAAAB4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAFjAAAABoAAAAch8QPdUdERUYAAAVwAAAAHAAAAB4AJwANT1MvMgAAAaAAAABGAAAAVjz3Wr5jbWFwAAACAAAAAFAAAAFizgvTb2dhc3AAAAVoAAAACAAAAAj//wADZ2x5ZgAAAmAAAAHwAAACLBoXztpoZWFkAAABMAAAADAAAAA2FT8saWhoZWEAAAFgAAAAHQAAACQHowOFaG10eAAAAegAAAAVAAAAFg1eAS5sb2NhAAACUAAAABAAAAAQASYBtG1heHAAAAGAAAAAHgAAACAATABEbmFtZQAABFAAAADhAAABj76Bsdhwb3N0AAAFNAAAADQAAABIIIgIznjaY2BkYGAAYkf1Evl4fpuvDNwsDCBwk/+LGZy2/t/AfJS5AcjlYGACiQIAARIJ33jaY2BkYGBu+N/AEMPCAALMRxkYGVABCwBVlQMxAAAAeNpjYGRgYGBncGRgZgABJiBmZACJOYD5DAAJlACRAAB42mNgZGFg/MLAysDANJPpDAMDQz+EZnzNYMzICRRlYGNmgAMBBJMhIM01hYHhmcrz18wN/xsYYpgbGBqAwowgOQAVMQ1CAAB42mNhgAAWCP7MkMZgzfADAAsaApkAAAB42mNgYGBmgGAZBkYGEIgB8hjBfBYGByDNw8DBwARkMzxTed7x/Njz1///g5Qh8yTvS9RI2EtIQ02AA0Y2BrgQIxOQYGJAU8Aw7AEAK6wTDwAAAAAAAAAAADoAngDsARZ42iWRv2tTURTH7/ee+yMvL7+eTfLSBFP7ogmYmsQ2yVPSPIJIHaSri0MFRRyTOAgdpDjoortkylRcpCBdLChE0ckxg4hj/QscFIQbb5QD93A453zPuZ/DwH4uDvgvOmABYw5SyGXzPsrY2ox4p11Dw74hInTa1Uqg+GdzPZ5MxfGeXCnjWsbMNS64xjuSGVcm6JHZdoJkej1ubpCUOi7dGN5yrYX1H4Ur3YxkDOz+4jtN6Dwb2EA3UAlSyC5ndsNutYmq0imuU9AqqDVQq9aq7TBCaJObft6aTeXXkO92wrZW9OJK7/Xd8Ww0/DB++nWDE10lBXCO4l40eD4oh4VWsVRKXii0+jaMmunkNkHQkVBwiB9t3Lw1nP2YjSb7ti0LIi4lRXv/W5pLhbXQXyoUW+lMkyuJOqQ4jnMwYr3FnD7RJVZia+zykp/dV2moXLYse/DWvX9faqPS2Qq9imVYR6DOouJV4IPemMdFlckoc2+FtOMmU7GL/LieLDhnzMPh8NvE96aeP7mDsY/beIYnRSXEsrik0wnXUWROsOM4Kx3z6su+OTn1fN87xQ5Gvjm0jH8zwef8D8tZxnZyYNfK+pZaH+2ag4jzubAS/UTCHsZR5iUecAI/3CXJzdQ555gpCbkbk1jFKheCsb+JB2eOeNp9jj9uwjAUh79AiFq1Q9WhSxcPLB0SJZZAggOgLl25AASUobEUysJBWHsGVo7BAThDj8DP9HXpgCXbn5+/9wd4ZE9CXAl3PBv3yHgz7jNkZ5zKORgPeOBknCn+IzNJ7xV5umZF7qn+q3Gfd0rjVM638YAXjsaZ4mcaFgRaVtfzC5pFaFehFX1Qs5Sw5VOPetlsdc/Mi3fHWorDU6ibY6r9v95v1DMmZ6TtZVZMVEg9ZqFb184XpZu6v75CP85HuS8rWTfGm6t3x0ZK/HKqGqdgXnebJrSuKspb6Rdv+jyYAAAAeNpjYGJABowM6IAdLMrEyMTIzMjCyMqWlpiXUZrJVpSak5+YwpKRn5vKkpOaVgIAamYIegAAAAH//wACeNpjYGRgYOABYjEgZmJgBEI2IGYB8xgAA+AANXjaY2BgYGQAgqtL1DlA9E3+L2YwGgA8OQXOAAA=) format('woff'); 92 | font-weight: 500; 93 | font-style: normal; 94 | } 95 | 96 | -------------------------------------------------------------------------------- /components/navigationBar/index.js: -------------------------------------------------------------------------------- 1 | Component({ 2 | properties: { 3 | // 这里定义属性,属性值可以在组件使用时指定 4 | back: {//是否显示返回 5 | type: Boolean, 6 | value: false, 7 | }, 8 | background: {//导航栏背景色 9 | type: String, 10 | value: '#ffffff',//默认 11 | observer: function(newVal,oldVal,changedPath){ 12 | if(!newVal){ 13 | let obj = {}; 14 | obj[changedPath[0]] = oldVal; 15 | this.setData(obj); 16 | } 17 | } 18 | }, 19 | placeholderBg: {//导航栏占位栏背景色 20 | type: String, 21 | value: 'transparent',//默认 22 | observer: function(newVal,oldVal,changedPath){ 23 | if(!newVal){ 24 | let obj = {}; 25 | obj[changedPath[0]] = oldVal; 26 | this.setData(obj); 27 | } 28 | } 29 | }, 30 | color: {//导航栏字体色 31 | type: String, 32 | value: '#000000',//默认 33 | observer: function(newVal,oldVal,changedPath){ 34 | if(!newVal){ 35 | let obj = {}; 36 | obj[changedPath[0]] = oldVal; 37 | this.setData(obj); 38 | } 39 | } 40 | }, 41 | fontSize: {//导航栏字大小 42 | type: String, 43 | value: '16px',//默认 44 | observer: function(newVal,oldVal,changedPath){ 45 | if(!newVal){ 46 | let obj = {}; 47 | obj[changedPath[0]] = oldVal; 48 | this.setData(obj); 49 | } 50 | } 51 | }, 52 | title: {//导航栏标题 53 | type: String, 54 | value: 'none', //默认 55 | observer: function(newVal,oldVal,changedPath){ 56 | // console.log(newVal,oldVal,changedPath); 57 | if(!newVal){ 58 | let obj = {}; 59 | obj[changedPath[0]] = oldVal; 60 | this.setData(obj); 61 | } 62 | } 63 | }, 64 | fixed: {//导航栏是否fixed定位 65 | type: Boolean, 66 | value: true, //默认 67 | observer: function(newVal,oldVal,changedPath){ 68 | // console.log(newVal,oldVal,changedPath); 69 | if(newVal !== false && newVal !== true){ 70 | let obj = {}; 71 | obj[changedPath[0]] = oldVal; 72 | this.setData(obj); 73 | } 74 | } 75 | }, 76 | backStyle: {//导航栏返回按钮的风格 77 | type: String, 78 | value: 'normal', //默认值 可赋值simple或者normal 79 | observer: function (newVal, oldVal, changedPath) { 80 | // console.log(newVal,oldVal,changedPath); 81 | if (!newVal) { 82 | let obj = {}; 83 | obj[changedPath[0]] = oldVal; 84 | this.setData(obj); 85 | } 86 | } 87 | }, 88 | backEvent: {//是否绑定返回按钮事件 89 | type: Boolean, 90 | value: false, //默认 91 | observer: function (newVal, oldVal, changedPath) { 92 | // console.log(newVal,oldVal,changedPath); 93 | if (newVal !== false && newVal !== true) { 94 | let obj = {}; 95 | obj[changedPath[0]] = oldVal; 96 | this.setData(obj); 97 | } 98 | } 99 | }, 100 | backHomeEvent: {//是否绑定返回首页按钮事件 101 | type: Boolean, 102 | value: false, //默认 103 | observer: function (newVal, oldVal, changedPath) { 104 | // console.log(newVal,oldVal,changedPath); 105 | if (newVal !== false && newVal !== true) { 106 | let obj = {}; 107 | obj[changedPath[0]] = oldVal; 108 | this.setData(obj); 109 | } 110 | } 111 | }, 112 | }, 113 | data: { 114 | // 这里是一些组件内部数据 115 | height: 44,//导航栏高度, 116 | paddingTop: 20,//导航栏上内边距对应状态栏高度 117 | showHomeButton: false,//是否显示返回首页 118 | show: true,//是否显示导航栏 119 | navigationBarTextStyle: 'black' 120 | }, 121 | attached: function(option){ 122 | //检测首页是否在当前页面栈中 123 | let pages = getCurrentPages(); 124 | let showHomeButton = false; 125 | if(pages.length < 2 && pages[0].route != __wxConfig.pages[0]){ 126 | showHomeButton = true; 127 | } 128 | //导航栏自适应 129 | let systemInfo = wx.getSystemInfoSync(); 130 | let reg = /ios/i; 131 | let pt = 20;//导航状态栏上内边距 132 | let h = 44;//导航状态栏高度 133 | if(reg.test(systemInfo.system)){ 134 | pt = systemInfo.statusBarHeight; 135 | h = 44; 136 | }else{ 137 | pt = systemInfo.statusBarHeight; 138 | h = 48; 139 | } 140 | var navigationBarTextStyle = __wxConfig.global.window.navigationBarTextStyle;//获取当前项目导航栏文本风格 141 | this.setData({ 142 | height: h, 143 | paddingTop: pt, 144 | showHomeButton: showHomeButton, 145 | navigationBarTextStyle: navigationBarTextStyle 146 | }) 147 | console.log(this); 148 | }, 149 | methods: { 150 | // 这里是一个自定义方法 151 | /** 152 | * 返回上一页 153 | */ 154 | navigateBack(){ 155 | if (!this.properties.backEvent){ 156 | this.runBack(); 157 | return; 158 | } 159 | this.triggerEvent('back'); 160 | }, 161 | runBack(){ 162 | let pages = getCurrentPages(); 163 | if (pages.length < 2 && pages[0].route != __wxConfig.pages[0]) { 164 | wx.reLaunch({ url: '/' + __wxConfig.pages[0] }) 165 | } else { 166 | wx.navigateBack({ delta: 1 }); 167 | } 168 | }, 169 | /** 170 | * 返回首页 171 | */ 172 | navigateBackHome(){ 173 | if (!this.properties.backHomeEvent) { 174 | this.runBackHome(); 175 | return; 176 | } 177 | this.triggerEvent('backHome'); 178 | }, 179 | runBackHome() { 180 | let pages = getCurrentPages(); 181 | if (pages[0].route === __wxConfig.pages[0]) { 182 | wx.navigateBack({ delta: 10 }); 183 | } else { 184 | wx.reLaunch({ url: '/' + __wxConfig.pages[0] }) 185 | } 186 | }, 187 | /** 188 | * 切换导航栏显示 189 | */ 190 | toggleShow(){ 191 | if(!this.data.show){ 192 | this.setData({ show: true }); 193 | } 194 | }, 195 | /** 196 | * 切换导航栏隐藏 197 | */ 198 | toggleHide() { 199 | if (this.data.show) { 200 | this.setData({ show: false }); 201 | } 202 | } 203 | } 204 | }) --------------------------------------------------------------------------------