微信小程序中自定义模态弹窗的详细介绍

why 1348 2024-08-21

这篇文章主要为大家详细介绍了微信小程序实战之自定义模态弹窗,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

首先看看官方提供的模态弹窗,供大家参考,具体内容如下

image.png

api如下:

image.png

示例

image.png

这样的模态弹窗,充其量只能做个alert,提示一下信息。
但是并不能使用它来处理复杂性的弹窗业务,因此写了Michael从新自定义了一个,采用了仿原生的样式写法

wxml:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

<!--button-->

<view class="btn" bindtap="powerDrawer" data-statu="open">button</view>

  

<!--mask-->

<view class="drawer_screen" bindtap="powerDrawer" data-statu="close" wx:if="{{showModalStatus}}"></view>

<!--content-->

<!--使用animation属性指定需要执行的动画-->

<view animation="{{animationData}}" class="drawer_box" wx:if="{{showModalStatus}}">

  

 <!--drawer content-->

 <view class="drawer_title">弹窗标题</view>

 <view class="drawer_content">

 <view class="top grid">

 <label class="title col-0">标题</label>

 <input class="input_base input_h30 col-1" name="rName" value="可自行定义内容"></input>

 </view>

 <view class="top grid">

 <label class="title col-0">标题</label>

 <input class="input_base input_h30 col-1" name="mobile" value="110"></input>

 </view>

 <view class="top grid">

 <label class="title col-0">标题</label>

 <input class="input_base input_h30 col-1" name="phone" value="拒绝伸手党"></input>

 </view>

 <view class="top grid">

 <label class="title col-0">标题</label>

 <input class="input_base input_h30 col-1" name="Email" value="仅供学习使用"></input>

 </view>

 <view class="top bottom grid">

 <label class="title col-0">备注</label>

 <input class="input_base input_h30 col-1" name="bz"></input>

 </view>

 </view>

 <view class="btn_ok" bindtap="powerDrawer" data-statu="close">确定</view>

</view>


wxss:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

/*button*/

.btn {

 width: 80%;

 padding: 20rpx 0;

 border-radius: 10rpx;

 text-align: center;

 margin: 40rpx 10%;

 background: #000;

 color: #fff;

}

  

/*mask*/

.drawer_screen {

 width: 100%;

 height: 100%;

 position: fixed;

 top: 0;

 left: 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: -150px 50rpx 0 50rpx;

 border-radius: 3px;

}

  

.drawer_title{

 padding:15px;

 font: 20px "microsoft yahei";

 text-align: center;

}

.drawer_content {

 height: 210px;

 overflow-y: scroll; /*超出父盒子高度可滚动*/

}

  

.btn_ok{

 padding: 10px;

 font: 20px "microsoft yahei";

 text-align: center;

 border-top: 1px solid #E8E8EA;

 color: #3CC51F;

}

  

.top{

 padding-top:8px;

}

.bottom {

 padding-bottom:8px;

}

.title {

 height: 30px;

 line-height: 30px;

 width: 160rpx;

 text-align: center;

 display: inline-block;

 font: 300 28rpx/30px "microsoft yahei";

}

  

.input_base {

 border: 2rpx solid #ccc;

 padding-left: 10rpx;

 margin-right: 50rpx;

}

.input_h30{

 height: 30px;

 line-height: 30px;

}

.input_h60{

 height: 60px;

}

.input_view{

 font: 12px "microsoft yahei";

 background: #fff;

 color:#000;

 line-height: 30px;

}

  

input {

 font: 12px "microsoft yahei";

 background: #fff;

 color:#000 ;

}

radio{

 margin-right: 20px;

}

.grid { display: -webkit-box; display: box; }

.col-0 {-webkit-box-flex:0;box-flex:0;}

.col-1 {-webkit-box-flex:1;box-flex:1;}

.fl { float: left;}

.fr { float: right;}


js


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

Page({

 data: {

 showModalStatus: false

 },

 powerDrawer: function (e) {

 var currentStatu = e.currentTarget.dataset.statu;

 this.util(currentStatu)

 },

 util: function(currentStatu){

 /* 动画部分 */

 // 第1步:创建动画实例

 var animation = wx.createAnimation({

 duration: 200, //动画时长

 timingFunction: "linear", //线性

 delay: 0 //0则不延迟

 });

  

 // 第2步:这个动画实例赋给当前的动画实例

 this.animation = animation;

  

 // 第3步:执行第一组动画

 animation.opacity(0).rotateX(-100).step();

  

 // 第4步:导出动画对象赋给数据对象储存

 this.setData({

 animationData: animation.export()

 })

  

 // 第5步:设置定时器到指定时候后,执行第二组动画

 setTimeout(function () {

 // 执行第二组动画

 animation.opacity(1).rotateX(0).step();

 // 给数据对象储存的第一组动画,更替为执行完第二组动画的动画对象

 this.setData({

 animationData: animation

 })

  

 //关闭

 if (currentStatu == "close") {

 this.setData(

  {

  showModalStatus: false

  }

 );

 }

 }.bind(this), 200)

  

 // 显示

 if (currentStatu == "open") {

 this.setData(

 {

  showModalStatus: true

 }

 );

 }

 }

  

})


运行:

以上就是本文的全部内容,希望对大家的学习有所帮助。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序里 UI 与容器组件的详细介绍
下一篇:微信小程序内显示 html 格式内容的有效方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~