微信小程序-自定義導航欄組件(支持漸變色、純色和透明色纪蜒,并自動適配所有機型)

場景:

項目中要求導航欄是漸變色/透明色衷恭,像下面這樣的效果:

image
image

微信官方提供的導航欄只支持純色,是無法實現(xiàn)上述效果的纯续。

解決方案:

微信小程序?qū)Ш綑谔峁┝藘煞N樣式:一種是默認樣式随珠,就是支持純色的那種;另一種是自定義樣式猬错,既然是自定義窗看,那我們就可以為所欲為了。嘿嘿

image

為了節(jié)約時間倦炒,在網(wǎng)上搜了一下微信小程序的自定義導航欄烤芦,果然已經(jīng)有大佬為我們實現(xiàn):https://blog.csdn.net/qq_33744228/article/details/83656588 但是僅支持純色和透明色,并且每個頁面都要做適配(導航欄會覆蓋頁面內(nèi)容析校,不同高度的導航欄要設置不同的“padding-top”)构罗。

為了滿足項目要求,在大佬的代碼基礎上擴充了如下功能:

1智玻、支持漸變色:

利用CSS3提供的線性漸變(linear-gradient)實現(xiàn):

-webkit-linear-gradient( [<point> || <angle>,]? <stop>, <stop> [, <stop>]* )

-webkit-: 表示適配webkit內(nèi)核的瀏覽器遂唧;
[<point> || <angle>,]?: 表示漸變的起始位置;
<stop>, <stop> [, <stop>]*: 表示漸變的顏色吊奢;

例如:

background: -webkit-linear-gradient(top, orange, blue);

表示背景色從頂部開始由橙色漸變?yōu)樗{色盖彭。

2纹烹、組件內(nèi)適配所有機型:

可以認為導航欄有兩部分組成:狀態(tài)欄+標題欄。不同的機型狀態(tài)欄高度可能不同(除了劉海屏狀態(tài)欄高度是44之外召边,其他手機狀態(tài)欄高度都是20)铺呵,但標題欄高度都是44。微信小程序為我們提供了獲取狀態(tài)欄高度的方法:

wx.getSystemInfoSync().statusBarHeight

所以導航欄的高度為:

wx.getSystemInfoSync().statusBarHeight + 44

由于我們自定義的導航欄使用固定定位實現(xiàn)的隧熙,所以他就脫離了文檔流片挂,組件放進去后,會懸浮在上面贞盯,遮擋了下面的內(nèi)容音念,這時候就需要給父元素加個“padding-top”,“padding-top”的值即是導航欄的高度值躏敢。這部分可以寫到組件內(nèi)部實現(xiàn)闷愤,不用在每個頁面都做一次適配。

具體實現(xiàn):

通過自定義組件實現(xiàn)件余,具體怎么自定義組件讥脐,可以參考官方文檔:《自定義組件》
一般自定義組件由 json wxml wxss js 4個文件組成啼器,我這里為了方便實現(xiàn)旬渠,多加了兩個文件:“back.png” 和 “navigation.wxs”:

image

“back.png”是導航欄的返回圖標;“navigation.wxs”是為了處理漸變這種邏輯镀首,需要漸變的顏色可以以一個數(shù)組形式傳進來,使用比較方便鼠次。如果其他項目需要使用更哄,只需要把navigation目錄拖到項目中即可。下面直接貼出具體的實現(xiàn)代碼:

navigation.json:

{
  "component": true,
  "usingComponents": {}
}

navigation.wxml:


<wxs src="navigation.wxs" module="nav">
</wxs>
<view style="padding-top:{{content_offset ? bar_Height + 44 : 0}}px;">
  <view class='navigation status-bar'>
    <view class='goBack' bindtap='goBack' style="padding-top:{{bar_Height}}px;"  hidden='{{!show_bol}}'>      <!-- 返回按鈕 -->
      <image src='back.png'></image>
    </view>
    <view class="tabar {{my_class ? 'tabar2':''}}" style="padding-top:{{bar_Height}}px; background-color:{{background_color}}; {{nav.linearGradient(linear_gradient, direction, color_stops)}}">
      <text style="color:{{title_color}};">{{title}}</text>   <!-- 標題 -->
    </view>
  </view>
</view>

navigation.wxss:

/* 頂部導航 */
.navigation.status-bar {
  width: 100%;
  z-index: 99998;
  position: fixed;
  top: 0;
}
.navigation.status-bar .goBack{
  position: absolute;
  top: 7.5px;
  font-size:12pt;
}
.navigation.status-bar .goBack image{
  width: 22px;
  height: 22px;
  padding: 6px 20px 0 15px;
}
.navigation.status-bar .tabar {
  display: flex;
  justify-content: center;
  background: #fff;
}
.navigation.status-bar .tabar2{
  background: transparent !important;
}
.navigation.status-bar .tabar2 text{
  color: #fff !important;
  /* font-weight: lighter !important; */
}
.navigation.status-bar .tabar text {
  height: 44px;
  line-height: 44px;
  /* padding: 10pt 15pt; */
  color: #fff;
  font-size: 17px;
  /* font-weight: bold; */
}
.navigation.status-bar .tabar .active {
  color: #fff;
}

navigation.js:

Component({
  /* 組件的屬性列表 */
  properties: {
    title: {      // 設置標題
      type: String,
      value: ''
    },
    title_color: {      // 設置標題顏色
      type: String,
      value: '#fff'
    },
    show_bol: {     // 控制返回箭頭是否顯示
      type: Boolean,
      value: true
    },
    my_class: {     // 控制樣式(背景是否透明)
      type: Boolean,
      value: false
    },
    background_color: {//背景顏色
      type: String,
      value: "#24AFFF"
    },
    linear_gradient: {  //是否漸變
      type: Boolean,
      value: true
    },
    direction: {  //顏色漸變方向
      type: String,
      value: "top"
    },
    color_stops: { //漸變的起止顏色數(shù)組
      type: Array,
      value: ["#24AFFF", "#EEE"]
    },
    content_offset: { //內(nèi)容是否偏移(不讓導航欄遮擋內(nèi)容)
      type: Boolean,
      value: true
    }
  },
  /* 組件的初始數(shù)據(jù) */
  data: {
    type: "組件",
    bar_Height: wx.getSystemInfoSync().statusBarHeight    // 獲取手機狀態(tài)欄高度
  },
  /* 組件的方法列表 */
  methods: {
    goBack: function () {         // 返回事件
      console.log("退后")
      wx.navigateBack({
        delta: 1,
      })
    }
  }
})

navigation.wxs:

var linearGradient = function (isLinearGradient, direction, colorStops) {
  if (isLinearGradient) {
    return 'background: -webkit-linear-gradient(' + direction + ',' + colorStops.join(",") + ');';
  }
  return '';
}

module.exports = {
  linearGradient: linearGradient
}

下拉刷新問題:

這樣實現(xiàn)的導航欄腥寇,下拉刷新的動畫(三個小圓點)是從屏幕頂部開始的成翩,下拉距離不夠大時會被導航欄給蓋住。而使用默認的導航欄赦役,下拉刷新動畫是從導航欄底部開始的麻敌,不會被蓋住。

用scroll-view來寫下拉刷新

轉載自:http://www.reibang.com/p/9e89e60a1234

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掂摔,一起剝皮案震驚了整個濱河市术羔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乙漓,老刑警劉巖级历,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異叭披,居然都是意外死亡寥殖,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚼贡,“玉大人熏纯,你說我怎么就攤上這事≡敛撸” “怎么了樟澜?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長掐场。 經(jīng)常有香客問我往扔,道長,這世上最難降的妖魔是什么熊户? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任萍膛,我火速辦了婚禮,結果婚禮上嚷堡,老公的妹妹穿的比我還像新娘蝗罗。我一直安慰自己,他們只是感情好蝌戒,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布串塑。 她就那樣靜靜地躺著,像睡著了一般北苟。 火紅的嫁衣襯著肌膚如雪桩匪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天友鼻,我揣著相機與錄音傻昙,去河邊找鬼。 笑死彩扔,一個胖子當著我的面吹牛妆档,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虫碉,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贾惦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了敦捧?” 一聲冷哼從身側響起须板,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兢卵,沒想到半個月后逼纸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡济蝉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年杰刽,在試婚紗的時候發(fā)現(xiàn)自己被綠了菠发。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡贺嫂,死狀恐怖滓鸠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情第喳,我是刑警寧澤糜俗,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站曲饱,受9級特大地震影響悠抹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扩淀,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一楔敌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驻谆,春花似錦卵凑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至象对,卻和暖如春黑忱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背勒魔。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工甫煞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沥邻。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓危虱,卻偏偏與公主長得像羊娃,于是被迫代替她去往敵國和親唐全。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容