底部选项卡的切换,可以说是APP的标志之一。 几乎主流的所有APP,都会在底部有多个选项卡,可以点击切换不同页面。而这个功能,MUI也很友好的给我们提供了两种方式:DIV模式和WebView模式。两种模式的显示效果差不多,如下图可见:
1两种模式的区别
顾名思义,DIV模式是将所有子页面的内容,分别放置到主页不同的DIV中,当我们点击主页的不同选项卡时,切换不同DIV的显示。 这种方式显然要比加载子页的方式快很多,但是也显然不能承载很多布局的页面,毕竟要在一个主页中写入所有子页面的代码,显得不太现实。
而WebView模式则是将所有子页面都写入到不同的子页面中,再通过主页连接到一起,点击不同的选项卡 ,加载不同的子页面,显然这种方式更符合我们的预期和要求。
2底部选项卡切换(DIV模式)
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属性相关联,即可实现选项卡的切换。
3底部选项卡切换(WebView模式)
使用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;
});
每一行代码的详细作用,均已在代码注释中详细说明 ,但是对于很多新手同学,可能理解起来依然存在一定的问题,所以贴心的杰小瑞老师准备了极大程度的简化版本。
4底部选项卡切换(简化版)
上面的代码虽然功能强大,但是代码杂乱,很不容易理解,我们可以在保留原来的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<arr.length; 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<pageArr.length; 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");
});
怎么样,代码是不是简洁很多了呢?一起来看看最终效果吧!!