基于原生小程序的自定义头部导航

项目需求,好多页面要自定义导航,样式还五花八门,肿么办?那就弄个头部导航组件吧! 先上效果图

image.png

下面一组是透明和不透明切换的效果

image.png

image.png

首先,生成原生小程序四大天王

image.png

然后,我们在wxml中写页面结构,我们这里利用slot插槽,来支持导航内容的自定义填充

<!-- 自定义导航 -->
<!-- isShadow 导航是否有阴影  navBar 导航栏高度  statusBar 状态栏高度-->
<!-- bgTransparent 导航是否透明 bgColor 导航背景色  statusBar 状态栏高度-->
<view
    class="customer_header {{isShadow ? 'shadow':''}}"
    style="height:{{navBar+statusBar}}px;background: {{bgTransparent ? bgColor : 'transparent'}};padding-bottom: 6px;"
>
  <view
      class="hader_box flex_jus_start
      style="margin-top: {{statusBar}}px;height:{{navBar}}px;"
  >
    <slot></slot>
  </view>
</view>
<!-- 因为是自定义导航,所以用的fixed定位,需要一个占位符将定位的空白区域填充 -->
<view class="standing_block" style="height:{{navBar+statusBar}}px;"></view>

接下来写wxss

.flex_jus_start{
  display: flex;
  flex-direction: row;
  justify-content: flex-start;
  align-items: center;
}
.standing_block{
  width: 100%;
  background: transparent;
}
.customer_header{
  position: fixed;
  left: 0;
  right: 0;
  top:0;
  width: 100%;
  height: 74rpx;
  margin: auto;
  z-index: 99;
}
.customer_header .hader_box{
  padding-left: 12rpx;
}
.customer_header .no_padding{
  padding-left: 0rpx;
}
.shadow{
  box-shadow: 0 4rpx 8rpx 0 rgba(0,0,0,0.08);
}

样式根据你们自己的需要去更改,接下来我们写js文件

const app = getApp()
Component({
  options: {
    multipleSlots: true // 在组件定义时的选项中启用多slot支持
  },
  properties: {
    bgTransparent:{
      type:Boolean,
      value:false
    },//是否导航背景透明
    bgColor:{
      type:String,
      value:'#fff'
    },//导航背景色
    isShadow:{
      type:Boolean,
      value:false
    },//是否带底部阴影
  },
  data: {
    navBar:0,//导航栏高度
    statusBar:0,//状态栏高度
  },
  attached: function () {
    //通过微信提供的 wx.getSystemInfo()方法,拿到状态栏高度和导航栏高度
    wx.getSystemInfo({
      success: res => {
        // 状态栏高度
        let statusBarHeight = res.statusBarHeight;
        let menuButtonRect = wx.getMenuButtonBoundingClientRect()
        // 导航栏高度
        let navigationBarHeight = (menuButtonRect.top - statusBarHeight) * 2 + menuButtonRect.height;
        this.setData({
          navBar:navigationBarHeight,
          statusBar:statusBarHeight
        })
      }
    });
  }
})

这样,一个最基本的自定义头部导航组件就写完了,我们来看一下如何使用;
在json文件中,我们先引入组件

{
  "usingComponents": {
    "coustom-nav":"/components/coustom-nav/index"
  },
  "navigationStyle": "custom"
}

然后页面使用

<view class="custom_nav">
  <coustom-nav bgTransparent="{{bgTransparent}}">
    <!-- 自定义导航插槽中的内容 我们在组件中已经进行了flex布局,这你直接写内容和具体样式就好了-->
    <view class="shop_image" bindtap="showShop">
      <image src="{{shop_avatar}}" mode="aspectFill"></image>
    </view>
    <view class="shop_name">「{{shop_name}} 」的职场店铺</view>
  </coustom-nav>
</view>

假如你想根据页面滑动来进行导航的透明与不透明显示,只需要在应用的页面这样写就可以了

//页面滑动,导航背景变化
  onPageScroll(e){
    //创建节点选择器
    let query = wx.createSelectorQuery();
    //选择id
    let that = this; 
    query.select('.custom_nav').boundingClientRect(function(rect) {
      if (e.scrollTop > rect.height) { // 页面上卷高度大于导航高度时
        that.setData({
          bgTransparent: true //导航头部颜色变为白色
        })
      } else {
        that.setData({
          bgTransparent: false  // 导航头部颜色变为透明
        })
      }
    }).exec();
  }

这样,一个自定义导航就完成了,你也可以在此基础上进行二次封装,制定更多的属性,满足你的业务需求

©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容