微信小程序自定義導(dǎo)航欄功能的實(shí)現(xiàn)
前言
導(dǎo)航欄是指位于頁(yè)面頂部或者側(cè)邊區(qū)域的,在頁(yè)眉橫幅圖片上邊或下邊的一排水平導(dǎo)航按鈕,它起著鏈接站點(diǎn)或者軟件內(nèi)的各個(gè)頁(yè)面的作用。
小程序原生導(dǎo)航欄的限制
- 除了膠囊按鈕以外,原生導(dǎo)航欄只會(huì)出現(xiàn)返回按鈕和當(dāng)用戶(hù)打開(kāi)的小程序最底層頁(yè)面是非首頁(yè)時(shí),默認(rèn)展示的“返回首頁(yè)”按鈕 。
- 原生導(dǎo)航欄的標(biāo)題文字的顏色只有黑白。
- 布局無(wú)法改變,不能做定制。
在做自定義導(dǎo)航欄欄之前得去掉原生導(dǎo)航欄,去掉方法如下:
- 將需要自定義navigationBar頁(yè)面的page.json的navigationBarTitleText去掉。
- 加上"navigationStyle":“custom”,這樣原生的導(dǎo)航欄就已經(jīng)消失,甚至后退鍵也不會(huì)出現(xiàn)需要自定義。
一、自定義導(dǎo)航欄功能的實(shí)現(xiàn)
1.組件的封裝
"use strict";
var app = getApp();
Component({
options: {
// 多插槽支持
multipleSlots: true
// ,addGlobalClass: true
},
properties: {
'ext-class': {
type: String,
value: ''
},
loading: {
type: Boolean,
value: false
},
active: {
type: Boolean,
value: false
// ,observer: '_showChange'
}
},
data: {},
attached: function attached() {
// 組件被加載時(shí),計(jì)算ios、android兩個(gè)平臺(tái)的尺寸差異
var _this = this;
//動(dòng)態(tài)計(jì)算導(dǎo)航欄尺寸
var isSupport = !!wx.getMenuButtonBoundingClientRect;
var rect = wx.getMenuButtonBoundingClientRect ? wx.getMenuButtonBoundingClientRect() : null;
wx.getSystemInfo({
success: function success(res) {
var ios = !!(res.system.toLowerCase().search('ios') + 1);
var statusBarHeight=res.statusBarHeight;
var topBarHeight=ios ? (44 + statusBarHeight) : (48 + statusBarHeight);
_this.setData({
ios: ios,
topBarHeight:topBarHeight,
statusBarHeight:statusBarHeight,
innerWidth: isSupport ? 'width:' + rect.left + 'px' : '',
innerPaddingRight: isSupport ? 'padding-right:' + (res.windowWidth - rect.left) + 'px' : '',
leftWidth: isSupport ? 'width:' + (res.windowWidth - rect.left) + 'px' : ''
});
// 這是為了在外面注入wxss變量,這個(gè)設(shè)計(jì)并不太好
// _this.triggerEvent('getBarInfo', {topBarHeight,statusBarHeight});
}
});
//back箭頭處理的顯示
var pages=getCurrentPages()
if(pages.length>1){
this.setData({showBack:true})
}
},
methods: {
// _showChange: function _showChange(active) {
// var displayStyle = 'opacity: ' + (active ? '1' : '0') + ';-webkit-transition:opacity 0.5s;transition:opacity 0.5s;';
// this.setData({
// displayStyle: displayStyle
// });
// },
//雙擊返回頂部
doubleClick(e) {
if (this.timeStamp && (e.timeStamp - this.timeStamp < 300)) {
this.timeStamp = 0
wx.pageScrollTo({
scrollTop: 0,
duration: 300
})
} else {
this.timeStamp = e.timeStamp
}
}
}
});{
"styleIsolation": "apply-shared",
"component": true,
"usingComponents": {}
}<view class="weui-navigation-bar {{ext-class}}" bindtouchstart="doubleClick">
<!-- 標(biāo)題欄 -->
<view class="{{active ? 'navigator-active' : 'navigator-normal'}} weui-navigation-bar__inner {{ios ? 'ios' : 'android'}}" style="padding-top: {{statusBarHeight}}px;{{innerPaddingRight}};{{innerWidth}};">
<view class='weui-navigation-bar__left' style="{{leftWidth}}">
<slot name="left"></slot>
</view>
<view class='weui-navigation-bar__center'>
<view wx:if="{{loading}}" class="weui-navigation-bar__loading"></view>
<block wx:if="{{active}}">
<slot name="center"></slot>
</block>
</view>
</view>
</view>/* 微信小程序wxss中使用var變量 */
page {
--height: 44px;
--right: 190rpx;
}
.weui-navigation-bar {
overflow: hidden
}
/*
ios、android兩個(gè)平臺(tái)導(dǎo)航欄的高度不一樣
ios 44px
android 48px
*/
.weui-navigation-bar .android {
--height: 48px;
--right: 222rpx
}
.weui-navigation-bar__placeholder {
height: var(--height);
background: #F8F8F8;
position: relative;
z-index: 50
}
.weui-navigation-bar__inner {
position: fixed;
top: 0;
left: 0;
z-index: 5001;
height: var(--height);
display: flex;
align-items: center;
padding-right: var(--right);
width: calc(100% - var(--right))
}
.weui-navigation-bar__inner.navigation-bar-border {
/* border-bottom: 2rpx solid #ddd; */
}
.weui-navigation-bar__inner .weui-navigation-bar__left {
position: relative;
width: var(--right);
padding-left: 15px;
box-sizing: border-box;
display: -webkit-box;
display: -webkit-flex;
display: flex;
align-items: center;
-webkit-box-pack: center;
}
.weui-navigation-bar__inner .weui-navigation-bar__left .btn-back {
width: 12px;
height: 24px;
}
.weui-navigation-bar__inner .weui-navigation-bar__left .btn-back image {
width: 100%;
height: 100%;
}
.weui-navigation-bar__left .btn-home {
width: 20px;
height: 20px;
}
.weui-navigation-bar__left .btn-back+.btn-home {
margin-left: 50rpx;
}
.weui-navigation-bar__left .btn-home image {
width: 100%;
height: 100%;
}
.weui-navigation-bar__inner .weui-navigation-bar__left .weui-navigation-bar__btn_goback:active {
opacity: .5
}
.weui-navigation-bar__inner .weui-navigation-bar__center {
font-size: 17px;
text-align: center;
position: relative;
flex: 1;
display: -webkit-box;
display: -webkit-flex;
display: flex;
align-items: center;
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center;
overflow: hidden;
}
.weui-navigation-bar__center text {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-top: -2px;
}
.weui-navigation-bar__inner .weui-navigation-bar__loading {
width: 20px;
height: 20px;
margin-right: 5px;
content: " ";
animation: loading-animate 1s steps(12, end) infinite;
background: transparent url(data:image/svg+xml;base64,PHN2ZyBjbGFzcz0iciIgd2lkdGg9JzEyMHB4JyBoZWlnaHQ9JzEyMHB4JyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj4KICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIiBmaWxsPSJub25lIiBjbGFzcz0iYmsiPjwvcmVjdD4KICAgIDxyZWN0IHg9JzQ2LjUnIHk9JzQwJyB3aWR0aD0nNycgaGVpZ2h0PScyMCcgcng9JzUnIHJ5PSc1JyBmaWxsPScjRTlFOUU5JwogICAgICAgICAgdHJhbnNmb3JtPSdyb3RhdGUoMCA1MCA1MCkgdHJhbnNsYXRlKDAgLTMwKSc+CiAgICA8L3JlY3Q+CiAgICA8cmVjdCB4PSc0Ni41JyB5PSc0MCcgd2lkdGg9JzcnIGhlaWdodD0nMjAnIHJ4PSc1JyByeT0nNScgZmlsbD0nIzk4OTY5NycKICAgICAgICAgIHRyYW5zZm9ybT0ncm90YXRlKDMwIDUwIDUwKSB0cmFuc2xhdGUoMCAtMzApJz4KICAgICAgICAgICAgICAgICByZXBlYXRDb3VudD0naW5kZWZpbml0ZScvPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyM5Qjk5OUEnCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSg2MCA1MCA1MCkgdHJhbnNsYXRlKDAgLTMwKSc+CiAgICAgICAgICAgICAgICAgcmVwZWF0Q291bnQ9J2luZGVmaW5pdGUnLz4KICAgIDwvcmVjdD4KICAgIDxyZWN0IHg9JzQ2LjUnIHk9JzQwJyB3aWR0aD0nNycgaGVpZ2h0PScyMCcgcng9JzUnIHJ5PSc1JyBmaWxsPScjQTNBMUEyJwogICAgICAgICAgdHJhbnNmb3JtPSdyb3RhdGUoOTAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNBQkE5QUEnCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgxMjAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNCMkIyQjInCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgxNTAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNCQUI4QjknCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgxODAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNDMkMwQzEnCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgyMTAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNDQkNCQ0InCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgyNDAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNEMkQyRDInCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgyNzAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNEQURBREEnCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgzMDAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0PgogICAgPHJlY3QgeD0nNDYuNScgeT0nNDAnIHdpZHRoPSc3JyBoZWlnaHQ9JzIwJyByeD0nNScgcnk9JzUnIGZpbGw9JyNFMkUyRTInCiAgICAgICAgICB0cmFuc2Zvcm09J3JvdGF0ZSgzMzAgNTAgNTApIHRyYW5zbGF0ZSgwIC0zMCknPgogICAgPC9yZWN0Pgo8L3N2Zz4=) no-repeat;
background-size: 100%;
}
@keyframes loading-animate {
0% {
transform: rotate3d(0, 0, 1, 0deg);
}
100% {
transform: rotate3d(0, 0, 1, 360deg);
}
}
/* 激活顯示的狀態(tài), 非透明,有背景色 */
.navigator-active {
-webkit-transition: opacity 0.5s;
transition: opacity 0.5s;
background: #FFF;
color: #3c3c3c;
}
.navigator-normal {
-webkit-transition: opacity 0.5s;
transition: opacity 0.5s;
background: transparent;
color: white;
}2.使用
<navigation-bar
ext-class="page-navigator-bar"
active="{{active}}"
loading="{{loading}}">
<view class="left" slot="left">
<icon bindtap="goBack" class="iconfont icon-back"></icon>
<icon bindtap="goHome" class="iconfont icon-home"></icon>
</view>
<view slot="center">
<view>自定義導(dǎo)航標(biāo)題</view>
</view>
</navigation-bar>Page({
data: {
loading: false,
active: true
},
//點(diǎn)擊back事件處理
goBack: function () {
wx.navigateBack();
this.triggerEvent('back');
},
//返回首頁(yè)
goHome:function(){
wx.reLaunch({
url: '/pages/index/index'
})
},
})@font-face {
font-family: 'iconfont'; /* project id 1716930 */
src: url('//at.alicdn.com/t/font_1716930_0fs7vun2ngmn.eot');
src: url('//at.alicdn.com/t/font_1716930_0fs7vun2ngmn.eot?#iefix') format('embedded-opentype'),
url('//at.alicdn.com/t/font_1716930_0fs7vun2ngmn.woff2') format('woff2'),
url('//at.alicdn.com/t/font_1716930_0fs7vun2ngmn.woff') format('woff'),
url('//at.alicdn.com/t/font_1716930_0fs7vun2ngmn.ttf') format('truetype'),
url('//at.alicdn.com/t/font_1716930_0fs7vun2ngmn.svg#iconfont') format('svg');
}
.iconfont{
font-family: 'iconfont';
}
.icon-back::after{
content: '\e604';
font-size: 22px;
}
.icon-home::after{
content: '\e6f3';
font-size: 22px;
}
.left icon:last-child{
padding-left: 20rpx;
}
.page-navigator-bar .navigator-normal .icon-back{
color: white;
}
.page-navigator-bar .navigator-normal .icon-home{
color: white;
}
.page-navigator-bar .navigator-active .icon-back{
color: black;
}
.page-navigator-bar .navigator-active .icon-home{
color: black;
}
到此這篇關(guān)于微信小程序自定義導(dǎo)航欄功能的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)微信小程序自定義導(dǎo)航欄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 微信小程序自定義頂部導(dǎo)航欄并適配不同機(jī)型實(shí)例詳解
- 微信小程序動(dòng)態(tài)設(shè)置導(dǎo)航欄標(biāo)題的實(shí)現(xiàn)步驟
- 小程序自定義tabbar導(dǎo)航欄及動(dòng)態(tài)控制tabbar功能實(shí)現(xiàn)方法(uniapp)
- 微信小程序使用uni-app實(shí)現(xiàn)首頁(yè)搜索框?qū)Ш綑诠δ茉斀?/a>
- uniapp小程序配置tabbar底部導(dǎo)航欄實(shí)戰(zhàn)指南
- 微信小程序自定義漸變的tabbar導(dǎo)航欄功能
- uniapp開(kāi)發(fā)微信小程序自定義頂部導(dǎo)航欄功能實(shí)例
- 微信小程序?qū)崿F(xiàn)側(cè)邊導(dǎo)航欄
- uniapp微信小程序自定義導(dǎo)航欄的全過(guò)程
- 微信小程序?qū)崿F(xiàn)自定義導(dǎo)航欄
相關(guān)文章
基于bootstrap的文件上傳控件bootstrap fileinput
這篇文章主要為大家詳細(xì)介紹了基于bootstrap的文件上傳控件bootstrap fileinput,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
JavaScript自定義Webpack配置實(shí)現(xiàn)流程介紹
本系列主要整理前端面試中需要掌握的知識(shí)點(diǎn)。本節(jié)介紹webpack如何優(yōu)化前端性能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-10-10
js,jQuery 排序的實(shí)現(xiàn)代碼,網(wǎng)頁(yè)標(biāo)簽排序的實(shí)現(xiàn),標(biāo)簽排序
js,jQuery 排序的實(shí)現(xiàn),網(wǎng)頁(yè)標(biāo)簽排序的實(shí)現(xiàn),標(biāo)簽排序,需要的朋友可以參考下。2011-04-04
javascript支持firefox,ie7頁(yè)面布局拖拽效果代碼
javascript 拖拽 頁(yè)面拖拽 拖拽效果的頁(yè)面 超級(jí)拖拽 javascript支持firefox,ie7頁(yè)面布局拖拽效果代碼 鼠標(biāo)拖拽2007-12-12

