微信小程序实现弹出菜单功能
程序员文章站
2022-08-05 10:06:34
需求
点击标签栏按钮,向下弹出菜单,再次点击,收回菜单
要解决的问题
标签栏三栏样式,标签栏固定不动;
点击标签栏弹出菜单,并且出现透明遮罩...
需求
点击标签栏按钮,向下弹出菜单,再次点击,收回菜单
要解决的问题
- 标签栏三栏样式,标签栏固定不动;
- 点击标签栏弹出菜单,并且出现透明遮罩;
- 遮罩优先级在弹出框之下;
- 弹出框内标签的设置;
- 滚动栏滚动条的隐藏
如何解决?
- 弹性布局,横向,三者平分整栏;
- 状态监听点击事件,数据控制hide或者show,通过rgba设置透明度
- 弹出框设置z-index;
- 弹性布局flex 横向排列 超出后wrap 然后space-around控制间距
::-webkit-scrollbar { width: 0; height: 0; color: transparent; }
具体实现
wxml
<import src="../../templates/template" /> <view class="container {{ismask?'mask':''}}"> <view class="header"> <view class="filtercity {{status=='1' && isactive?'active':''}}" data-status='1' bindtap="changestatus"> <view class="city">城市筛选</view> <image src="{{status=='1' && isactive?'../../youzan-image/red-up.png':'../../youzan-image/down.png'}}" /> </view> <view class="filterjob {{status=='2' && isactive?'active':''}}" data-status='2' bindtap="changestatus"> <view class="job">职位筛选</view> <image src="{{status=='2' && isactive?'../../youzan-image/red-up.png':'../../youzan-image/down.png'}}" /> </view> <view class="filterorder {{status=='3'&& isactive?'active':''}}" data-status='3' bindtap="changestatus"> <view class="order">排序方式</view> <image src="{{status=='3' && isactive?'../../youzan-image/red-up.png':'../../youzan-image/down.png'}}" /> </view> </view> <block wx:if="{{isactive==true&&status=='1'}}"> <view class="citycontainer"> <block wx:for="{{city}}" wx:key="id" wx:for-index="index"> <view class="city {{isselect&&index==curindex?'select':''}}" data-index="{{index}}" bindtap="select">{{item}}</view> </block> </view> </block> <block wx:if="{{isactive==true&&status=='2'}}"> <scroll-view scroll-y="true" class="poscontainer"> <block wx:for="{{cur}}" data-index='index' wx:for-index='index' wx:key="index"> <view class="title">{{item.title}}</view> <view class="poscontent"> <view wx:for="{{item.types}}" wx:for-item="type" wx:key='id' wx:for-index="{{index}}" data-index="{{index}}"> <view class="tag {{isselect&&index==curindex?'select':''}}" data-id="{{id}}" bindtap="multiselect">{{type}}</view> </view> </view> </block> <view class="confirm"> <button class="weui-btn" type="warn">确认</button> </view> </scroll-view> </block> <block wx:if="{{isactive==true&&status=='3'}}"> <view class="ordercontainer"> <view class="block">智能排序</view> <view class="block">时间排序</view> <view class="block">薪资排序</view> </view> </block> <view class="listcontainer" > <view wx:for="{{joblist}}" wx:key="index" data-index="{{index}}"> <template is="list-item" data="{{...item}}" /> </view> </view> <view class="search " bindtap="search"> <image src="../../youzan-image/search.png" /> <text>搜索</text> </view> </view>
wxss
page { position: relative; width: 100%; height: 100vh; } .header { width: 100%; height: 80rpx; position: fixed; top: 0; display: flex; flex-direction: row; justify-content: space-between; text-align: center; color: #313131; font-size: 16px; border-bottom: 1rpx solid #eeeeee; z-index: 9999; background-color: #fff; } .filtercity { flex: 1; position: relative; height: 80rpx; line-height: 80rpx; } .filterjob { position: relative; flex: 1; height: 80rpx; line-height: 80rpx; } .filterorder { position: relative; flex: 1; height: 80rpx; line-height: 80rpx; } .header image { position: absolute; right: 15rpx; top: 26rpx; width: 30rpx; height: 30rpx; } .active { color: #ef0001; } .mask { width: 100%; height: 100%; position: fixed; top: 80rpx; background-color: rgba(15, 15, 26, 0.3); } .citycontainer { display: flex; flex-direction: row; justify-content: space-around; align-items: space-between; flex-wrap: wrap; width: 100%; height: 300rpx; z-index: 999; background-color: #fff; border-bottom: 1rpx solid #e9e9e9; padding-bottom: 130rpx; } .citycontainer .city { display: block; font-size: 15px; margin-top: 100rpx; width: 150rpx; height: 50rpx; line-height: 50rpx; text-align: center; border: 1rpx solid #e9e9e9; overflow: hidden; } .select { color: #ffffff; background-color: #ed0000; } .poscontainer { height: 980rpx; width: 100%; background-color: #fff; /* overflow:auto; */ } ::-webkit-scrollbar { width: 0; height: 0; color: transparent; } .title { margin-top: 55rpx; font-size: 15px; margin-left: 28rpx; } .poscontent { width: 100%; display: flex; flex-direction: row; justify-content: flex-start; flex-wrap: wrap; margin-top: -15rpx; } .tag { margin-left: 28rpx; margin-top: 23rpx; font-size: 13px; width: 150rpx; height: 50rpx; line-height: 50rpx; text-align: center; border: 1rpx solid #e9e9e9; } .confirm { width: 100%; height: 150rpx; border: 1rpx solid transparent; background-color: #fff; } .weui-btn { position: fixed; width: 95%; bottom: 52rpx; left: 50%; transform: translatex(-50%); } .ordercontainer { display: flex; flex-direction: row; justify-content: space-around; align-items: center; background-color: #fff; width: 100%; height: 125rpx; } .block { font-size: 13px; width: 200rpx; height: 50rpx; line-height: 50rpx; text-align: center; border: 1rpx solid #e9e9e9; } .search { position: fixed; bottom: 80rpx; background-color: #fff; right: 25rpx; width: 150rpx; height: 75rpx; line-height: 75rpx; text-align: center; border-radius: 35rpx; box-shadow: 1rpx 1rpx 7rpx 7rpx #f5f5f5; } .search image { width: 30rpx; height: 30rpx; } .search text { font-size: 15px; padding-left: 9rpx; color: #666666; } .listcontainer { width: 100%; height: 100%; margin-top: 80rpx; }
js
import category from '../../api/employ' import joblist from '../../api/detail' page({ data: { curindex: '', isactive: false, joblist:[], cur: [], job: [], isshow: true, status: 0, ismask: false, isselect: false, city: ['全国', '杭州', '北京', '深圳', '上海', '广州', '武汉', '重庆'] }, changestatus(e) { let status = e.currenttarget.dataset.status; let cur = category; this.setdata({ isactive: !this.data.isactive, status: status, ismask: !this.data.ismask, cur: cur, }) }, select(e) { let curindex = e.currenttarget.dataset.index; this.setdata({ isselect: " curindex == this.data.curindex ? '!this.data.isactive' : 'true' ", isactive: false, ismask:false, curindex: curindex, }) }, multiselect(e){ let multiindex=e.currenttarget.dataset.index; this.setdata({ isselect:!this.data.isselect, curindex:multiindex }) }, search(e) { wx.navigateto({ url: '../search/search', }) }, onload: function (e) { this.setdata({ joblist:joblist }) }, click:function (e) { let id =e.currenttarget.dataset.id; wx.navigateto({ url: `../detail/detail?id=${id}`, }) } })
总结
以上所述是小编给大家介绍的微信小程序实现弹出菜单功能,希望对大家有所帮助