最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

小程序?qū)崿F(xiàn)自定義導(dǎo)航欄適配完美版

 更新時(shí)間:2019年04月02日 09:10:27   作者:小灰oO  
這篇文章主要介紹了小程序?qū)崿F(xiàn)自定義導(dǎo)航欄適配完美版,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1、發(fā)現(xiàn)問(wèn)題

小程序頁(yè)面自定義導(dǎo)航欄功能已經(jīng)開(kāi)放有些日子了(還不知道這個(gè)功能的可以先>>了解一下),這極大的提升了小程序開(kāi)發(fā)的自由度,相信不少小伙伴已經(jīng)使用過(guò)這個(gè)功能,同時(shí)也相信不少小伙伴在此功能開(kāi)發(fā)過(guò)程中踩過(guò)同樣的一些坑:

  • 機(jī)型多如牛毛:自定義導(dǎo)航欄高度在不同機(jī)型始終無(wú)法達(dá)到視覺(jué)上的統(tǒng)一;
  • 調(diào)皮的膠囊按鈕:導(dǎo)航欄元素(文字,圖標(biāo)等)怎么也對(duì)不齊那該死的膠囊按鈕;
  • 各種尺寸的全面屏,奇怪的劉海屏,簡(jiǎn)直要抓狂。

同樣的,這些問(wèn)題也是小灰經(jīng)歷過(guò)的。但是小灰相信,辦法總比問(wèn)題多,于是開(kāi)始了自己的探究:

2、一探究竟

為了搞明白到底該怎么去適配,老規(guī)矩,我先翻了一波官方文檔,還別說(shuō),官方還真有這么一段介紹了相關(guān)細(xì)節(jié),>>詳情點(diǎn)擊:

從圖中分析,我們可以得到如下信息:

  • Android跟iOS有差異,表現(xiàn)在頂部到膠囊按鈕之間的距離差了6pt
  • 膠囊按鈕高度為32pt, iOS和Android一致

這。。。,好像并沒(méi)有什么L用啊??這僅僅是普通屏幕為參照的,ipx, 安卓全面屏完全沒(méi)介紹。
沉著冷靜,我們接著分析:

  • 膠囊按鈕到狀態(tài)欄下邊緣這塊距離,好像是固定的?
  • 安卓這個(gè)圖,好像有點(diǎn)奇怪?導(dǎo)航欄分為 狀態(tài)欄+標(biāo)題欄?
  • 如果車(chē)兩個(gè)條件成立,那我們的問(wèn)題是不是就解決了80%了?

那么我們來(lái)論證一下:

第一個(gè)問(wèn)題:膠囊按鈕到狀態(tài)欄下邊緣的距離是不是固定的?

很簡(jiǎn)單,我們寫(xiě)一個(gè)狀態(tài)欄,通過(guò)wx.getSystemInfoSync().statusBarHeight設(shè)置高度

為了好測(cè)量,我們?cè)O(shè)置狀態(tài)欄背景色為深色

js代碼:

var sysinfo = wx.getSystemInfoSync();
this.setData({ 
 statusBarHeight:sysinfo.statusBarHeight 
})

wxml代碼:

<view class="status-bar" style="height:{{statusBarHeight}}px"></view>

wxss代碼:

.status-bar{
 background: rgb(141, 71, 71);
 }

效果圖(iPhone6):

效果圖(iPhoneX):

效果圖(安卓):

是不是有點(diǎn)眉目了?是的,從截圖可以看出,iOS是一致的,但是Android好像有所差別。

那究竟距離是多少?我們用神器(微信截圖)來(lái)量一量:

Android:

iOS:

可以看出,iOS膠囊按鈕與狀態(tài)欄之間距離為:6px, Android為8px,并且經(jīng)過(guò)測(cè)量,iOS各機(jī)型,Android各機(jī)型結(jié)果一致(由于篇幅原因,就不一一展示截圖了,有興趣的可以自行測(cè)量)

第二個(gè)問(wèn)題:導(dǎo)航欄分為 狀態(tài)欄+標(biāo)題欄?

通過(guò)對(duì)第一個(gè)問(wèn)題的論證,很明顯能看出來(lái)確實(shí)是這樣的。并且通過(guò)第一個(gè)問(wèn)題的測(cè)量結(jié)果以及官方提供的數(shù)據(jù),我們可以對(duì)標(biāo)題欄高度進(jìn)行計(jì)算:

  • 導(dǎo)航欄高度 = 膠囊按鈕高度 + 狀態(tài)欄到膠囊按鈕間距 * 2
  • Android導(dǎo)航欄高度 = 32px + 8px * 2 = 48px
  • iOS導(dǎo)航欄高度 = 32px + 6px * 2 = 44px

*注:由于膠囊按鈕是原生組件,為表現(xiàn)一直,其單位在個(gè)系統(tǒng)都為px,所以我們的自定義導(dǎo)航欄各個(gè)高度的單位都必需是px(切記不能用rpx),才能完美適配。

3、解決問(wèn)題

通過(guò)上述分析,相信小伙伴們都能有一個(gè)解決問(wèn)題的思路了,在上代碼之前,小灰再給大家畫(huà)一下重點(diǎn):

  • 寫(xiě)自定義導(dǎo)航組件的時(shí)候,需要將組件結(jié)構(gòu)一分為二:狀態(tài)欄 + 標(biāo)題欄
  • 狀態(tài)欄高度可通過(guò)wx.getSystemInfoSync().statusBarHeight獲取
  • 標(biāo)題欄高度:安卓:48px,iOS:44px
  • 單位必需跟膠囊按鈕一致,用px

話不多說(shuō),上代碼(gitHub地址):
js:

Component({ 
 properties: { 
 background: {  
 type: String,  
 value: 'rgba(255, 255, 255, 1)' 
 }, 
 color: {  
 type: String,  
 value: 'rgba(0, 0, 0, 1)' 
 }, 
 titleText: {  
 type: String,  
 value: '導(dǎo)航欄' 
 }, 
 titleImg: {  
 type: String,  
 value: '' 
 }, 
 backIcon: {  
 type: String,  
 value: '' 
 }, 
 homeIcon: {  
 type: String,  
 value: '' 
 }, 
 fontSize: {  
 type: Number,  
 value: 16 
 }, 
 iconHeight: {  
 type: Number,  
 value: 19 
 }, 
 iconWidth: {  
 type:Number,  
 value: 58 
 } 
 }, 
attached: function(){ 
 var that = this; 
 that.setNavSize(); 
 that.setStyle(); 
}, 
 data: {
 }, 
methods: { 
// 通過(guò)獲取系統(tǒng)信息計(jì)算導(dǎo)航欄高度 
setNavSize: function() {  
var that = this  
 , sysinfo = wx.getSystemInfoSync()  
 , statusHeight = sysinfo.statusBarHeight  
 , isiOS = sysinfo.system.indexOf('iOS') > -1  
 , navHeight;  
if (!isiOS) {  
 navHeight = 48;  
 } else {  
 navHeight = 44;  
}  
that.setData({  
 status: statusHeight,  
 navHeight: navHeight  
 }) 
}, 
setStyle: function() {  
 var that = this  
 , containerStyle  
 , textStyle  
 , iconStyle;  
 containerStyle = [  
 'background:' + that.data.background  
 ].join(';');  
 textStyle = [  
 'color:' + that.data.color,  
 'font-size:' + that.data.fontSize + 'px'  
 ].join(';');  
 iconStyle = [  
 'width: ' + that.data.iconWidth + 'px',  
 'height: ' + that.data.iconHeight + 'px'  
 ].join(';');  
 that.setData({  
  containerStyle: containerStyle,  
  textStyle: textStyle,  
  iconStyle: iconStyle  
 }) }, 
 // 返回事件 
back: function(){  
 wx.navigateBack({  
 delta: 1  
 })  
 this.triggerEvent('back', {back: 1}) 
}, 
home: function() {  
 this.triggerEvent('home', {}); 
 } 
 }})

wxml:

<view class='nav' style='height: {{status + navHeight}}px'> 
 <view class='status' style='height: {{status}}px;{{containerStyle}}'></view>    <view class='navbar' style='height:{{navHeight}}px;{{containerStyle}}'> <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> [鏈接描述][10]
 <view class='nav-icon' wx:if="{{titleImg}}">  
 <image src='{{titleImg}}' style='{{iconStyle}}'></image> 
 </view>
  <view class='nav-title' wx:if="{{titleText && !titleImg}}">
  <text style='{{textStyle}}'>{{titleText}}</text>
  </view>
 </view>
 </view>

wxss:

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

運(yùn)行效果圖:


文字標(biāo)題:

圖片標(biāo)題:

4、總結(jié)

經(jīng)過(guò)小灰的一番論證以及實(shí)踐經(jīng)驗(yàn),最終總結(jié)出以上最終解決方案,但希望對(duì)小伙伴們有所幫助,如果小伙伴們覺(jué)得有用,記得給顆star哦 --> 點(diǎn)我,后續(xù)還會(huì)更新其他組件。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一個(gè)XML格式數(shù)據(jù)轉(zhuǎn)換為圖表的例子

    一個(gè)XML格式數(shù)據(jù)轉(zhuǎn)換為圖表的例子

    這個(gè)例子使用的是轉(zhuǎn)換為VML的語(yǔ)法,換成其他如SVG的語(yǔ)法,就可以轉(zhuǎn)換成為SVG圖形,單元數(shù)量可以任意加。
    2010-02-02
  • 深入理解ES6 Promise 擴(kuò)展always方法

    深入理解ES6 Promise 擴(kuò)展always方法

    本篇文章主要介紹了ES6 Promise 擴(kuò)展always方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 百度空間的popup效果分析

    百度空間的popup效果分析

    自從用firefox瀏覽器以來(lái),就幾乎養(yǎng)成了一個(gè)習(xí)慣,就想用WebDeveloper把一些漂亮網(wǎng)站的js包括css給down下來(lái)分析一下,用來(lái)學(xué)習(xí)。
    2008-10-10
  • 超鏈接的禁用屬性Disabled使用示例

    超鏈接的禁用屬性Disabled使用示例

    可以設(shè)置超鏈接的Disabled屬性的true 和 false來(lái)確定超鏈接是不是能點(diǎn)擊,下面有個(gè)示例,大家不妨參考下
    2014-07-07
  • javascript實(shí)現(xiàn)在下拉列表中顯示多級(jí)樹(shù)形菜單的方法

    javascript實(shí)現(xiàn)在下拉列表中顯示多級(jí)樹(shù)形菜單的方法

    這篇文章主要介紹了javascript實(shí)現(xiàn)在下拉列表中顯示多級(jí)樹(shù)形菜單的方法,涉及javascript屬性菜單的定義、構(gòu)造及遍歷等技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • 微信小程序自定義Dialog彈框

    微信小程序自定義Dialog彈框

    這篇文章主要為大家詳細(xì)介紹了微信小程序自定義Dialog彈框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JavaScript判斷對(duì)象是否為空對(duì)象的幾種常見(jiàn)方法

    JavaScript判斷對(duì)象是否為空對(duì)象的幾種常見(jiàn)方法

    經(jīng)典面試題,研發(fā)時(shí)也經(jīng)常遇見(jiàn)的一個(gè)問(wèn)題,如何判斷一個(gè)對(duì)象是空對(duì)象,這篇文章主要給大家介紹了關(guān)于JavaScript判斷對(duì)象是否為空對(duì)象的幾種常見(jiàn)方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • JS中正則表達(dá)式只有3種匹配模式(沒(méi)有單行模式)詳解

    JS中正則表達(dá)式只有3種匹配模式(沒(méi)有單行模式)詳解

    下面小編就為大家?guī)?lái)一篇JS中正則表達(dá)式只有3種匹配模式(沒(méi)有單行模式)詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • js最全的數(shù)組的降維5種辦法(小結(jié))

    js最全的數(shù)組的降維5種辦法(小結(jié))

    這篇文章主要介紹了js最全的數(shù)組的降維5種辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • js 排序動(dòng)畫(huà)模擬 冒泡排序

    js 排序動(dòng)畫(huà)模擬 冒泡排序

    在js中,想讓線程sleep一下確實(shí)不是一件簡(jiǎn)單的事情,過(guò)多的使用定時(shí)器或者回調(diào)函數(shù),會(huì)讓復(fù)雜,凌亂,這時(shí),可以考慮能否使用隊(duì)列來(lái)做一些簡(jiǎn)
    2012-07-07

最新評(píng)論

乐山市| 嘉义市| 黄龙县| 桂平市| 远安县| 昌邑市| 云南省| 延川县| 大名县| 大埔区| 富民县| 抚州市| 金湖县| 漾濞| 永胜县| 墨玉县| 陆丰市| 射洪县| 寻乌县| 承德县| 高州市| 阿荣旗| 黄冈市| 抚顺县| 商丘市| 永宁县| 栖霞市| 贵州省| 桦南县| 屏山县| 化德县| 镇赉县| 吉水县| 昌都县| 通辽市| 德化县| 柘荣县| 望城县| 新野县| 砀山县| 滨海县|