微信小程序做下拉菜单

本文介绍了如何在微信小程序中创建一个下拉菜单。通过点击大标题显示子菜单,再次点击子菜单则使其消失。主要涉及内容包括静态结构和样式的设定,以及JavaScript交互逻辑的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这种简单的下拉菜单点击对应大标题弹出子菜单,点击子菜单,子菜单消失。

这里写图片描述

首先把静态的写出来:

<view class="item_nav_set">
  <view catchtap='item_nav_set_list_display' data-index='0' class="item_nav_set_list {{item_nav_set_list_light[0]}}">
      <view>排序类型</view>
  </view>
  <view catchtap='item_nav_set_list_display' data-index='1' class="item_nav_set_list {{item_nav_set_list_light[1]}}" >
      <view>排序方式</view>
  </view>
</view>
<view class="item_nav_set_list_content {{sort_status[0]}}" >
  <view data-index='0_0' catchtap='item_nav_set_list_content_display' class='{{item_nav_set_list_content_light[0][0]}}'>时间</view>
  <view data-index='0_1' catchtap='item_nav_set_list_content_display' class='{{item_nav_set_list_content_light[0][1]}}'>热度</view>
  <view data-index='0_2' catchtap='item_nav_set_list_content_display' class='{{item_nav_set_list_content_light[0][2]}}'>喜欢</view>
  <view data-index='0_3' catchtap='item_nav_set_list_content_display' class='{{item_nav_set_list_content_light[0][3]}}'>评论</view>
</view>
<view class="item_nav_set_list_content {{sort_status[1]}}">
  <view data-index='1_0' catchtap='item_nav_set_list_content_display' class='{{item_nav_set_list_content_light[1][0]}}'>正序</view>
  <view data-index='1_1' catchtap='item_nav_set_list_content_display' class='{{item_nav_set_list_content_light[1][1]}}'>倒序</view>
</view>

wxss:

//主要的就是都设定位,设好z-index层级关系。
.item_nav_set{
  height: 45px;
  width: 100%;
  flex-direction:row;
  background-color: #B0BEC5;
  position: absolute;
  top: 40px;
  z-index: 999;
}
.item_nav_set_list{
  display: inline-block;
  width: 50%;
  text-align: center;
  line-height: 45px;
  color: #ffffff;
}
//这个是主菜单子菜单的高亮。
.item_nav_set_list_light{
  color: #00E5FF ! important;
}
.item_nav_set_list_content_light{
  color: #00E5FF ! important;
  background-color: #CFD8DC! important;
}
//一开始让子菜单消失。用的transform。
.item_nav_set_list_content{
  padding-top: 85px;
  width: 100%;
  z-index: 1;
  position: absolute;
  transition: transform .8s;
  transform:  translateY(-100%);
}
.item_nav_set_list_content>view{
  height: 40px;
  line-height: 40px;
  color: #c0c0c0;
  text-align: center;
  background-color: #ECEFF1;
  border-bottom: 1px solid #fff;
}
/* 标题栏下拉菜单 */
//这里是显示和隐藏。
.sort_show{
  transform: translateY(0);
  -webkit-transform: translateY(0);
}
.sort_hide{
  transform: translateY(-100%);
  -webkit-transform: translateY(-100%);
}

先别管这个js,只看结构和样式。不用解释我觉得。


写完静态的就开始写js:

//item.js
//获取应用实例
const app = getApp()
//下面这三个函数,就是初始化状态的。
function sort_display (){
  return ['sort_hide','sort_hide'];
}
function item_nav_set_list_light() {
  return ['',''];
}
function item_nav_set_list_content_light() {
  return [
    ['', '', '', ''],
    ['', '']
  ];
}
Page({
  data: {
  //这里是存储数据的地方,把改变过的东西放在这里。
  //主菜单高亮
    item_nav_set_list_light: item_nav_set_list_light(),
    //储存子菜单显示与否
    sort_status: sort_display(),
//    子菜单高亮
    item_nav_set_list_content_light: item_nav_set_list_content_light(),
  },
  //事件处理函数

  // 点击排序设置
  //这个是点击主菜单触发的函数
  item_nav_set_list_display:function (e){
//  首先获取一下,点击的信息,下面这行就是得出点击的哪个主菜单
    var index = parseInt(e.currentTarget.dataset.index);  
//   将初始化的状态获取到。   
//因为思路是点击一个主菜单,然后将所有子菜单隐藏,然后在对点击的主菜单
//下的子菜单进行显示处理 。所以获取初始化状态就是隐藏所有子菜单的动作。
//因为最后是将这个值赋值给data中的数据
//页面根据data这种的数据做出改变。
    var new_sort_display = sort_display();
    var new_item_nav_set_list_light = item_nav_set_list_light();
    //if判断状态,然后做出响应动作
    if (this.data.sort_status[index] == 'sort_hide') {
      new_sort_display[index] = 'sort_show';
      new_item_nav_set_list_light[index] = 'item_nav_set_list_light';
    } else {
      new_sort_display[index] = 'sort_hide';
      new_item_nav_set_list_light[index] = '';
    }     
    //最后将值赋给data
    this.setData({
      sort_status: new_sort_display,
      item_nav_set_list_light: new_item_nav_set_list_light
    });
  },
//下面这个同理,就不罗嗦了。
// 点击排序设置内容
  item_nav_set_list_content_display:function (e){
    var new_sort_display = sort_display();
    var new_item_nav_set_list_content_light = item_nav_set_list_content_light();
    var indexArray = e.currentTarget.dataset.index.split('_'); 
    if (indexArray[0] == 0){
      new_item_nav_set_list_content_light[0][indexArray[1]] = 'item_nav_set_list_content_light';
      new_item_nav_set_list_content_light[1] = this.data.item_nav_set_list_content_light[1];
    } else if (indexArray[0] == 1){
      new_item_nav_set_list_content_light[1][indexArray[1]] = 'item_nav_set_list_content_light';
      new_item_nav_set_list_content_light[0] = this.data.item_nav_set_list_content_light[0];
    }
    this.setData({
      sort_status: new_sort_display,
      item_nav_set_list_content_light: new_item_nav_set_list_content_light
    });
    console.log(new_item_nav_set_list_content_light);
  }
})

我把东西都写在注释里了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值