先来看下效果图:
思路与步骤:
布局方面,整体使用dl来写,二级包在dd中,用ul li来写;交互方面,点击某一级菜单,关闭兄弟子菜单,点击某子菜单关闭所有菜单。
1.使用dt做出第一级菜单
2.使用dd嵌套第二级菜单,初始隐藏、position为absolute,使用z-index浮出页面层
- /*总菜单容器*/
- .menu {
- display: block;
- height: 38px;
- }
- /*一级菜单*/
- .menu dt {
- font-size: 15px;
- float: left;
- /*hack*/
- 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%;
- /*hack*/
- 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;
- }
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
- });
- }
- });