【微信小程序】自定义导航栏
0.背景
最近在写一个微信小程序,然后就是想要修改顶部导航栏,通过阅读微信官方文档发现,可以进行自定义导航栏,具体可见:全局配置 | 微信开放文档 (qq.com)。
1.创建步骤
1.1 开启自定义导航栏配置
首先通过阅读文档发现,如果想要自定义导航栏的话,需要修改一个配置navigationStyle。导航栏样式,仅支持以下值:
default
默认样式
custom
自定义导航栏,只保留右上角胶囊按钮。
然后我们就在app.json中添加上此配置:
{
"pages": [],
"window": {
"navigationStyle": "custom"
},
}
注意:我们在全局的app.json配置也就意味着所有页面的导航栏都需要自定义指定。开启了此配置也就意味着页面时全屏模式!
1.2 导航栏高度
因为不同型号的设备的屏幕大小不同,那么也就意味着我们的导航栏需要进行适配。我们可以通过wx.getSystemInfo 和 wx.getSystemInfoSync
获取机器信息,进而可以获取设备的屏幕信息。screenHeight - windowHeight 计算标题栏高度。
wx.getSystemInfoSync().statusBarHeight // 获取手机状态栏高度
1.3 编写comment
这里app.json配置影响的全局配置,所以其他页面都成了自定义导航,只有写一个公共组件或者模板套用了(随你挑选一个),这里我选择component构造器。
Component构造器可用于定义组件,调用Component构造器时可以指定组件的属性、数据、方法等。
编写JS
Component({
/* 组件的属性列表 */
properties: {
title: { // 设置标题
type: String,
value: ''
},
cover_state: { // 控制页面padding-top
type: Boolean,
value: false
},
show_bol: { // 控制返回箭头是否显示
type: Boolean,
value: false
},
my_class: { // 控制样式
type: Boolean,
value: false
}
},
/* 组件的初始数据 */
data: {
type: "组件",
bar_Height: wx.getSystemInfoSync().statusBarHeight // 获取手机状态栏高度
},
/* 组件的方法列表 */
methods: {
goBack: function () { // 返回事件
console.log("退后")
wx.navigateBack({
delta: 1,
})
}
}
})
编写WXML
<view style="padding-top:{{cover_state ? bar_Height + 44 : 0}}px;">
<view class='status-bar'>
<view class='goBack' bindtap='goBack' style="padding-top:{{bar_Height}}px;" hidden='{{show_bol}}'>
<view class="backIcon">
<!-- <image src='/images/back.png'></image> -->
返回
</view>
</view>
<view class="tabar {{my_class ? 'tabar2':''}}" style="padding-top:{{bar_Height}}px;">
<text class="red">{{title}}</text>
</view>
</view>
</view>
hidden='{{show_bol}}'
这里的show_bol
就是用来控制是否显示返回标签(说白了就是是内页还是首页,该不该有返回功能)padding-top:{{bar_Height}}px
bar_Height为获取到的手机状态栏的高度;
最外层再加一层< view > 来占据padding的位置,适配所有页面,加上cover_state控制是否需要,如果顶部导航需要透明则设为false
编写WXSS
/* 顶部导航 */
.status-bar {
width: 100%;
/* height: 180rpx; */
z-index: 99999;
position: fixed;
top: 0;
background-color: white;
background-image: linear-gradient(to bottom right, #FC466B, #3F5EFB);
}
.goBack{
position: absolute;
top: 15rpx;
font-size:12pt;
}
.goBack image{
width: 21rpx;
height: 40rpx;
padding: 12rpx 20px 0 30rpx;
}
.tabar {
display: flex;
justify-content: center;
/* background-color: #fff; */
}
.tabar2{
background: transparent !important;
/* background-image: linear-gradient(to bottom right, #FC466B, #3F5EFB); */
}
.tabar2 text{
color: #fff !important;
font-weight: lighter !important;
}
.tabar text {
height: 44px;
line-height: 44px;
padding: 0 30rpx;
color: white;
/* color: #353535; */
font-size: 12pt;
font-weight: bold;
}
.tabar .active {
color: #fff;
}
.backIcon{
width: 130rpx;
height: 50rpx;
border: #ccc solid 1rpx;
margin-left: 20rpx;
border-radius: 20rpx;
color: #ccc;
text-align: center;
line-height: 48rpx;
}
2. 使用组件
下面演示在首页使用自定义导航栏。
2.1 JSON
{
"usingComponents": {
"navigationBar": "/component/navigationBar/navigationBar"
},
}
2.2 WXML
<!--index.wxml-->
<navigationBar title='Java 求职助手' show_bol='{{true}}'></navigationBar>
<view class="container" style="padding-top:{{bar_Height + 45}}px;">
<!-- 顶部搜索栏 -->
<view class="page-header">
<van-search value="{{ value }}"
placeholder="大哥直接搜索不香嘛?"
shape="round"
bind:click-input="toSearchPage" />
</view>
......
.......
注意:title 用于指定导航栏标题,show_bol 用于指定是否显示返回按钮
这里导航栏会有个问题,导航肯定是要固定定位的,所以他就脱离了文档流,组件放进去后,会悬浮在上面,遮挡了下面的内容,这时候就需要给父元素加个padding-top了,所以需要给 navigationBar标签下的标签添加style属性:padding-top:{{bar_Height + 45}}px;
到这里,自定义导航栏就完成了。
微信关注
阅读剩余
版权声明:
作者:理想
链接:https://www.imyjs.cn/archives/1212
文章版权归作者所有,未经允许请勿转载。
THE END