小程序自定义头部

微信小程序window配置


1.配置app.json

"window": {

    "backgroundColor": "#F6F6F6",

    "backgroundTextStyle": "light",

    "navigationStyle": "custom",//必填

    "navigationBarTextStyle": "black"

  },

2.小程序头部组件

js

// headTemplates/head/head.js

const app = getApp()

Component({

  properties: {

    navbarData: { //navbarData  由父页面传递的数据,变量名字自命名

      type: Object,

      value: {},

      observer: function(newVal, oldVal) {

        //console.log(newVal, oldVal)

      }

    }

  },

  data: {

    height: '',

    //默认值  默认显示左上角

    navbarData: {

      showCapsule: 1

    },

    open: false

  },

  attached: function() {

    // 获取是否是通过分享进入的小程序

    this.setData({

      share: app.globalData.share

    })


    // 定义导航栏的高度  方便对齐

    this.setData({

      totalTopHeight: app.globalData.totalTopHeight,

      titleBarHeight: app.globalData.titleBarHeight,

      statusBarHeight: app.globalData.statusBarHeight,

      inputHeight: 64,

      // inputHeight: app.globalData.inputHeight || 64,

    })

    var pages = getCurrentPages();

    var currentPage = pages[pages.length - 1];

    var url = currentPage.route; //获取路由

    this.setData({

      ['navbarData.showBackImage']: pages.length > 1 ? true : false

    })

    var marginRight = 0;

    if (this.data.navbarData.showHome && this.data.navbarData.showBackImage) {

      marginRight = 186;

    } else if (!this.data.navbarData.showHome && this.data.navbarData.showBackImage) {

      marginRight = 84;

    } else if (this.data.navbarData.showHome && !this.data.navbarData.showBackImage) {

      marginRight = 102;

    } else if (this.data.navbarData.eye) {

      marginRight = 102;

    } else {

      marginRight = 0;

    }

    this.setData({

      marginRight: marginRight

    })

  },

  methods: {

    // 返回上一页面

    _navback() {

      wx.navigateBack()

    },

    _eyeBtn() {

      if (this.data.open) {

        this.setData({

          open: false

        })

      } else {

        this.setData({

          open: true

        })

      }

      this.triggerEvent("openClick", {open:this.data.open})

    },

    //返回到首页

    _backhome() {

      wx.switchTab({

        url: '/pages/index/index',

      })

    },

  }

})

css

/* headTemplates/head/head.wxss */

/* 顶部要固定定位  标题要居中  自定义按钮和标题要和右边微信原生的胶囊上下对齐 */

.nav-wrap {

  position: fixed;

  width: 100%;

  top: 0;

  /* background: red; */

  color: #000;

  z-index: 9999999;

}

/* .btnOpen{

  width: 100rpx;

  height: 100%;

  text-align: center;

}

.btnOpen image{

  width: 52rpx;

  height: 36rpx;

} */

.nav-title-box{

    /* display: flex;

    align-items: center;

    justify-content: flex-start; */

    position: relative;

}

.nav-title{

    /* margin: 0 auto;

    flex:1; */

    width: 100%;

    text-align:center;

    color: #333;

    font-size: 32rpx;

    font-weight:bold;

    z-index: 1000000

}

.backBox{

position: absolute;

    top: 0;

    left: 0;

    z-index: 1000001

}

.back-pre,.back-pres,.home-pre{

    /* display: flex;

    align-items: center;

    justify-content: center; */

    float: left;

    /* margin: 22rpx; */

}

.back-pre-image{

    width: 13rpx;

    height: 24rpx;

    margin-top: 4rpx;

    padding: 10rpx 22rpx;

}

.back-pres-image{

    width: 52rpx;

    height: 36rpx;

    /* margin-top: 4rpx; */

    margin: 0 22rpx;

}

.home-pre-image{

    width: 42rpx;

    height: 42rpx;

    padding: 10rpx 30rpx;

}

.home-pre .line{

    width: 1px;

    height: 36rpx;

    background:rgba(204,204,204,1);

}

.nav-search{

    width: 100%;


}

.nav_seach_left{

    /* width:438rpx; */

    /* height:64rpx; */

    background:rgba(245,245,245,1);

    /* background:#000; */

    border-radius:32rpx;

    position:relative;

    /* margin-top:10rpx; */

    float: left;

    margin-left:16rpx;

    /* margin-top: -4rpx; */

    display: flex;

}

.nav_seach_left1{

    width:60%;

}

.nav_seach_left2{

    width:66%;

}

.nav_seach_logo{

    width: 32rpx;

    height:32rpx;

    margin-left: 24rpx;

    /* position:absolute;

    left: 29rpx;

    top:18rpx; */

}

.nav_seach_box_right{

    width: 72%;

    /* height:64rpx;

    line-height:64rpx; */

    /* margin:auto; */

    padding-left:12rpx;

    font-size:28rpx;

    font-weight:400;

    color:rgba(140,140,140,1);

    overflow: hidden;

    text-overflow:ellipsis;

    white-space: nowrap;

}

.placeholderstyle{

    font-size:28rpx;

    font-weight:400;

    color:rgba(140,140,140,1);

}

.null_logo{

    /* width: 200rpx; */

    height:60rpx;

    text-align:right;

    position:absolute;

    right: 30rpx;

    /* top:2rpx; */

}

/* .null_logo image{

    width: 24rpx;

    height:24rpx;

    vertical-align: top;

    margin-top:20rpx;

} */

wxml

<!--headTemplates/head/head.wxml-->

<view class='nav-wrap' style='height: {{totalTopHeight}}px;border-bottom:1px solid rgba(237,237,237,1);background:#fff;'>

  <view style='height: {{statusBarHeight}}px;'></view>

  <!-- // 导航栏 中间的标题 -->

  <view class='nav-title-box' style='height:{{titleBarHeight}}px;line-height:{{titleBarHeight}}px;'>

    <view class='backBox'>

      <view bindtap='_navback' class='back-pre' wx:if='{{navbarData.showBackImage?(!share?navbarData.showBackImage:navbarData.showBackImage):navbarData.showBackImage}}'>

        <image class='back-pre-image' src='/images/back-pre.png' mode='aspectFill' style="margin-top:{{(totalTopHeight-24)/2}}rpx"></image>

      </view>

      <view bindtap='_eyeBtn' class='back-pres' wx:if='{{navbarData.eye}}'>

        <image class='back-pres-image' wx:if='{{open==false}}' src='/assets/imgs/closeye.png' mode='aspectFill'></image>

        <image class='back-pres-image' wx:if='{{open}}' src='../../../assets/imgs/openeye.png' mode='aspectFill'></image>

      </view>

      <view class='home-pre' wx:if="{{navbarData.showHome}}" bindtap='_backhome'>

        <view class='line'></view>

        <image class='home-pre-image' src='/assets/imgs/home@2x.png' mode='aspectFill'></image>

      </view>

    </view>

    <view class='nav-title' wx:if='{{navbarData.titleShow}}' style='line-height:{{titleBarHeight}}px;margin-right:{{marginRight}}rpx;'>{{navbarData.title}}</view>

  </view>

</view>

json


{

    "component": true,

    "usingComponents": {}

}

3.app.js

全局信息

totalTopHeight: 0, //自定义头部总高度

    statusBarHeight: 0, //自定义头部状态栏高度

    titleBarHeight: 0, //自定义头部标题栏高度

onShow


//获设备型号

    wx.getSystemInfo({

      success: function (res) {

        self.globalData.phonexh = res.model.indexOf("iPhone X");

        self.globalData.statusBarHeight = res.statusBarHeight;

        var menuButton = wx.getMenuButtonBoundingClientRect();

        var isiOS = res.system.indexOf('iOS') > -1;

        if (!isiOS) {

          self.globalData.totalTopHeight = 48 + res.statusBarHeight;

        } else {

          self.globalData.totalTopHeight = 44 + res.statusBarHeight;

        }

        self.globalData.titleBarHeight = self.globalData.totalTopHeight - res.statusBarHeight;

      }

    })

4.页面中使用


wxml


<!--头部-->

<nav-bar bind:openClick='openVal' navbar-data='{{nvabarData}}'></nav-bar>

js


// 头部组件所需的参数

    nvabarData: {

      showHome: false, //是否显示Home

      showBackImage: true, //是否显示左上角返回图片

      titleShow: true, //是否显示中间标题

      title: '登录', //导航栏 中间的标题

      eye: false,

    },

    // 此页面 页面内容距最顶部的距离

    height: app.globalData.totalTopHeight,

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