微信小程序之多級(jí)聯(lián)動(dòng)菜單

介紹

多級(jí)聯(lián)動(dòng)菜單在許多的篩選場(chǎng)景應(yīng)用十分廣泛。

動(dòng)手操作

先看看效果圖:


menu_full.gif
  • 總體布局

總體布局.png

menu.wxml

<view class="menu">
  <!-- 菜單導(dǎo)航 -->
  <view class="menu_navi">
    <view class="menu_navi_item" >
      <text>游戲</text>
    </view>
    <view class="menu_navi_item">
      <text>體育</text>
    </view>
    <view class="menu_navi_item">
      <text>電影</text>
    </view>
  </view>
  <!-- 某個(gè)菜單的內(nèi)容 -->
  <view class="menu_content">
    <view class="menu_one">
      <scroll-view class="left">
        <view class="left_item">左邊</view>
      </scroll-view>
      <scroll-view class="right">
        <view class="right_item">右邊</view>
      </scroll-view>
    </view>
    <view class="menu_two" wx:if="{{menu_two_show}}">
      <scroll-view class="left">
        <view class="left_item">左邊</view>
      </scroll-view>
      <scroll-view class="right">
        <view class="right_item">右邊</view>
      </scroll-view>
    </view>
    <view class="menu_three" wx:if="{{menu_three_show}}">
      <scroll-view class="left">
        <view class="left_item">左邊</view>
      </scroll-view>
      <scroll-view class="right">
        <view class="right_item">右邊</view>
      </scroll-view>
    </view>
    <!-- 陰影部分 -->
    <view class="surplus"></view>

menu.wxss

.menu{
  position: fixed; /*固定位置*/
  top: 0rpx;
  left: 0rpx;
  width: 100%;
  display: flex;
  flex-direction: column;
}
  • 分模塊進(jìn)行開(kāi)發(fā)

1、菜單導(dǎo)航

menu.jsp

<!--菜單導(dǎo)航-->
<view class="menu_navi">
  <view class="menu_navi_item {{ menu_one_show ? 'menu_select':''}}"  bindtap="menuOne" >
    <text>游戲</text>
    <icon class="iconfont {{ menu_one_show ? 'icon-unfold':'icon-fold'}}"></icon>
  </view>
  <view class="menu_navi_item {{ menu_two_show ? 'menu_select':''}}"  bindtap="menuTwo">
    <text>體育</text>
    <icon class="iconfont {{ menu_two_show ? 'icon-unfold':'icon-fold'}}"></icon>
  </view>
  <view class="menu_navi_item {{ menu_three_show ? 'menu_select':''}}"  bindtap="menuThree">
    <text>電影</text>
    <icon class="iconfont {{ menu_three_show ? 'icon-unfold':'icon-fold'}}"></icon>
  </view>
</view>

menu.wxss

.menu_navi{
  display: flex;
  flex-direction: row;
  width: 100%;
}

.menu_navi_item{
  display: flex;
  flex-direction: row;
  justify-content: center; /*主軸居中  水平*/
  align-items: center; /*側(cè)軸居中 垂直*/
  border: 1rpx solid #DCDCDC;
  font-size: 30rpx;
  width: 35%;
  height: 80rpx;
}
/*菜單導(dǎo)航欄選中時(shí),出現(xiàn)此樣式*/
.menu_select{
  color: brown;
  background-color: springgreen;
}

menu.js

Page({
  data: {
    //游戲、體育、電影的顯示與隱藏控制參數(shù)
    menu_one_show: false, //控制菜單一的內(nèi)容
    menu_two_show: false, //控制菜單二的內(nèi)容
    menu_three_show: false, //控制菜單三的內(nèi)容
  },
/**
   * 選項(xiàng)卡的控制
   */
  //控制選項(xiàng)一
  menuOne: function () {
    var that = this;
    if (that.data.menu_one_show) { //說(shuō)明menu_one_show現(xiàn)在展開(kāi)屿讽,需要關(guān)閉
      that.setData({
        menu_one_show: false,
        menu_two_show: false,
        menu_three_show: false,
      })
    } else {
      that.setData({
        menu_one_show: true,
        menu_two_show: false,
        menu_three_show: false,
        select_left: select_left, //打開(kāi)菜單的時(shí)候,默認(rèn)選中的內(nèi)容
        select_left_content: that.data.menu_one_data[select_left],
        select_right: '',
      })
    }
  },
  //控制選項(xiàng)二
  menuTwo: function () {
    var that = this;
    if (that.data.menu_two_show) {
      that.setData({
        menu_one_show: false,
        menu_two_show: false,
        menu_three_show: false,
      });
    } else {
      for (var select_top in that.data.menu_two_data) break; //第二個(gè)菜單欄的上部默認(rèn)選中第一個(gè)吠裆,獲得的是json的key值
      var select_top_content = that.data.menu_two_data[select_top]; //默認(rèn)選中第一個(gè)后的內(nèi)容伐谈,提供下面進(jìn)行使用
      for (var select_left in select_top_content) break; //使用上面的內(nèi)容,左邊默認(rèn)選中的第一個(gè)试疙,而且也是獲得它的key值诵棵,
      var select_top_content = select_top_content[select_left]; //默認(rèn)選中左邊的時(shí)候,右邊的內(nèi)容進(jìn)行顯示祝旷。
      that.setData({
        menu_one_show: false,
        menu_two_show: true,
        menu_three_show: false,
        select_top: select_top, //上方默認(rèn)選擇
        select_top_content: that.data.menu_two_data[select_top], //選中上方之后履澳,下方的內(nèi)容
        select_left: select_left, //左邊的默認(rèn)選擇
        select_left_content: select_top_content, //選中左邊之后的,右邊的內(nèi)容
      });
    }

  },
  //控制選項(xiàng)三
  menuThree: function () {
    var that = this;
    if (that.data.menu_three_show) {
      that.setData({
        menu_one_show: false,
        menu_two_show: false,
        menu_three_show: false,
      })
    } else {
      that.setData({
        menu_one_show: false,
        menu_two_show: false,
        menu_three_show: true,
        select_left: select_left, //同游戲那個(gè)菜單
        select_left_content: that.data.menu_three_data[select_left],
        select_right: '',
      })
    }
  },

2怀跛、多余部分

menu.wxml

<!-- 陰影部分 -->
    <view class="surplus" wx:if="{{(menu_one_show)||(menu_two_show)||(menu_three_show)}}" bindtap="menuFlod"></view>

menu.wxss

.menu .surplus{
  width: 100%;
  height: 500rpx;
  background-color: grey;
  opacity: 0.8;
}

menu.js

// 點(diǎn)擊陰影部分距贷,菜單隱藏
  menuFlod: function () {
    var that = this;
    that.setData({
      menu_one_show: false,
      menu_two_show: false,
      menu_three_show: false,
    })
  },

4、具體菜單內(nèi)容

這里主要針對(duì)一個(gè)菜單欄進(jìn)行詳細(xì)講解吻谋,其余兩個(gè)原理相同忠蝗。
游戲
menu.wxml

<!-- 選項(xiàng)一 -->
<view class="menu_content">
  <view class="menu_one" wx:if="{{menu_one_show}}">
    <scroll-view class="left" scroll-y="true">
      <view class="left_item {{select_left == key? 'select_left':''}} " wx:for="{{menu_one_data}}" wx:for-index="key" data-index="{{key}}" data-navi="1" wx:key="{{key}}" bindtap="selectLeft">
        <text>{{key}}</text>
      </view>
    </scroll-view>
    <scroll-view class="right" scroll-y="true">
      <view class="right_item {{select_right == item? 'select_right':''}}" wx:for="{{select_left_content}}" data-index="{{item}}" wx:key="{{item}}" bindtap="selectRight">
        <text>{{item}}</text>
      </view>
    </scroll-view>
  </view>
</view>

這里推薦大家使用<scroll-view></scroll-view>組件,這樣超過(guò)限定的高度的話漓拾,就可以在內(nèi)部產(chǎn)生滾動(dòng)條阁最,整體布局不會(huì)亂。使用<scroll></scroll>組件的時(shí)候晦攒,記得要開(kāi)啟滾動(dòng)的方向(scroll-y表示縱向闽撤,scroll-x表示橫向)得哆,這些屬性默認(rèn)是關(guān)閉的脯颜。
menu.wxss

.menu_content{
  width: 97.3%;
  margin: 10rpx;
  background-color: white;
}

.menu_one{
  display: flex;
  flex-direction: row;
  width: 100%;
  height: 600rpx;
}

..menu_one .left{
  display: flex;
  flex-direction: column;
  width: 50%;
}

.menu_one .left .left_item{
  padding: 15rpx;
  line-height: 60rpx; /*設(shè)置成line-height自動(dòng)垂直居中*/
}

.menu_one .left .select_left{
  color: rgb(235, 79, 79);
  background-color: #DCDCDC;
}

.menu_one .right{
  display: flex;
  flex-direction: column;
  width: 50%;
}

.menu_one .right .right_item{
  padding: 15rpx;
  line-height: 55rpx;
  background-color: #DCDCDC;
}

.menu_one .right .select_right{
  color: rgb(235, 79, 79);
}

注意:使用豎向滾動(dòng)時(shí),需要給<scroll-view/>一個(gè)固定高度贩据,通過(guò) WXSS 設(shè)置 height栋操。
menu.js

data: {
    menu_one_data: {
      "熱門": ['冒險(xiǎn)島', '戀愛(ài)', '泡泡堂', '僵尸', '哆啦A夢(mèng)', '海綿寶寶', '喜羊羊與灰太狼', '經(jīng)營(yíng)', '射擊', '坦克', '合金彈頭', '棋牌', '巧虎', '斗地主', '麻將', '女生' ,'拳皇', '森林冰火人'],
      "益智": ['連連看', 'TD防守', '無(wú)敵連連看', '找茬', '模擬城市', '接水管', '斗地主', 'Nitrome', '對(duì)對(duì)碰', '華容道', '喜洋洋與灰太狼', '泡泡堂', '尋找小白人', '俄羅斯方塊'],
      "冒險(xiǎn)": ['乖乖豬世界', '靈動(dòng)', '男生', '魔域', '智能火柴人', '武林外傳', '小王子冒險(xiǎn)島', '外星人大冒險(xiǎn)', '神刀傳奇', '小小冒險(xiǎn)島', '肥貓?zhí)焓?, '黑暗僵尸倉(cāng)庫(kù)', '救人', '蜘蛛俠'],
      "戰(zhàn)爭(zhēng)": ['黑暗基地', '戰(zhàn)爭(zhēng)', '柏林飛機(jī)戰(zhàn)爭(zhēng)', '魔獸戰(zhàn)爭(zhēng)', '射擊', '史詩(shī)幻想戰(zhàn)役', '第一次世界大戰(zhàn)', '合金彈頭系列', '忍者與海盜', '火柴人戰(zhàn)爭(zhēng)', '冒險(xiǎn)王', '午夜僵尸大戰(zhàn)', '金剛狼'],
      "動(dòng)作": ['變態(tài)版', '松鼠大決戰(zhàn)', '李小龍', '中國(guó)功夫', '明星大亂斗', '瘋狂獨(dú)輪車大戰(zhàn)', '海綿寶寶空手道', '兔子殺戮', '拳皇wing', '悟空格斗', '火影忍者大亂斗', '泰拳小子'],
      "敏捷": ['小鳥(niǎo)', '神奇小妖怪相關(guān)', '冒險(xiǎn)', '死神', '祖瑪', '暴力拆除', '洛克人', '索尼克', '森林冰火人', '植物大戰(zhàn)僵尸相關(guān)', '模擬世界', '冒險(xiǎn)島', '黃金礦工', '動(dòng)作', '三國(guó)'],
      "女生": ['化妝', '換裝', '打扮', '寶貝', '發(fā)型設(shè)計(jì)', '芭比娃娃', '明星' ,'愛(ài)情測(cè)試', '甜心姐妹美發(fā)', '婚禮婚紗', '精靈換裝', '戀愛(ài)', '禮服' ,'可愛(ài)', '模擬世界', '開(kāi)店經(jīng)營(yíng)' ,'設(shè)計(jì)布置', '美女'],
      "專輯": ['動(dòng)漫', '游戲', '哆啦A夢(mèng)', '冒險(xiǎn)島系列', '虹貓藍(lán)兔', '火影忍者' ,'少年駭客', '蠟筆小新', '史酷比系列', '蝙蝠俠', '降世神通Avatar', '海賊王系列' ,'拼圖' ,'兒童', '西游記', '洛克人']
    },
    menu_three_data:{
      "喜劇": ['憨豆先生精選輯', '美麗人生', '福爾摩斯二世', '順其自然', '摩登時(shí)代', '城市之光', '三傻大鬧寶萊塢', '瘋狂動(dòng)物城', '大話西游', '尋子遇仙記', '淘金記'],
      "愛(ài)情": ['霸王別姬', '阿甘正傳', '美麗人生', '泰坦尼克號(hào)', '巴黎圣母院', '羅密歐與朱麗葉', '我愛(ài)你', '斷背山', '請(qǐng)以你的名字呼喚我', '幸福終點(diǎn)站'],
      "科幻": ['盜夢(mèng)空間', '星際穿越', '虛幻勇士', '蝙蝠俠:黑暗騎士', '楚門的世界', 'V字仇殺隊(duì)', '黑客帝國(guó)', '蝴蝶效應(yīng)', '人工智能'],
      "紀(jì)錄片": ['人生果實(shí)', '人生七年', '從納粹手中救出的孩子們', '克拉瑪依'],
      "家庭": ['東京物語(yǔ)', '燦爛人生', '摔跤吧!爸爸', '我的父親饱亮,我的兒子', '地上的星星', '大魚(yú)', '金色池塘', '歲月神偷'],
      "戰(zhàn)爭(zhēng)": ['辛德勒的名單', '戰(zhàn)爭(zhēng)與和平3', '鬼子來(lái)了', '沉靜如海', '革命往事', '法國(guó)大革命', '拯救大兵瑞恩', '勇敢的心', '亂'],
    },
    select_left: '', //默認(rèn)選中左邊框的內(nèi)容 (選中哪一項(xiàng))
    select_left_content:[], //選中左邊框--->右邊框的內(nèi)容
    select_right: '', //默認(rèn)選中右邊框邊框的內(nèi)容 (選中哪一項(xiàng))
  },
/**
   * 點(diǎn)擊左邊框
   */
  selectLeft: function (e) {
    var that = this;
    var select_left = e.currentTarget.dataset.index; //從wxml中傳過(guò)來(lái)的數(shù)據(jù)矾芙,表示選中那個(gè)key
    var select_left_content = []; //準(zhǔn)備接收右邊的內(nèi)容
    // 判斷是哪個(gè)菜單欄
    if ('1' == e.currentTarget.dataset.navi){
      select_left_content = that.data.menu_one_data[select_left];
    } else if ('2' == e.currentTarget.dataset.navi){
      select_left_content = that.data.select_top_content[select_left];
    } else {
      select_left_content = that.data.menu_three_data[select_left];
    }
    console.log(select_left_content);
    that.setData({
      select_left: select_left,
      select_left_content: select_left_content,
      select_right: '',
    })
  },
  /**
   * 點(diǎn)擊右邊框
   */
  selectRight: function(e){
    var that = this;
    var select_right = e.currentTarget.dataset.index;
    that.setData({
      select_right: select_right
    })
  },

menu.js部分主要的難點(diǎn)就是wxml和js之間的數(shù)據(jù)交互,這里很容易弄暈近上,尤其是對(duì)自己定義的變量弄清楚是什么意思剔宪。在這里小編畫(huà)了一個(gè)示意圖來(lái)講解這個(gè)難點(diǎn)。


菜單中的控制顯示

最后給大家提供該項(xiàng)目的github項(xiàng)目,直接抓下來(lái)就可以打開(kāi)使用葱绒,只需對(duì)顯示的數(shù)據(jù)進(jìn)行修改即可感帅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市地淀,隨后出現(xiàn)的幾起案子失球,更是在濱河造成了極大的恐慌,老刑警劉巖帮毁,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件实苞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡烈疚,警方通過(guò)查閱死者的電腦和手機(jī)黔牵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爷肝,“玉大人荧止,你說(shuō)我怎么就攤上這事〗捉#” “怎么了跃巡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)牧愁。 經(jīng)常有香客問(wèn)我素邪,道長(zhǎng),這世上最難降的妖魔是什么猪半? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任兔朦,我火速辦了婚禮,結(jié)果婚禮上磨确,老公的妹妹穿的比我還像新娘沽甥。我一直安慰自己,他們只是感情好乏奥,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布摆舟。 她就那樣靜靜地躺著,像睡著了一般邓了。 火紅的嫁衣襯著肌膚如雪恨诱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,584評(píng)論 1 312
  • 那天骗炉,我揣著相機(jī)與錄音照宝,去河邊找鬼。 笑死句葵,一個(gè)胖子當(dāng)著我的面吹牛厕鹃,可吹牛的內(nèi)容都是我干的兢仰。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼剂碴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旨别!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起汗茄,我...
    開(kāi)封第一講書(shū)人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秸弛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后洪碳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體递览,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年瞳腌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绞铃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嫂侍,死狀恐怖儿捧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挑宠,我是刑警寧澤菲盾,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站各淀,受9級(jí)特大地震影響懒鉴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碎浇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一临谱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奴璃,春花似錦悉默、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鞭缭,卻和暖如春剖膳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岭辣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甸饱,地道東北人沦童。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓仑濒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親偷遗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子墩瞳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1.小程序起步 (1)點(diǎn)擊https://mp.weixin.qq.com/wxopen/waregister?a...
    GXW_Lyon閱讀 3,381評(píng)論 0 0
  • 每天的學(xué)習(xí)記錄喉酌,可能有的地方寫(xiě)的不對(duì),因?yàn)閯倢W(xué)泵喘,以后發(fā)現(xiàn)錯(cuò)的話會(huì)回來(lái)改掉整體流程 https://develope...
    有點(diǎn)健忘閱讀 4,692評(píng)論 0 7
  • 前言 微信之父張小龍?jiān)谀瓿醯哪谴窝葜v中曾表示:“我自己是很多年的程序員泪电,我覺(jué)得我們應(yīng)該為開(kāi)發(fā)的團(tuán)隊(duì)做一些事情”。幾...
    4638d5195a5f閱讀 1,390評(píng)論 0 2
  • 因新工作主要負(fù)責(zé)微信小程序這一塊纪铺,最近的重心就移到這一塊相速,該博客是對(duì)微信小程序整體的整理歸納以及標(biāo)明一些細(xì)節(jié)點(diǎn),初...
    majun00閱讀 7,348評(píng)論 0 9
  • 祺和楠是一所普通高中的同學(xué)鲜锚,那時(shí)的他們并不熟悉突诬,在祺眼里,楠是個(gè)羞澀的女生芜繁,不愛(ài)說(shuō)話旺隙,總是坐在班里的后面低著...
    希漪閱讀 128評(píng)論 0 0