微信小程序下拉菜单实例

article/2025/10/8 6:23:24


微信小程序下拉菜单实例

 微信小程序下拉菜单思路与步骤:

布局方面,整体使用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.点击二级菜单时,会将全部组的清除,有待修复

微信小程序下拉菜单实例

 微信小程序下拉菜单思路与步骤:

布局方面,整体使用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://chatgpt.dhexx.cn/article/ayQPTveK.shtml

相关文章

微信小程序实现上拉下拉菜单

问题 在使用小程序的时候基本的页面的一般都是很简洁的&#xff0c;所以会有一些菜单来做简单的诠释说明&#xff0c;或者是提供一些选项。这些菜单的弹出方式一般是向上和向下&#xff0c;那么如何来设置这些上下拉的菜单呢&#xff1f; 方法 上下拉菜单在微信小程序中起提示、…

微信小程序例子——下拉列表

1、效果展示 2、关键代码 .js文件 Page({data:{// text:"这是一个页面"open:false},showitem:function(){this.setData({open:!this.data.open})},onLoad:function(options){// 页面初始化 options为页面跳转所带来的参数},onReady:function(){// 页面渲染完成},onS…

uni-app微信小程序——下拉多选框

插件来自&#xff1a;select-cy - DCloud 插件市场 1、组件代码 <template><view class"uni-select-cy" :style"{ z-index: zindex }"><view class"uni-select-cy-select" :class"{ active: active }" click.stop&quo…

微信小程序下拉框选择

wxml代码 <view classtop-selected bindtapbindShowMsg><text>{{grade_name}}</text> </view> <!-- 下拉需要显示的列表 --> <view class"select_box" wx:if"{{select}}"><view wx:for"{{grades}}" wx:…

微信小程序——自定义下拉框

微信小程序本身并没有自带的下拉框组件&#xff0c;我们可以通过view标签自定义一个下拉框。(仅供参考&#xff09; 目录 文件目录实现效果实现逻辑设置数据设置默认选项实现弹出下拉框提供选项值设置所选值 源码wxmlwxssjs 文件目录 文件的功能&#xff1a; xxx.js&#xff…

小程序如何实现下拉选项操作

wxml文件代码 <picker class"picker" mode"selector" bindchange"bindAccountChange" value"{{accountIndex}}" range-key"label"range"{{accounts}} "><view class"weui-select">{{accou…

小程序下拉列表框菜单

小程序下拉列表框菜单 <view classtop><view classtop-text> 选择班别</view><!-- 下拉框 --><view classtop-selected bindtapbindShowMsg><text>{{grade_name}}</text><image src/images/xia.png></image></view&…

微信小程序的简单下拉框组件

网上的下拉框组件都不是自己想要的于是就自己写了一个。 wxml 原代码上传竟然显示不出来&#xff0c;wxml只能截图了&#xff0c;然后是js部分 data: { dropdownData:[“综合排序”,”行政区”,”商业圈”],//下拉框的数组 selectData: [‘默认排序’, ‘距离我最近’, …

微信小程序组件 —— 树形下拉框

因为项目需求&#xff0c;需要一个树形下拉选择框&#xff0c;参考了网上的树形结构整理出了这样一个效果图 下载地址&#xff1a;wx_treeSelect下载 其实主要还是参考了treeview的递归思想 微信小程序实现简单的树形图treeview 绘制出下拉框内的内容&#xff0c;在加个状态判…

微信小程序 一个简单的select下拉框

微信小程序 一个简单的select下拉框 用的是transform过渡&#xff0c;没用动画 看看效果 废话不多说&#xff0c;直接上代码 wxml: <view class"item"><label class"first"><text>*</text>公司/商户类型&#xff1a;</labe…

微信小程序下拉选项框

效果图 test.js /*** 页面的初始数据*/data: {shows: false, //控制下拉列表的显示隐藏&#xff0c;false隐藏、true显示selectDatas: [消费账户, 平台返利账户, 微信钱包], //下拉列表的数据indexs: 0, //选择的下拉列 表下标,},// 点击下拉显示框selectTaps() {this.setDa…

微信小程序select下拉框实现。

小程序中是没有h5中的下拉 标签的 所以要实现下拉功能就必须自己动手写拉 这里为了更清楚的显示层级 就把源码直接复制过来了 <view classlist-msg><view classlist-msg1><text>商品金额</text><text>&#xffe5;99.00</text></view&…

微信小程序之select下拉框

wxml&#xff1a; <view class"classify-kuangjia"><view class"classify-kuangjia2"><view>商品分类:</view><!-- 下拉框 --><view classclassify bindtapbindShowMsg><text>{{grade_name}}</text><…

微信小程序原生的下拉框组件

前言 近日开发微信小程序时&#xff0c;需要一个下拉框的组件&#xff0c;使用和PC端下拉框一样的方式会显得很丑&#xff0c;于是发现微信官方API有个wx.showActionSheet&#xff0c;但是有诸多限制&#xff0c;例如&#xff1a;最大长度只能是6项&#xff0c;多选等等。 由…

微信小程序实现下拉菜单效果

问题 下拉菜单在各类网页&#xff0c;app或者小程序中都是比较常见的输入控件。下拉菜单的下拉选项的多少可以根据自身需求进行调节&#xff0c;常运用于时间范围选择&#xff0c;地点区域选择&#xff0c;价格区间选择&#xff0c;等等。提供下拉菜单的目的是帮助用户更快更准…

使用微信小程序做一个简易的下拉框,无动画效果,纯原生写法(下拉列表框)

最近在开发的时候&#xff0c;需要使用下拉的效果&#xff0c;但是之前并没有进行书写过&#xff0c;今天做一个简单的demo&#xff0c;来记录一下微信小程序开发的下拉框效果。 微信小程序和jquery最大的区别就是是否操作dom&#xff0c; 微信小程序无需操作dom&#xff0c;可…

微信小程序下拉选择

微信小程序中下拉框选择一般的交互方式有以下两种 直接下拉选择点击选择框后&#xff0c;弹出浮层进行选择 下边分别介绍两种方式的实现。在微信小程序中&#xff0c;这两种实现都需要修改三个文件 js 文件&#xff1a;下拉选择逻辑的具体实现 wxml 文件&#xff1a;下拉组件…

小程序——下拉选择框组件

一、效果 二、说明 最近在开发微信小程序&#xff0c;但是用的lin-ui和vant 都没有下拉选择框组件。在网上搜索一番后&#xff0c;发现了一个挺简单且很好用的下拉框组件。 链接在这里&#xff1a;https://blog.csdn.net/WeiflR10/article/details/121494131 原文中是直接写入…

微信小程序实现下拉框功能

微信小程序里没有和HTML里的下拉框一样的组件&#xff0c;想要相同的效果只能自己写一个&#xff0c;先看效果 下面来看一下代码&#xff1a; 首先WXML <view classselect_box><view classselect catchtapselectTap><text classselect_text>{{selectData[i…

小程序登录详解

小程序登录简单分为以下几步&#xff1a; 使用wx.login获取code值获取code值后再加 AppID appsecret code 传给后端后端调接口 拿到 seesion_key openid 返回 token前端存储token 小程序登录的三个角色 小程序 用户使用客户端 由于小程序运行在微信之上 因此小程序可以通过…