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

发布于:2023-01-04 ⋅ 阅读:(825) ⋅ 点赞:(0)

前言

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();
    },

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

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到