微信小程序下拉菜單實例,小程序的嘗鮮制作,開發工具是0.9版,不過思想和原理是一樣的,非常適合微信小程序入門。
微信小程序下拉菜單實例
微信小程序下拉菜單思路與步驟:
布局方面,整體使用dl來寫,二級包在dd中,用ul li來寫;交互方面,點擊某一級菜單,關閉兄弟子菜單,點擊某子菜單關閉所有菜單。
1.使用dt做出第一級菜單
2.使用dd嵌套第二級菜單,初始隱藏、position為absolute,使用z-index浮出頁面層
/總菜單容器/
.menu {display: block;height: 38px;}
/一級菜單/
.menu dt {
font-size: 15px;float:left;width: 33%;height: 38px;border-right: 1px solid #d2d2d2;
border-bottom: 1px solid #d2d2d2; text-align: center;background-color: #f4f4f4; color: #5a5a5a;line-height: 38px;
}
/二級菜單外部容器樣式/
.menu dd{ position: absolute;width: 100%;top:39px; left:0;z-index:999;}
/二級菜單普通樣式/
.menu li{
font-size: 14px; line-height: 34px;color: #575757;height: 34px;display: block;padding-left: 8px;
background-color: #fff;border-bottom: 1px solid #dbdbdb;
}
查看效果,接下來實現點擊事件。
如圖
靜態菜單
3.dt綁定點擊事件tapMainMenu,flag控制顯隱toggle,提供2個class,hidden與show,來控制顯隱。注:dt也是可以bindTap的,不單是view。
/ 顯示與隱藏 /
.show {
display: block;
}
.hidden {
display: none;
}
web前端開發http://www.51xuediannao.com/
4.關閉所有一級菜單,每個一級菜單都有一個index標識,由tapMainMenu事件傳遞過去,與數組subMenuDisplay一一對應,當前元素subMenuDisplay[index]視原來狀態決定是顯示或隱藏。
核心代碼:
<dl class="menu">
<dt data-index="0" bindtap="tapMainMenu">價格</dt>
<dd class="{{subMenuDisplay[0]}}">
<ul><li>sub1</li><li>sub2</li></ul>
</dd>
</dl>
//使用function初始化array,相比var initSubMenuDisplay = [] 既避免的引用復制的,同時方式更靈活,將來可以是多種方式實現,個數也不定的
function initSubMenuDisplay() {
return [‘hidden’, ‘hidden’, ‘hidden’];
}
Page({
data:{
subMenuDisplay:initSubMenuDisplay()
},
tapMainMenu: function(e) {// 獲取當前顯示的一級菜單標識
var index = parseInt(e.currentTarget.dataset.index); // 生成數組,全為hidden的,只對當前的進行顯示
var newSubMenuDisplay = initSubMenuDisplay();// 如果目前是顯示則隱藏,反之亦反之。同時要隱藏其他的菜單
if(this.data.subMenuDisplay[index] == ‘hidden’) {
newSubMenuDisplay[index] = ‘show’;
} else {
newSubMenuDisplay[index] = ‘hidden’;
} // 設置為新的數組
this.setData({
subMenuDisplay: newSubMenuDisplay
});
}
});
5.選中二級菜單當前項,但給個系統icon及改變背景色,文本加粗,同樣改變一級菜單標題,demo中給出一個彈窗
聲明tapSubMenu方法,監聽二級點擊事件
//獲取當前顯示的一級菜單標識
tapSubMenu: function(e) {
var index = parseInt(e.currentTarget.dataset.index);
console.log(index); // 隱藏所有一級菜單
this.setData({
subMenuDisplay: initSubMenuDisplay()
});
}
加highlight效果
/二級菜單高亮樣式/
.menu li.highlight{
background-color: #f4f4f4;
}
與一級菜單不同,使用二維數組的方式實現點擊高亮,這樣才能定位到是某一級的某二級菜單,再決定顯示隱藏。 布局文件改成:
<dd class="{{subMenuDisplay[0]}}">
<ul>
<li class="{{subMenuHighLight[0][0]}}" data-index="0-0" bindtap="tapSubMenu">100以內</li>
<li class="{{subMenuHighLight[0][1]}}" data-index="0-1" bindtap="tapSubMenu">100-500</li>
<li class="{{subMenuHighLight[0][2]}}" data-index="0-2" bindtap="tapSubMenu">500-1000</li>
<li class="{{subMenuHighLight[0][3]}}" data-index="0-3" bindtap="tapSubMenu">1000-3000</li>
<li class="{{subMenuHighLight[0][4]}}" data-index="0-4" bindtap="tapSubMenu">3000以上</li>
</ul>
</dd>
效果如圖
使用二維數組的方式實現點擊高亮
相應的js代碼要寫成:
//聲明初始化高亮狀態數組function initSubMenuHighLight() { return [
[‘’,’’,’’,’’,’’],
[‘’,’’],
[‘’,’’,’’]
];
}
點擊事件
tapSubMenu: function(e) { // 隱藏所有一級菜單
this.setData({
subMenuDisplay: initSubMenuDisplay()
}); // 處理二級菜單,首先獲取當前顯示的二級菜單標識
var indexArray = e.currentTarget.dataset.index.split(‘-‘); console.log(“indexArray : “ + indexArray); var newSubMenuHighLight = initSubMenuHighLight(); // 與一級菜單不同,這里不需要判斷當前狀態,只需要點擊就給class賦予highlight即可
newSubMenuHighLight[indexArray[0]][indexArray[1]] = ‘highlight’; console.log(newSubMenuHighLight); // 設置為新的數組
this.setData({
subMenuHighLight: newSubMenuHighLight
});
}
這樣就實現了高亮與取消高亮。但還沒完,與一級菜單不同,這里與兄弟子菜單是非互斥的,也就是說點擊了本菜單,是不能一刀切掉兄弟菜單的高亮狀態的。于是我們改進js代碼。
聲明方式,改用變量形式,方便存儲。
//定義初始化數據,用于運行時保存
var initSubMenuHighLight = [
[‘’,’’,’’,’’,’’],
[‘’,’’],
[‘’,’’,’’]
];
點擊事件
tapSubMenu: function(e) { // 隱藏所有一級菜單
this.setData({
subMenuDisplay: initSubMenuDisplay()
}); // 處理二級菜單,首先獲取當前顯示的二級菜單標識
var indexArray = e.currentTarget.dataset.index.split('-'); // 初始化狀態
// var newSubMenuHighLight = initSubMenuHighLight;
for (var i = 0; i < initSubMenuHighLight.length; i++) { // 如果點中的是一級菜單,則先清空狀態,即非高亮模式,然后再高亮點中的二級菜單;如果不是當前菜單,而不理會。經過這樣處理就能保留其他菜單的高亮狀態
if (indexArray[0] == i) { for (var j = 0; j < initSubMenuHighLight[i].length; j++) { // 實現清空
initSubMenuHighLight[i][j] = '';
} // 將當前菜單的二級菜單設置回去
}
} // 與一級菜單不同,這里不需要判斷當前狀態,只需要點擊就給class賦予highlight即可
initSubMenuHighLight[indexArray[0]][indexArray[1]] = 'highlight'; // 設置為新的數組
this.setData({
subMenuHighLight: initSubMenuHighLight
});
}
有待完善功能點:
1.顯示與隱藏帶動畫下拉
2.抽象化,使用回調函數,將監聽每個二級菜單的點擊
3.數據源與顯示應當是分離的,一級與二級菜單的key value應該是獨立在外,系統只認index,然后對相應點擊作處理,跳轉頁面,篩選結果等
4.點擊二級菜單時,會將全部組的清除,有待修復
本文鏈接:微信小程序下拉菜單實例http://www.51xuediannao.com/xiaochengxu/1012112H016.html