匿名通过本文主要向大家介绍了小程序 动画等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
小程序不知从何时火起来的,很多人都入坑了吧,对于搞开发的小伙伴来说,不管是android,ios,还是很流行的微信小程序,
都会发现官方提供的原生控件已经不能完全满足我们的开发需求,所以本文介绍的就是一个自定义的微信小程序组件(modal弹窗组件),
先来一张图。
看到这里了,说明效果图还是对你有点吸引的么,哈哈,废话不多说了,开始上代码。。。
一共是四个文件js、json、xml,wxss,如果这个都还不清楚的童鞋请出门左拐,面壁思过5分钟。
先上布局dialog.xml文件
<!--mask dialog--> <view class="drawer_screen" bindtap="hideDialog" wx:if="{{isShow}}" catchtouchmove="myCatchTouch"></view> <!--content--> <!--使用animation属性指定需要执行的动画--> <view animation="{{animationData}}" class="drawer_box" wx:if="{{isShow}}"> <!--drawer content--> <view class='row'> <view class="drawer_title" style='width:100%;padding-left:60rpx'>{{title}}</view> <icon type="clear" style='margin-top:40rpx;margin-right:20rpx;' bindtap="hideDialog"></icon> </view> <form bindsubmit="_formSubmit"> <scroll-view scroll-y> <view class="drawer_content"> <view wx:for="{{dataObject}}" wx:key="{{id}}"> <view class="top grid"> <label class="title col-0" style="color:red" wx:if="{{item.must}}">*</label> <label class="title col-0" wx:else> </label> <input class="input_base input_h30 col-1" placeholder='{{item.placeholder}}' wx:if="{{item.type === type_input}}" name="{{item.id}}" value="{{bean[item.id]}}"></input> <view class="input_base input_h30 col-1" wx:elif="{{item.id === id_sex}}" hover-class='btn_ok_hover' bindtap='{{item.event}}'>{{sexDefault}}</view> <view class="input_base input_h30 col-1" wx:elif="{{item.id === id_group}}" hover-class='btn_ok_hover' bindtap='{{item.event}}'>{{groupDefault}}</view> </view> </view> </view> </scroll-view> <button class="btn_ok" hover-class='btn_ok_hover' formType="submit">确定</button> </form> </view>
然后是dialog.wxss文件
/*mask dialog start*/ .drawer_screen { width: 100%; height: 100%; position: fixed; top: 0; left: 0; right:0; bottom:0; z-index: 1000; background: #000; opacity: 0.5; overflow: hidden; } /*content*/ .drawer_box { width: 650rpx; overflow: hidden; position: fixed; top: 50%; left: 0; z-index: 1001; background: #fafafa; margin: -480rpx 50rpx 0 50rpx; border-radius: 6px; } .drawer_title { padding: 15px; font: 20px "microsoft yahei"; text-align: center; } .drawer_content { height: 720rpx; /*overflow-y: scroll; 超出父盒子高度可滚动*/ } .btn_ok { padding: 10px; font: 20px "microsoft yahei"; text-align: center; border-top: 1rpx solid #e8e8ea; color: #3cc51f; } .btn_ok_hover { color: #aaa; background: #d9d9d9; } .top { padding-top: 8px; } .input_base { border: 2rpx solid #ccc; border-radius: 20rpx; padding-left: 20rpx; margin-right: 20rpx; } .input_h30 { height: 30px; line-height: 30px; } .title { height: 30px; line-height: 30px; width: 40rpx; text-align: center; display: inline-block; font: 300 28rpx/30px "microsoft yahei"; } .grid { display: -webkit-box; display: box; } .col-0 { -webkit-box-flex: 0; box-flex: 0; } .col-1 { -webkit-box-flex: 1; box-flex: 1; } /*mask dialog end*/ .row { display: flex; flex-direction: row; }
再然后就是dialog.js文件
// components/Dialog/dialog.js Component({ options: { multipleSlots: true // 在组件定义时的选项中启用多slot支持 }, /** * 组件的属性列表 */ properties: { title: { // 属性名 type: String, // 类型(必填),目前接受的类型包括:String, Number, Boolean, Object, Array, null(表示任意类型) value: '标题' // 属性初始值(可选),如果未指定则会根据类型选择一个 } }, /** * 组件的初始数据 */ data: { // 弹窗显示控制 isShow: false, type_input: "input", type_btn: "button", id_sex: "sex", id_group: "group", dataObject: [], sexDefault: "男", groupDefault: "组织", sexArray: ['男', '女'], groupArray: ['组织', '群众'], bean: {}, }, /** * 组件的方法列表 */ methods: { /* * 公有方法 */ setDataObj(dataObj,beanObj) { this.setData({ dataObject: dataObj, bean: beanObj }) if (beanObj.hasOwnProperty("sex") && beanObj.sex != ""){ this.setData({ sexDefault: beanObj.sex }) } if (beanObj.hasOwnProperty("group") && beanObj.group != "") { this.setData({ groupDefault: beanObj.group }) } }, //隐藏弹框 hideDialog() { this._showOrCloseDialog("close") }, //展示弹框 showDialog() { this._showOrCloseDialog("open") }, /* * 内部私有方法建议以下划线开头 * triggerEvent 用于触发事件 */ _formSubmit(e) { if ("" === e.detail.value.name) { wx.showToast({ title: '请填写姓名', icon: 'none' }) return } if ("" === e.detail.value.phone) { wx.showToast({ title: '请填写电话', icon: 'none' }) return } this._showOrCloseDialog("close") //触发成功回调 this.triggerEvent("confirmEvent", { e: e }); }, sexButton: function() { var that = this; wx.showActionSheet({ itemList: this.data.sexArray, success: function(res) { console.log(res.tapIndex) that.setData({ sexDefault: that.data.sexArray[res.tapIndex] }) }, fail: function(res) { console.log(res.errMsg) } }) }, groupButton: function() { var that = this; wx.showActionSheet({ itemList: this.data.groupArray, success: function(res) { console.log(res.tapIndex) that.setData({ groupDefault: that.data.groupArray[res.tapIndex] }) }, fail: function(res) { console.log(res.errMsg) } }) }, _showOrCloseDialog: function(currentStatu) { var that = this; /* 动画部分 */ // 第1步:创建动画实例 var animation = wx.createAnimation({ duration: 200, //动画时长 timingFunction: "linear", //线性 delay: 0 //0则不延迟 }); // 第2步:这个动画实例赋给当前的动画实例 this.animation = animation; // 第3步:执行第一组动画 animation.opacity(0).rotateX(-100).step(); // 第4步:导出动画对象赋给数据对象储存 that.setData({ animationData: animation.export() }) // 第5步:设置定时器到指定时候后,执行第二组动画 setTimeout(function() { // 执行第二组动画 animation.opacity(1).rotateX(0).step(); // 给数据对象储存的第一组动画,更替为执