手风琴效果_小程序-实现折叠面板

本文介绍了如何在微信小程序中不依赖UI库,手动创建一个折叠菜单(手风琴效果)。通过WXML和WXSS代码展示实现过程,利用CSS的`display:none`控制子选项的显示和隐藏,同时在列表点击事件中更新数据状态,达到切换展开和收缩的效果。示例代码详细解释了逻辑,帮助开发者理解实现细节。
摘要由CSDN通过智能技术生成

背景
无论是在小程序还是 h5 网页,折叠菜单,手风琴是一个非常常见的效果,如今也有很多现成的 UI 组件库已经实现了这一效果的,但有时候在写原生小程序时,单单就是一个折叠菜单效果,却要引入整个 UI 库,有点得不偿失

以下就自己手动实现一个的
在这里插入图片描述
具体实现
如下是wxml示例代码

<view class="content">
  <block wx:for="{{ listDatas }}" wx:key="index">
    <view class="list-content" bindtap="onListClick" data-index="{{ index }}">
      <view>
        <text>{{ item.list_name }}</text>
      </view>
      <view>
        <iconfont
          class="iconfont {{selected[index] ? 'icon-arrow-down' : 'icon-right'}}"
        ></iconfont>
      </view>
    </view>
    <view class="list-text {{selected[index] ? '' : 'hidden-content'}}">
      <view>
        <text selectable="true">{{ item.list_content }}</text>
      </view>
    </view>
  </block>
</view>

如下是wxss示例代码

.content {
  padding: 15rpx 15rpx 0 15rpx;
  font-size: 30rpx;
  color: #808080;
}
 
.list-content {
  display: flex;
  justify-content: space-between;
  text-align: center;
  line-height: 60rpx;
  border-bottom: 1rpx solid #ddd;
}
 
.list-text {
  padding-top: 15rpx;
  transition: all 0.5s ease;
  text-indent: 40rpx;
  display: block;
}
 
.hidden-content {
  // 主要利用的是display:none实现隐藏
  display: none;
}

如下是折叠菜单逻辑代码

Page({
  /**
   * 页面的初始数据
   */
  data: {
    selected: [false, false, false, false, false], // // 这里表示列表项是否展开,默认初始时此数组的元素全为fasle,表示都没展开
    active: null, // 当前展开的项的index值
    listDatas: [
      {
        list_name: '简介',
        list_content:
          '一个靠前排的90后帅小伙,具有情怀的技匠,路上正追逐斜杠青年的践行者',
      },
 
      {
        list_name: '开发者',
        list_content: '随笔川迹',
      },
 
      {
        list_name: '微信ID',
        list_content: 'suibichuanji',
      },
 
      {
        list_name: '微信公众号',
        list_content: 'itclanCoder',
      },
 
      {
        list_name: '其他业务',
        list_content:
          '广告文案策划编写/短视频制作(特效,后期视频处理)/配音/公众号代运营',
      },
    ],
  },
 
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function(options) {},
 
  // 点击列表,收缩与展示
  onListClick(event) {
    let index = event.currentTarget.dataset.index;
    let active = this.data.active;
 
    this.setData({
      [`selected[${index}]`]: !this.data.selected[`${index}`],
      active: index,
    });
 
    // 如果点击的不是当前展开的项,则关闭当前展开的项
    // 这里就实现了点击一项,隐藏另一项
    if (active !== null && active !== index) {
      this.setData({
        [`selected[${active}]`]: false,
      });
    }
  },
});

如上代码就可以实现手风琴的效果,主要利用的是css中的display:none,默认的一些子选项是隐藏的,然后列表的数据的名称以及要展示的内容放在一个数组listDatas中,随后,循环列表渲染

在列表中绑定点击事件,在元素上设置data属性,在事件对象中就可以获取到,最终通过setData修改数据,以达到实现手风琴的效果

结语
实现这个手风琴,主要还是在怎么控制子选项的一个状态selected,通过列表的索引,然后进行控制selected的状态,实现子项列表内容的显示和隐藏

实现微信小程序中的手风琴效果,你可以使用小程序的组件和动画来完成。下面是一个简单的示例代码,供你参考: 1. 在 wxml 文件中添加一个手风琴容器和多个手风琴项: ```html <view class="accordion"> <view class="item" wx:for="{{accordionItems}}" wx:key="index" bindtap="toggleAccordion"> <view class="title">{{item.title}}</view> <view class="content {{item.open ? 'open' : ''}}">{{item.content}}</view> </view> </view> ``` 2. 在 wxss 文件中定义手风琴的样式: ```css .accordion { border: 1px solid #ccc; } .item { border-top: 1px solid #ccc; } .title { padding: 10rpx; font-weight: bold; } .content { padding: 10rpx; max-height: 0; overflow: hidden; transition: max-height 0.3s ease-out; } .open { max-height: 9999rpx; /* 设置合适的高度 */ } ``` 3. 在 js 文件中定义手风琴的数据和交互逻辑: ```javascript Page({ data: { accordionItems: [ { title: '手风琴项1', content: '内容1', open: false }, { title: '手风琴项2', content: '内容2', open: false }, // 添加更多手风琴项... ] }, toggleAccordion(e) { const index = e.currentTarget.dataset.index; const accordionItems = this.data.accordionItems; accordionItems[index].open = !accordionItems[index].open; this.setData({ accordionItems: accordionItems }); } }); ``` 这样,当用户点击手风琴项的标题时,对应的内容区域将展开或收起。你可以根据需要自定义样式和动画效果来实现更复杂的手风琴效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值