摘要:三底部選項卡切換頁面底部選項卡的切換,可以說是的標志之一。兩種模式的顯示效果差不多,如下圖可見兩種模式的區別顧名思義,模式是將所有子頁面的內容,分別放置到主頁不同的中,當我們點擊主頁的不同選項卡時,切換不同的顯示。
概 述
JRedu
在上一篇博客中,我們學習了如何使用Hbuilder創建一個APP,同時如何使用MUI搭建屬于自己的第一款APP,沒有學習的同學可以戳鏈接學習: http://www.cnblogs.com/jerehedu/p/7832808.html
今天這篇博客,我們繼續深入學習MUI框架,主要學習這幾個方面:加載子頁面、頁面跳轉并傳值,底部選項卡的多種實現方式。
一、MUI加載子頁面 |
在mobile app開發過程中,經常遇到卡頭卡尾的頁面,也就是說頭部和尾部保持不動,而只有中間區域可以滾動,常見的就是新聞列表與詳情頁等情況:
如上圖所示,頭部和尾部不會跟著滾動,而是只有中間列表區域正常滾動。但這種局部滾動,在android手機上會出現滾動不流暢的問題;
針對這個問題,mui的解決思路是:將需要滾動的區域通過多帶帶的webview實現,完全使用原生滾動。也就是說,將頁面分為主頁面和子頁面兩部分,主頁面只有頭部和尾部,而需要滾動的區域放置到子頁面中,并在mui.init()方法中加載。大約就是這么一個效果:
在上篇博客中,我們介紹了mui.init()方法,這個方法主要用于mui頁面的初始化,進行頁面加載時的各種配置,接受一個對象類型的參數。
那么,在mui中加載子頁面非常簡單,只需要對象中傳入subpages屬性,用數組格式表示多個頁面,subpages數組的格式要求如下:
mui.init({ subpages:[{ url:your-subpage-url,//子頁面HTML地址,支持本地地址和網絡地址 id:your-subpage-id,//子頁面標志 styles:{ top:subpage-top-position,//子頁面頂部位置 bottom:subpage-bottom-position,//子頁面底部位置 width:subpage-width,//子頁面寬度,默認為100% height:subpage-height,//子頁面高度,默認為100% ...... }, extras:{}//額外擴展參數 }] });
具體的實現步驟如下:
① 新建主頁面,只保留頭部和尾部
主頁面中輸入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">設置span> a> nav>
② 新建子頁面,承載一個列表頁
子頁面中輸入mList,即可快速生成一個列表頁面。注意子頁面中無需頭部尾部,也無需將內容包裹在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({ /* 在頁面的指定位置,加載子頁面,實現卡頭卡尾的效果 */ subpages:[{ url:"0101-ziye.html",//子頁面HTML地址,支持本地地址和網絡地址 id:"0101-ziye.html",//子頁面標志 styles:{ top:"45px",//子頁面頂部位置(頂部選項卡默認高度45px) bottom:"51px",//子頁面底部位置(頂部導航欄默認高度51px) //width:100%,//子頁面寬度,默認為100% //height:100%,//子頁面高度,默認為100% }, // extras:{}//額外擴展參數,頁面傳值時使用 }] })
上述配置代碼的詳細解釋已經在注釋中說明,大家按照注釋內容配置即可,其中extras:{}用于頁面間傳值使用,下個章節講解。
二、 頁面間跳轉并傳值 |
在移動APP中,頁面之間的跳轉傳值是非常常用的,一種典型的應用就是從新聞列表頁點擊每一條新聞,將新聞的id傳遞到詳情頁顯示,例如下述情況:
在這里需要強調一下,雖然我們使用MUI制作的APP也是有網頁組成,但是頁面之間跳轉盡量不要使用超鏈接標簽進行跳轉,MUI給我們提供了更加好用而且性能更優的方式:mui.openWindow(),這個函數我們在上篇博客中已經使用過,此處不再贅述。
但是從效果圖可以看到,我們從列表頁跳轉到詳情頁時,標題上面的內容也在發生著變化,那么我們就需要用到另一個函數:mui.openWindowWithTitle(),這個方法是對mui.openWindow()的擴展,支持nativeObj繪制標題欄,加快頁面展現。
這個函數是對mui.openWindow()的擴展,因此mui.openWindow()方法需要配置的參數,在這個方法中依然支持,同時這個方法要求傳入一個新對象,表示對標題欄的配置:
mui.openWindowWithTitle({ // mui.openWindow()方法的各種配置項,依然寫在這里 },{ title:{//標題配置 text:"",//標題文字 }, back:{//左上角返回箭頭 image:{//圖片格式 base64Data://加載圖片的Base64編碼格式數據 base64Data 和 imgSRC 必須指定一個.否則不顯示返回箭頭 } } })
要實現頁面之間的跳轉傳值,首先要為列表頁的所有list添加點擊事件,并獲取到每個list的id,同時將ID傳入到詳情頁。 當然,這些操作都需要在mui.plusReady方法中寫入:
mui.plusReady(function(){ var arr = document.getElementsByTagName("a"); for(var i=0; i){ !function(i){ arr[i].addEventListener("tap",function(){ mui.openWindowWithTitle({ url:"0102-detail.html", id:"0102-detail.html", styles:{ }, extras:{ // 打開頁面的同時,向新頁面傳遞數據。 newsId : i } },{ //標題欄的背景色和底邊線配置 backgroundColor:"#C9302C", //bottomBorderColor:"#00ff00", title:{ //標題文字的內容和樣式配置 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()之外,還有一個重要的代碼:
extras:{ // 打開頁面的同時,向新頁面傳遞數據。 newsId : i }
這就是頁面之間傳值的關鍵所在,使用extras對象,將我們需要傳遞給新頁面的數據以鍵值對的形式送達。
當列表頁當id傳給詳情頁以后,詳情頁接受就很簡單了,只需要先取到當前詳情頁的WebView,并從當前WebView中取到傳過來的newsId:
mui.plusReady(function(){ // 取到當前的webview //var slef = plus.webview.currentWebview(); // 通過webview的id,獲取指定的webview var slef = plus.webview.getWebviewById("0102-detail.html"); document.getElementById("num").innerText = slef.newsId+1; })
上述代碼可以看到,取到當前WebView的方式有兩種,一種是直接取到當前WebView,一種是使用WebView的id獲得指定的WebView。 不管哪種方式取到,拿到WebView以后,就可以直接以鍵取值。
三、底部選項卡切換頁面 |
底部選項卡的切換,可以說是APP的標志之一。 幾乎主流的所有APP,都會在底部有多個選項卡,可以點擊切換不同頁面。而這個功能,MUI也很友好的給我們提供了兩種方式:DIV模式和WebView模式。兩種模式的顯示效果差不多,如下圖可見:
顧名思義,DIV模式是將所有子頁面的內容,分別放置到主頁不同的DIV中,當我們點擊主頁的不同選項卡時,切換不同DIV的顯示。 這種方式顯然要比加載子頁的方式快很多,但是也顯然不能承載很多布局的頁面,畢竟要在一個主頁中寫入所有子頁面的代碼,顯得不太現實。
而WebView模式則是將所有子頁面都寫入到不同的子頁面中,再通過主頁連接到一起,點擊不同的選項卡 ,加載不同的子頁面,顯然這種方式更符合我們的預期和要求。
DIV模式的選項卡切換非常的簡單,無需一行JS代碼,直接使用HTML代碼即可實現代碼的切換:
<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">底部選項卡切換(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">設置span> a> nav> <div class="mui-content"> <div id="page1" class="mui-control-content mui-active"> 這是第一個頁面 div> <div id="page2" class="mui-control-content"> 這是第二個頁面 div> <div id="page3" class="mui-control-content"> 這是第三個頁面 div> <div id="page4" class="mui-control-content"> 這是第四個頁面 div> div>
代碼解釋:
這種方式的實現,只需要給代表每個子頁面的div,添加mui-control-content類即可,同時用mui-active表示默認加載的第一個子頁。
寫好子頁DIV后,給每個div起一個id,并且將這個id與底部選項卡中的每個a標簽的href屬性相關聯,即可實現選項卡的切換。
使用WebView模式的選項卡切換,首先需要創建多個子頁面的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">設置span> a> nav>
HTML代碼的簡潔,必然造成JS代碼的相對復雜,但是也很簡單,大家使用粘貼復制大法即可:
var subpages = [a.html, b.html, c.html, d.html]; var subpage_style = { top: 45px, bottom: 51px }; var aniShow = {}; //創建子頁面,首個選項卡頁面顯示,其它均隱藏; 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(); } /* 讓新創建的webview,追加合并到當前的窗口上。合并成一個窗口。 * 目的:將父子窗口合并成一個頁面,實現同開同關的效果。 避免點擊返回安監室,子頁面先關閉,而父頁面的頭部和尾部沒有關閉的BUG。 */ self.append(sub); } }); //當前激活選項 var activeTab = subpages[0]; var title = document.getElementById("title"); //選項卡點擊事件 mui(.mui-bar-tab).on(tap, a, function(e) { var targetTab = this.getAttribute(href); if (targetTab == activeTab) { return; } //更換標題 title.innerHTML = this.querySelector(.mui-tab-label).innerHTML; //顯示目標選項卡 //若為iOS平臺或非首次顯示,則直接顯示 if(mui.os.ios||aniShow[targetTab]){ plus.webview.show(targetTab); }else{ //否則,使用fade-in動畫,且保存變量 var temp = {}; temp[targetTab] = "true"; mui.extend(aniShow,temp); plus.webview.show(targetTab,"fade-in",300); } //隱藏當前; plus.webview.hide(activeTab); //更改當前活躍的選項卡 activeTab = targetTab; });
每一行代碼的詳細作用,均已在代碼注釋中詳細說明 ,但是對于很多新手同學,可能理解起來依然存在一定的問題,所以貼心的杰小瑞老師準備了極大程度的簡化版本。
上面的代碼雖然功能強大,但是代碼雜亂,很不容易理解,我們可以在保留原來的HTML的基礎上,將JS代碼進行極大程度的簡化處理:
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){ // 有幾個選項卡,需要創建幾個子頁面 var page = plus.webview.create(pages[i],pages[i],styles); pageArr.push(page); !function(i){ arr[i].addEventListener("tap",function(){ // 讓當前頁面(i)顯示,不是當前頁面隱藏 for(var j=0; j ){ if(j!=i) pageArr[j].hide(); else pageArr[j].show(); } /* 讓新創建的webview,追加合并到當前的窗口上。合并成一個窗口。 * 目的:將父子窗口合并成一個頁面,實現同開同關的效果。 避免點擊返回安監室,子頁面先關閉,而父頁面的頭部和尾部沒有關閉的BUG。 */ slef.append(pageArr[i]); }) }(i); } // 默認觸發第0個選項卡的tap事件。 mui.trigger(arr[0],"tap"); });
怎么樣,代碼是不是簡潔很多了呢?一起來看看最終效果吧!!
好了,今天的內容就先到這了,下篇博客讓我們繼續探討MUI的更高級功能吧!由于博客描述有限,使用過程中有任何問題,歡迎評論留言討論哦~~
如果需要源碼,請點擊下載鏈接進行下載。
作者:杰瑞教育
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/2118.html
摘要:預加載自定義事件第三方擴展插件涉及的,除了,其它所有手機瀏覽器及瀏覽器均無法使用,目前主要包括語音輸入事件相關注意瀏覽器沒有事件事件相關的,手機端瀏覽器均可使用端模擬手機瀏覽器也可以正常使用。 最近項目中需要使用MUI做一個視頻播放的小功能。我就花時間研究了一下MUI。 MUI是一個使用JavaScript開發Android和IOS應用的前端框架。這篇文章將以知識樹的形式對MUI的使用...
摘要:參考通過本地儲存特性檢測參考利用傳參在頁面跳轉的時候通過設置添加參數,在接收參數的頁面通過獲取參數字符串。發送參數的頁面接收參數的頁面獲取中的參數獲取中的參數其他參考資料頁面傳參終極版青峰專欄博客頻道本文地址 1 : 通過MUI封裝的openWindow 方法: mui.openWindow({ url:new-page-url, id:new-page-id, ...
摘要:參考通過本地儲存特性檢測參考利用傳參在頁面跳轉的時候通過設置添加參數,在接收參數的頁面通過獲取參數字符串。發送參數的頁面接收參數的頁面獲取中的參數獲取中的參數其他參考資料頁面傳參終極版青峰專欄博客頻道本文地址 1 : 通過MUI封裝的openWindow 方法: mui.openWindow({ url:new-page-url, id:new-page-id, ...
摘要:參考通過本地儲存特性檢測參考利用傳參在頁面跳轉的時候通過設置添加參數,在接收參數的頁面通過獲取參數字符串。發送參數的頁面接收參數的頁面獲取中的參數獲取中的參數其他參考資料頁面傳參終極版青峰專欄博客頻道本文地址 1 : 通過MUI封裝的openWindow 方法: mui.openWindow({ url:new-page-url, id:new-page-id, ...
前言:當下音樂播放器不勝其數,為了更好的掌握一些東西,我們來自己制作一個音樂播放器。 文章目錄: 一.開發環境:二.頁面視圖:1.主文件入口(首頁):2.音樂播放界面: 三.功能實現(1)、index.html:(2)、播放音樂(music.html):(3)、樣式文件(index.css): 四.項目地址: 一.開發環境: 開發工具:HbuliderX; 框架:Vant,Mui,V...
閱讀 713·2023-04-25 19:43
閱讀 3910·2021-11-30 14:52
閱讀 3784·2021-11-30 14:52
閱讀 3852·2021-11-29 11:00
閱讀 3783·2021-11-29 11:00
閱讀 3869·2021-11-29 11:00
閱讀 3557·2021-11-29 11:00
閱讀 6105·2021-11-29 11:00