概 述
在上一篇博客中,我們學(xué)習(xí)了如何使用Hbuilder創(chuàng)建一個(gè)APP呛哟,同時(shí)如何使用MUI搭建屬于自己的第一款A(yù)PP
今天這篇博客癣诱,我們繼續(xù)深入學(xué)習(xí)MUI框架,主要學(xué)習(xí)這幾個(gè)方面:加載子頁面龄章、頁面跳轉(zhuǎn)并傳值吃谣,底部選項(xiàng)卡的多種實(shí)現(xiàn)方式。
一做裙、MUI加載子頁面
1岗憋、加載子頁面詳解
??在mobile app開發(fā)過程中,經(jīng)常遇到卡頭卡尾的頁面锚贱,也就是說頭部和尾部保持不動(dòng)仔戈,而只有中間區(qū)域可以滾動(dòng),常見的就是新聞列表與詳情頁等情況:
??如上圖所示惋鸥,頭部和尾部不會(huì)跟著滾動(dòng)杂穷,而是只有中間列表區(qū)域正常滾動(dòng)悍缠。但這種局部滾動(dòng)卦绣,在android手機(jī)上會(huì)出現(xiàn)滾動(dòng)不流暢的問題;
??針對(duì)這個(gè)問題飞蚓,mui的解決思路是:將需要滾動(dòng)的區(qū)域通過單獨(dú)的webview實(shí)現(xiàn)滤港,完全使用原生滾動(dòng)。也就是說趴拧,將頁面分為主頁面和子頁面兩部分溅漾,主頁面只有頭部和尾部,而需要滾動(dòng)的區(qū)域放置到子頁面中著榴,并在mui.init()方法中加載添履。大約就是這么一個(gè)效果:
2、加載子頁面的實(shí)現(xiàn)
??在上篇博客中脑又,我們介紹了mui.init()方法暮胧,這個(gè)方法主要用于mui頁面的初始化锐借,進(jìn)行頁面加載時(shí)的各種配置,接受一個(gè)對(duì)象類型的參數(shù)往衷。
??那么钞翔,在mui中加載子頁面非常簡單,只需要對(duì)象中傳入subpages屬性席舍,用數(shù)組格式表示多個(gè)頁面布轿,subpages數(shù)組的格式要求如下:
mui.init({
subpages:[{
url:your-subpage-url,//子頁面HTML地址,支持本地地址和網(wǎng)絡(luò)地址
id:your-subpage-id,//子頁面標(biāo)志
styles:{
top:subpage-top-position,//子頁面頂部位置
bottom:subpage-bottom-position,//子頁面底部位置
width:subpage-width,//子頁面寬度来颤,默認(rèn)為100%
height:subpage-height,//子頁面高度汰扭,默認(rèn)為100%
......
},
extras:{}//額外擴(kuò)展參數(shù)
}]
});
??具體的實(shí)現(xiàn)步驟如下:
① 新建主頁面,只保留頭部和尾部
??主頁面中輸入mHeader福铅、mfooter即可快速生成頭尾
<header class="mui-bar mui-bar-nav">
<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
<h1 class="mui-title">在主頁面中加載子頁面</h1>
</header>
<nav class="mui-bar mui-bar-tab">
<a class="mui-tab-item mui-active">
<span class="mui-icon mui-icon-home"></span>
<span class="mui-tab-label">首頁</span>
</a>
<a class="mui-tab-item">
<span class="mui-icon mui-icon-phone"></span>
<span class="mui-tab-label">電話</span>
</a>
<a class="mui-tab-item">
<span class="mui-icon mui-icon-email"></span>
<span class="mui-tab-label">郵件</span>
</a>
<a class="mui-tab-item">
<span class="mui-icon mui-icon-gear"></span>
<span class="mui-tab-label">設(shè)置</span>
</a>
</nav>
② 新建子頁面东且,承載一個(gè)列表頁
??子頁面中輸入mList,即可快速生成一個(gè)列表頁面本讥。注意子頁面中無需頭部尾部珊泳,也無需將內(nèi)容包裹在mBody中。
<ul class="mui-table-view">
<li class="mui-table-view-cell">
<a class="mui-navigate-right"> Item 1 </a>
</li>
<li class="mui-table-view-cell">
<a class="mui-navigate-right"> Item 2 </a>
</li> 拷沸。色查。。撞芍。秧了。。
</ul>
③ 主頁面的mui.init()方法中加載子頁面
mui.init({ /* 在頁面的指定位置序无,加載子頁面验毡,實(shí)現(xiàn)卡頭卡尾的效果 */ subpages:[{
url:"0101-ziye.html",//子頁面HTML地址,支持本地地址和網(wǎng)絡(luò)地址
id:"0101-ziye.html",//子頁面標(biāo)志
styles:{
top:"45px",//子頁面頂部位置(頂部選項(xiàng)卡默認(rèn)高度45px)
bottom:"51px",//子頁面底部位置(頂部導(dǎo)航欄默認(rèn)高度51px)
//width:100%,//子頁面寬度帝嗡,默認(rèn)為100%
//height:100%,//子頁面高度晶通,默認(rèn)為100%
}, // extras:{}//額外擴(kuò)展參數(shù),頁面?zhèn)髦禃r(shí)使用
}]
})
??上述配置代碼的詳細(xì)解釋已經(jīng)在注釋中說明,大家按照注釋內(nèi)容配置即可哟玷,其中extras:{}用于頁面間傳值使用狮辽,下個(gè)章節(jié)講解。
二巢寡、 頁面間跳轉(zhuǎn)并傳值
1喉脖、頁面間跳轉(zhuǎn)傳值概述
??在移動(dòng)APP中,頁面之間的跳轉(zhuǎn)傳值是非常常用的抑月,一種典型的應(yīng)用就是從新聞列表頁點(diǎn)擊每一條新聞树叽,將新聞的id傳遞到詳情頁顯示,例如下述情況:
??在這里需要強(qiáng)調(diào)一下谦絮,雖然我們使用MUI制作的APP也是有網(wǎng)頁組成题诵,但是頁面之間跳轉(zhuǎn)盡量不要使用超鏈接標(biāo)簽<a></a>進(jìn)行跳轉(zhuǎn)须误,MUI給我們提供了更加好用而且性能更優(yōu)的方式:mui.openWindow(),這個(gè)函數(shù)我們?cè)谏掀┛椭幸呀?jīng)使用過仇轻,此處不再贅述京痢。
??但是從效果圖可以看到,我們從列表頁跳轉(zhuǎn)到詳情頁時(shí)篷店,標(biāo)題上面的內(nèi)容也在發(fā)生著變化祭椰,那么我們就需要用到另一個(gè)函數(shù):mui.openWindowWithTitle(),這個(gè)方法是對(duì)mui.openWindow()的擴(kuò)展疲陕,支持nativeObj繪制標(biāo)題欄,加快頁面展現(xiàn)方淤。
2、mui.openWindowWithTitle()介紹
??這個(gè)函數(shù)是對(duì)mui.openWindow()的擴(kuò)展蹄殃,因此mui.openWindow()方法需要配置的參數(shù)携茂,在這個(gè)方法中依然支持,同時(shí)這個(gè)方法要求傳入一個(gè)新對(duì)象诅岩,表示對(duì)標(biāo)題欄的配置:
mui.openWindowWithTitle({ // mui.openWindow()方法的各種配置項(xiàng)讳苦,依然寫在這里
},{
title:{//標(biāo)題配置
text:"",//標(biāo)題文字
},
back:{//左上角返回箭頭
image:{//圖片格式
base64Data:''//加載圖片的Base64編碼格式數(shù)據(jù) base64Data 和 imgSRC 必須指定一個(gè).否則不顯示返回箭頭
}
}
})
3、列表頁打開詳情頁吩谦,并傳值
??要實(shí)現(xiàn)頁面之間的跳轉(zhuǎn)傳值鸳谜,首先要為列表頁的所有l(wèi)ist添加點(diǎn)擊事件,并獲取到每個(gè)list的id式廷,同時(shí)將ID傳入到詳情頁咐扭。 當(dāng)然,這些操作都需要在mui.plusReady方法中寫入:
mui.plusReady(function(){ var arr = document.getElementsByTagName("a"); for(var i=0; i<arr.length; i++){ !function(i){
arr[i].addEventListener("tap",function(){
mui.openWindowWithTitle({
url:"0102-detail.html",
id:"0102-detail.html",
styles:{
},
extras:{ // 打開頁面的同時(shí)滑废,向新頁面?zhèn)鬟f數(shù)據(jù)蝗肪。
newsId : i
}
},{ //標(biāo)題欄的背景色和底邊線配置
backgroundColor:"#C9302C", //bottomBorderColor:"#00ff00",
title:{ //標(biāo)題文字的內(nèi)容和樣式配置
text:"新聞詳情"+(i+1),
styles:{
color:"#FFFFFF",
align:"center",
family:"'Helvetica Neue',Helvetica,sans-serif",
size:"20px",
style:"normal",
weight:"bold",
}
},
back:{
image:{ /*返回箭頭圖片可以使用imgSrc,也可以使用base64編碼*/
//imgSrc:"img/back.png"
base64Data:"data:image/png;base64,……" }
}
})
})
}(i);
}
})蠕趁;
??這里面薛闪,除了mui.openWindowWithTitle()之外,還有一個(gè)重要的代碼:
extras:{ // 打開頁面的同時(shí)妻导,向新頁面?zhèn)鬟f數(shù)據(jù)逛绵。
newsId : i
}
??這就是頁面之間傳值的關(guān)鍵所在,使用extras對(duì)象倔韭,將我們需要傳遞給新頁面的數(shù)據(jù)以鍵值對(duì)的形式送達(dá)。
4瓢对、詳情頁接受列表頁傳值
??當(dāng)列表頁當(dāng)id傳給詳情頁以后寿酌,詳情頁接受就很簡單了,只需要先取到當(dāng)前詳情頁的WebView硕蛹,并從當(dāng)前WebView中取到傳過來的newsId:
mui.plusReady(function(){ // 取到當(dāng)前的webview
//var slef = plus.webview.currentWebview();
// 通過webview的id醇疼,獲取指定的webview
var slef = plus.webview.getWebviewById("0102-detail.html");
document.getElementById("num").innerText = slef.newsId+1;
})
??上述代碼可以看到硕并,取到當(dāng)前WebView的方式有兩種,一種是直接取到當(dāng)前WebView秧荆,一種是使用WebView的id獲得指定的WebView倔毙。 不管哪種方式取到,拿到WebView以后乙濒,就可以直接以鍵取值陕赃。
三、底部選項(xiàng)卡切換頁面
??底部選項(xiàng)卡的切換颁股,可以說是APP的標(biāo)志之一么库。 幾乎主流的所有APP,都會(huì)在底部有多個(gè)選項(xiàng)卡甘有,可以點(diǎn)擊切換不同頁面诉儒。而這個(gè)功能,MUI也很友好的給我們提供了兩種方式:DIV模式和WebView模式亏掀。兩種模式的顯示效果差不多忱反,如下圖可見:
1、兩種模式的區(qū)別
??顧名思義滤愕,DIV模式是將所有子頁面的內(nèi)容缭受,分別放置到主頁不同的DIV中,當(dāng)我們點(diǎn)擊主頁的不同選項(xiàng)卡時(shí)该互,切換不同DIV的顯示米者。 這種方式顯然要比加載子頁的方式快很多,但是也顯然不能承載很多布局的頁面宇智,畢竟要在一個(gè)主頁中寫入所有子頁面的代碼蔓搞,顯得不太現(xiàn)實(shí)。
??而WebView模式則是將所有子頁面都寫入到不同的子頁面中随橘,再通過主頁連接到一起喂分,點(diǎn)擊不同的選項(xiàng)卡 ,加載不同的子頁面机蔗,顯然這種方式更符合我們的預(yù)期和要求蒲祈。
2、底部選項(xiàng)卡切換(DIV模式)
??DIV模式的選項(xiàng)卡切換非常的簡單萝嘁,無需一行JS代碼梆掸,直接使用HTML代碼即可實(shí)現(xiàn)代碼的切換:
<header class="mui-bar mui-bar-nav">
<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
<h1 class="mui-title">底部選項(xiàng)卡切換(Div模式)</h1>
</header>
<nav class="mui-bar mui-bar-tab">
<a class="mui-tab-item mui-active" href="#page1">
<span class="mui-icon mui-icon-home"></span>
<span class="mui-tab-label">首頁</span>
</a>
<a class="mui-tab-item" href="#page2">
<span class="mui-icon mui-icon-phone"></span>
<span class="mui-tab-label">電話</span>
</a>
<a class="mui-tab-item" href="#page3">
<span class="mui-icon mui-icon-email"></span>
<span class="mui-tab-label">郵件</span>
</a>
<a class="mui-tab-item" href="#page4">
<span class="mui-icon mui-icon-gear"></span>
<span class="mui-tab-label">設(shè)置</span>
</a>
</nav>
<div class="mui-content">
<div id="page1" class="mui-control-content mui-active"> 這是第一個(gè)頁面 </div>
<div id="page2" class="mui-control-content"> 這是第二個(gè)頁面 </div>
<div id="page3" class="mui-control-content"> 這是第三個(gè)頁面 </div>
<div id="page4" class="mui-control-content"> 這是第四個(gè)頁面 </div>
</div>
代碼解釋:
??這種方式的實(shí)現(xiàn),只需要給代表每個(gè)子頁面的div牙言,添加mui-control-content類即可酸钦,同時(shí)用mui-active表示默認(rèn)加載的第一個(gè)子頁。
??寫好子頁DIV后咱枉,給每個(gè)div起一個(gè)id卑硫,并且將這個(gè)id與底部選項(xiàng)卡中的每個(gè)a標(biāo)簽的href屬性相關(guān)聯(lián)徒恋,即可實(shí)現(xiàn)選項(xiàng)卡的切換。
3欢伏、底部選項(xiàng)卡切換(WebView模式)
??使用WebView模式的選項(xiàng)卡切換入挣,首先需要?jiǎng)?chuàng)建多個(gè)子頁面的HTML文件,而主頁中硝拧,只需要頭部和尾部即可径筏,其他功能交給JS操作:
<header class="mui-bar mui-bar-nav">
<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
<h1 class="mui-title" id="title">首頁</h1>
</header>
<nav class="mui-bar mui-bar-tab">
<a id="defaultTab" class="mui-tab-item mui-active" href="a.html">
<span class="mui-icon mui-icon-home"></span>
<span class="mui-tab-label">首頁</span>
</a>
<a class="mui-tab-item" href="b.html">
<span class="mui-icon mui-icon-email"></span>
<span class="mui-tab-label">消息</span>
</a>
<a class="mui-tab-item" href="c.html">
<span class="mui-icon mui-icon-contact"></span>
<span class="mui-tab-label">通訊錄</span>
</a>
<a class="mui-tab-item" href="d.html">
<span class="mui-icon mui-icon-gear"></span>
<span class="mui-tab-label">設(shè)置</span>
</a>
</nav>
??HTML代碼的簡潔,必然造成JS代碼的相對(duì)復(fù)雜河爹,但是也很簡單匠璧,大家使用粘貼復(fù)制大法即可:
var subpages = ['a.html', 'b.html', 'c.html', 'd.html']; var subpage_style = {
top: '45px',
bottom: '51px' }; var aniShow = {}; //創(chuàng)建子頁面,首個(gè)選項(xiàng)卡頁面顯示咸这,其它均隱藏夷恍;
mui.plusReady(function() { var self = plus.webview.currentWebview(); for (var i = 0; i < 4; i++) { var temp = {}; var sub = plus.webview.create(subpages[i], subpages[i], subpage_style); if (i > 0) {
sub.hide();
} /* 讓新創(chuàng)建的webview,追加合并到當(dāng)前的窗口上媳维。合并成一個(gè)窗口酿雪。
* 目的:將父子窗口合并成一個(gè)頁面,實(shí)現(xiàn)同開同關(guān)的效果侄刽。 避免點(diǎn)擊返回安監(jiān)室指黎,子頁面先關(guān)閉,而父頁面的頭部和尾部沒有關(guān)閉的BUG州丹。 */ self.append(sub);
}
}); //當(dāng)前激活選項(xiàng)
var activeTab = subpages[0]; var title = document.getElementById("title"); //選項(xiàng)卡點(diǎn)擊事件
mui('.mui-bar-tab').on('tap', 'a', function(e) { var targetTab = this.getAttribute('href'); if (targetTab == activeTab) { return;
} //更換標(biāo)題
title.innerHTML = this.querySelector('.mui-tab-label').innerHTML; //顯示目標(biāo)選項(xiàng)卡
//若為iOS平臺(tái)或非首次顯示醋安,則直接顯示
if(mui.os.ios||aniShow[targetTab]){
plus.webview.show(targetTab);
}else{ //否則,使用fade-in動(dòng)畫墓毒,且保存變量
var temp = {};
temp[targetTab] = "true";
mui.extend(aniShow,temp);
plus.webview.show(targetTab,"fade-in",300);
} //隱藏當(dāng)前;
plus.webview.hide(activeTab); //更改當(dāng)前活躍的選項(xiàng)卡
activeTab = targetTab;
});
??每一行代碼的詳細(xì)作用吓揪,均已在代碼注釋中詳細(xì)說明 ,但是對(duì)于很多新手同學(xué)所计,可能理解起來依然存在一定的問題柠辞,所以貼心的杰小瑞老師準(zhǔn)備了極大程度的簡化版本。
4主胧、底部選項(xiàng)卡切換(杰小瑞老師簡化版)
??上面的代碼雖然功能強(qiáng)大叭首,但是代碼雜亂,很不容易理解踪栋,我們可以在保留原來的HTML的基礎(chǔ)上焙格,將JS代碼進(jìn)行極大程度的簡化處理:
mui.plusReady(function(){ var pages = ["a.html","b.html","c.html","d.html"]; var arr = document.getElementsByClassName("mui-tab-item") var styles = {
top:"45px",
bottom:"51px" } var pageArr = []; var slef = plus.webview.currentWebview(); for(var i=0; i<arr.length; i++){ // 有幾個(gè)選項(xiàng)卡,需要?jiǎng)?chuàng)建幾個(gè)子頁面
var page = plus.webview.create(pages[i],pages[i],styles);
pageArr.push(page); !function(i){
arr[i].addEventListener("tap",function(){ // 讓當(dāng)前頁面(i)顯示己英,不是當(dāng)前頁面隱藏
for(var j=0; j<pageArr.length; j++){ if(j!=i) pageArr[j].hide(); else pageArr[j].show();
} /* 讓新創(chuàng)建的webview间螟,追加合并到當(dāng)前的窗口上。合并成一個(gè)窗口损肛。
* 目的:將父子窗口合并成一個(gè)頁面厢破,實(shí)現(xiàn)同開同關(guān)的效果。 避免點(diǎn)擊返回安監(jiān)室治拿,子頁面先關(guān)閉摩泪,而父頁面的頭部和尾部沒有關(guān)閉的BUG。 */ slef.append(pageArr[i]);
})
}(i);
} // 默認(rèn)觸發(fā)第0個(gè)選項(xiàng)卡的tap事件劫谅。
mui.trigger(arr[0],"tap");
});
??怎么樣见坑,代碼是不是簡潔很多了呢?一起來看看最終效果吧D蠹臁荞驴!
??好了,今天的內(nèi)容就先到這了贯城,下篇博客讓我們繼續(xù)探討MUI的更高級(jí)功能吧熊楼!由于博客描述有限,使用過程中有任何問題能犯,歡迎評(píng)論留言討論哦~~
如果需要源碼鲫骗,請(qǐng)點(diǎn)擊下載鏈接進(jìn)行下載。
作者:杰瑞教育Allen老師
版權(quán)聲明:本文版權(quán)歸煙臺(tái)杰瑞教育科技有限公司和博客園共有踩晶,歡迎轉(zhuǎn)載执泰,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接渡蜻,否則保留追究法律責(zé)任的權(quán)利术吝。