微信小程序自定义组件,底部弹出单选框,带动画
程序员文章站
2022-07-12 08:13:53
...
项目地址:https://github.com/inksnow/selectPopup
效果:
目录结构
可设置属性:
代码:
selectpopup.js
// components/selectpopup/selectpopup.js
//上次按钮点击时间
var lasttime = 0;
//按键防抖时间
var clickTime = 200;
Component({
/**
* 组件的属性列表
*/
properties: {
itemHeight: {
type: Number,
value:100
},
padding: {
type: Number,
value:15
},
radius: {
type: Number,
value:15
},
showExit: {
type: Boolean,
value:true
},
exitText: {
type: String,
value:"取消"
},
exitColor: {
type: String,
value:"#666666"
},
selectItemText: {
type: Array,
value: ["测试1", "测试2"]
},
selectItemTextColor: {
type: Array,
value: ["#576B95", "#576B95"],
},
outExit: {
type: Boolean,
value:false
},
mark: {
type: String,
value:"selectPopup"
},
},
/**
* 组件的初始数据
*/
data: {
//item高度,单位rpx
itemHeight: 100,
//padding
padding: 15,
//圆角
radius: 15,
//是否显示取消按钮
showExit: true,
//取消按钮文字
exitText: "取消",
//取消按钮文字颜色
exitColor: "#666666",
//item内容,数组
selectItemText: ["测试1", "测试2"],
//item文字颜色,数组,不设置默认#576B95
selectItemTextColor: ["#576B95", "#ff0000"],
popupSelectDisplay: "hidden",
//点击空白区域是否取消显示
outExit:false,
//组件标识
mark:"selectPopup",
},
/**
* 组件的方法列表
*/
methods: {
click: function (e) {
//获取点击时间
let d = new Date();
let nowtime = d.getTime();
if (nowtime - lasttime > clickTime) {
lasttime = nowtime;
let index = parseInt(e.currentTarget.id.replace("list_", ""));
console.log(index)
this.closePopup('selectPopupItemClick', [ index,this.data.mark ])
}
},
exitClick: function (e) {
//获取点击时间
let d = new Date();
let nowtime = d.getTime();
if (nowtime - lasttime > clickTime) {
lasttime = nowtime;
switch (e.currentTarget.id) {
case "out":
if(this.data.outExit){
this.closePopup('selectPopupExit', [ -1,this.data.mark ])
}
break;
case "cancel":
this.closePopup('selectPopupExit', [ -1,this.data.mark ])
break;
}
}
},
show(selectItemText,selectItemTextColor){
var that = this
that.setData({
selectItemText: selectItemText,
selectItemTextColor:selectItemTextColor,
})
this.openPopup()
},
//打开弹窗
openPopup() {
var query = this.createSelectorQuery()
var that = this
query.select('#popup_select_content').boundingClientRect(function (res) {
var screenH = res.height;
that.setData({
popupSelectDisplay: "visible",
})
that.animation_select = wx.createAnimation({
duration: 300,
timingFunction: 'ease',
delay: 0,
transformOrigin: 'left top 0',
})
that.animation_select.translate(0, -screenH).step()
that.setData({
//输出动画
animation_select: that.animation_select.export()
})
}).exec();
},
//关闭弹窗
closePopup(event,detail) {
//实例化一个动画
var that = this
that.animation_select = wx.createAnimation({
// 动画持续时间,单位ms,默认值 400
duration: 300,
timingFunction: 'ease',
// 延迟多长时间开始
delay: 0,
transformOrigin: 'left top 0',
})
that.animation_select.translate(0, 0).step()
that.setData({
//输出动画
animation_select: that.animation_select.export()
})
setTimeout(function () {
that.setData({
popupSelectDisplay: "hidden",
})
this.triggerEvent(event,detail,{})
}.bind(this), 300)
}
}
})
json
{
"component": true,
"usingComponents": {}
}
wxml
<!--components/selectpopup/selectpopup.wxml-->
<!-- start -->
<view class="popup_select_bg" style=" visibility:{{popupSelectDisplay}}" id="out" bindtap='exitClick'>
<view class="popup_select_content_bg " style="padding:{{padding}}rpx" id="popup_select_content" animation="{{animation_select}}">
<view class="popup_select_content_top" style="border-bottom-left-radius: {{padding== 0 ? '0':radius}}rpx;border-bottom-right-radius: {{padding== 0 ? '0':radius}}rpx; border-top-left-radius:{{radius}}rpx;border-top-right-radius:{{radius}}rpx;">
<view class="popup_select_item_bg" style="height:{{itemHeight}}rpx" wx:for="{{selectItemText}}" wx:key="selectItemText" >
<view class="popup_select_item_view" id="list_{{index}}" bindtap='click' hover-class="click_hover" hover-stay-time="100" style="color:{{selectItemTextColor[index]}}"> {{item}} </view>
<view class="popup_select_item_splitLine" hidden="{{(index+1)==selectItemText.length? true:false}}" />
</view>
</view>
<view class="popup_select_item_splitLine" hidden="{{((padding== 0)&showExit) ? false:true}}" />
<view class="popup_select_content_exit" hidden="{{!showExit}}" style="margin-top: {{padding== 0 ? '0':padding}}rpx; border-radius: {{padding== 0 ? '0':radius}}rpx;">
<view class="popup_select_item_bg" style="height:{{itemHeight}}rpx">
<view class="popup_select_item_view" id="cancel" bindtap='exitClick' hover-class="click_hover" hover-stay-time="100" style="color:{{exitColor}}"> {{exitText}} </view>
</view>
</view>
</view>
</view>
<!-- end -->
wxss
/* components/selectpopup/selectpopup.wxss */
.popup_select_bg{
position: absolute;
/* display: flex;
justify-content: end;
align-items:center;
flex-direction: column-reverse; */
height: 100%;
width: 100%;
background: rgba(100, 100, 100, 0.4);
z-index: 9999;
}
.popup_select_content_bg{
position: absolute;
display: flex;
flex-direction: column;
justify-content: center;
align-items:center;
height: auto;
padding: 20rpx;
width: 100%;
top: 100%;
box-sizing: border-box;
}
.popup_select_content_top{
display: flex;
justify-content: end;
align-items:center;
flex-direction: column;
height: auto;
width: 100%;
border-bottom-left-radius: 15rpx;
border-bottom-right-radius: 15rpx;
border-top-right-radius: 15rpx;
border-top-left-radius: 15rpx;
background-color: #ffffff;
}
.popup_select_content_exit{
display: flex;
justify-content: end;
align-items:center;
flex-direction: column;
height: auto;
width: 100%;
margin-top: 20rpx;
border-radius: 15rpx;
background-color: #ffffff;
}
.popup_select_item_view{
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.popup_select_item_bg{
width: 100%;
height: 100rpx;
display: flex;
justify-content: center;
align-items: center;
color: #576B95;
flex-direction: column;
}
.popup_select_item_splitLine {
height: 1px;
width: 100%;
background:linear-gradient(to left,#ffffff,#dddddd,#ffffff);
}
.click_hover{
opacity: 0.5;
}
使用
index.js
// pages/index/index.js
var selectPopup;
var textArray = ["测试1","测试2","测试3","测试4","测试5","测试6","测试7"];
var textArrayColor = ["#576B95","#576B95","#576B95","#576B95","#576B95","#666666","#ff0000"];
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
selectPopup = this.selectComponent("#selectpopup");
},
showPopup(){
selectPopup.show(textArray,textArrayColor);
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
},
selectPopupItemClick:function(e){
console.log(e)
console.log("选择的item下标:"+e.detail[0])
console.log("组件标识:"+e.detail[1])
},
selectPopupExit:function(e){
console.log(e)
console.log("点击了取消或空白区域取消")
console.log("组件标识:"+e.detail[1])
}
})
json
{
"usingComponents": {
"selectpopup": "/components/selectpopup/selectpopup"
}
}
wxml
<view class="selectpopup_bg">
<selectpopup id="selectpopup" bind:selectPopupItemClick="selectPopupItemClick"
bind:selectPopupExit="selectPopupExit"></selectpopup>
</view>
<button type="primary" bindtap="showPopup" style="margin-top: 30rpx;"> SelectPopup </button>
wss
.selectpopup_bg{
height: 100%;
width: 100%;
position: absolute;
top: 0;
}