小程序自定义navigationBar组件以及上滑修改navigationBar

前言

navigationBar相信大家都不陌生把?今天我们就来说说自定义navigationBar,把它改变成我们想要的样子。

这次做一个全自定义的nav-bar,适用于基本上所有的场景,简单易懂,便于修改

下面是官方支持的样式

文件预览

我们可以在根目录下创建一个components文件夹来存放我们的组件,然后创建nav-bar组件

WXML文件

里面的参数都是自定义的,包括:

显示返回按钮back-icon

显示返回主页按钮home-icon

显示文案nav-title

显示图片nav-icon

高度是自动获取的可以不用管

<view class='nav' style='height: {{indexNav?(status + navHeight):0}}px'>
    <view class="nav-warp">
    <view class='status' style='height: {{status}}px;{{containerStyle}};background:{{background}}'></view>
        <view class='navbar' style='height:{{navHeight}}px;{{containerStyle}};background:{{background}}'>
            <view class='back-icon' wx:if="{{backIcon}}" bindtap='back'>
                <image src='{{backIcon}}'></image>       
            </view>         
            <view class='home-icon' wx:if="{{homeIcon}}" bindtap='home'>            
                <image src='{{homeIcon}}'></image>        
            </view>        
            <view class='nav-icon' wx:if="{{titleImg && !navFlag}}">            
                <image src='{{titleImg}}' style='{{iconStyle}}'></image>       
            </view>
            <view class='nav-title' wx:if="{{titleText && navFlag}}">
                <text style='{{textStyle}}'>{{titleText}}</text>
            </view>
        </view>
    </view>
</view>    

WXSS文件

此处的css仅是包括上面各种icon的默认大小,字号等,可以自行修改

.nav-warp{
  width: 100%;
  position: fixed;
  z-index: 999;
}
.navbar{
  position: relative
}
.back-icon, .home-icon{
  width: 44px;
  height: 100%;
  position: absolute;    
  transform: translateY(-50%);    
  top: 50%;    
  display: flex;
  }
.back-icon{    
  left: 16px;
}
.home-icon{    
  left: 8px
}
.back-icon image{    
  width: 20rpx;    
  height: 32rpx;       
  margin: auto;
}
.home-icon image{    
  width: 20rpx;    
  height: 32rpx;    
  margin: auto;
  margin-left: 4rpx;
}
.nav-title, .nav-icon{    
  position: absolute;    
  transform: translate(-50%, -50%);    
  left: 50%;    
  top: 50%;    
  font-size: 0;    
  font-weight: bold;
}

JS文件

会自动计算顶部的刘海以及有哪些参数可以修改以及默认样式(properties里面的)

Component({
  properties: {
    background: {
      type: String,
      value: '#000', //背景色 默认:#000
    },
    color: {
      type: String, //字体颜色 默认:#fff
      value: '#fff',  
    },
    fontSize: { 
      type: Number, //字号 默认:16
      value: 16,
    },
    titleText: {
      type: String, //标题 默认:null
      value: '',
    },
    titleImg: {
      type: String, //icon标题 默认:null
      value: '',  
    },
    iconHeight: {
      type: Number, //icon标题高 默认:19
      value: 19,
    },
    iconWidth: {
      type: Number, //icon标题宽 默认:19
      value: 58,
    },
    backIcon: {
      type: String, //返回箭头 默认:白色
      value: 'https://wx.gtimg.com/resource/feuploader/202103/5f5920d5fdb50672730228b3f42664c3_20x36.png',
    },
    homeIcon: {
      type: String, //主页icon 默认:null
      value: '',
    },
    navFlag: {
      type: Boolean, // 控制标题的展示与隐藏 在设置了文字标题或者icon标题时 true:展示文字标题  false:展示icon标题
      value: false,
    },
    indexNav: { 
      type: Boolean, //是否给navbar自动设置高度  默认:true
      value: true,
    },
  },
  attached() {
    this.setNavSize();
    this.setStyle();
  },
  data: {
  },
  methods: {
    // 通过获取系统信息计算导航栏高度 
      const sysinfo = wx.getSystemInfoSync();
      const statusHeight = sysinfo.statusBarHeight;
      const isiOS = sysinfo.system.indexOf('iOS') > -1;
      let navHeight;
      if (!isiOS) {
        navHeight = 48;
      } else {
        navHeight = 44;
      }
      this.setData({
        status: statusHeight,
        navHeight,
      });
    },
    setStyle() {
      const containerStyle = [
        `background:${this.data.background}`,
      ].join(';');
      const textStyle = [
        `color:${this.data.color}`,
        `font-size:${this.data.fontSize}px`,
      ].join(';');
      const iconStyle = [
        `width: ${this.data.iconWidth}px`,
        `height: ${this.data.iconHeight}px`,
      ].join(';');
      this.setData({
        containerStyle,
        textStyle,
        iconStyle,
      });
    },
    // 返回事件
    back() {
      wx.navigateBack({
        delta: 1,
      });
      this.triggerEvent('back', { back: 1 });
    },
    home() {
      wx.navigateBack({
        delta: 1,
      });
      this.triggerEvent('home', {});
    },
  },
});

JSON文件

表示这是一个组件文件

{
  "component": true
}

引用时 

在对应使用组件的json文件中隐藏原生的navigationBar或者在全局中去隐藏

js文件中在data里面填写需要重置的数据

"usingComponents": {
  "nav-bar": "../../components/nav-bar/nav-bar"
},
"navigationStyle":"custom",
//数据
background: 'transparent',
titleText: '',
navFlag: false,
stickyFlag: false,
indexNav: false,
titleImg: 'https://wx.gtimg.com/resource/feuploader/202103/da4e3efae8ddccb704472c8854fe5aaa_630x96.png',
iconWidth: '157.5',
iconHeight: '24',
homeIcon: 'https://wx.gtimg.com/resource/feuploader/202103/5f5920d5fdb50672730228b3f42664c3_20x36.png',
radioFlag: false,
modelFlag: true,

在wxml中加上自己要重置的样式参数

 <nav-bar background="{{background}}" titleText = '{{titleText}}'  navFlag = "{{navFlag}}" stickyFlag = "{{stickyFlag}}" homeIcon='{{homeIcon}}'  indexNav = '{{indexNav}}' titleImg = "{{titleImg}}" iconWidth="{{iconWidth}}" iconHeight = "{{iconHeight}}" />

上滑页面修改nav-bar

 onPageScroll: function () {
        var _this = this;
        var query = wx.createSelectorQuery();
        query.select('.charge').boundingClientRect(function (rect) {
            var indextop = rect.top;
            console.log(indextop);
            if (indextop < -1) {
                _this.setData({
                    background: '#28AE66',
                    titleText: '充电宝隔夜归还保障',
                    navFlag: true,
                });
            }
            else {
                _this.setData({
                    background: 'transparent',
                    titleText: '',
                    navFlag: false,
                });
            }
        });
       
            .exec();
    },

以上内容纯手造轮子,仅作参考,不喜勿喷!!谢谢

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
小程序自定义导航栏是指开发者可以根据自己的设计需求来自定义小程序页面的顶部导航栏样式和功能。 自定义导航栏的实现方式主要有两种: 第一种方式是使用小程序提供的原生导航栏组件进行自定义。开发者可以通过修改小程序全局配置文件`app.json`中的`navigationStyle`属性,将其设置为`custom`,然后在页面的`json`文件中引入`navigation-bar`组件,并在`wxml`文件中进行样式和布局的自定义。通过这种方式,开发者可以自由地修改导航栏的颜色、文字、图标等内容,以及添加额外的交互功能。 第二种方式是使用第三方组件库来实现导航栏的自定义。目前市面上有很多支持小程序组件库,如WeUI、vant-weapp等,这些组件库通常都提供了自定义导航栏的组件,开发者只需要按照组件库提供的文档进行安装和使用即可。使用第三方组件库的好处是可以轻松地实现各种复杂的导航栏样式和交互效果,同时还能提高开发效率。 无论使用哪种方式进行自定义导航栏,开发者都需要注意一些细节问题。首先是要正确设置页面的`page.json`中的`navigationBarTitleText`属性,来确保页面的标题显示正常。其次是要处理好导航栏和页面内容的间距,避免内容被导航栏遮挡或出现重叠现象。最后,还需要进行导航栏的状态管理,在页面中监听用户的操作,并实现对应的交互效果。 总体来说,自定义小程序导航栏可以帮助开发者更好地满足自己的设计需求,提升用户体验。通过选择适合的实现方式和注意一些细节问题,开发者可以轻松地实现各种炫酷的导航栏效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值