当前位置:   article > 正文

微信小程序炫酷的弹出式菜单特效_微信小程序开发实现右上角小图标点击展开菜单

微信小程序开发实现右上角小图标点击展开菜单

今天给大家带来一个微信小程序的弹出是菜单效果,老规矩先上效果图。(录制的gif动画有点卡,实际真机或是模拟器上很顺畅)

 

先简单说下思路:

1、首先在屏幕的某个位置放几个悬浮按钮,放几个看你需要的功能

2、点击最上层(wxml中最后一个就是最上层)的的按钮后增加背景遮罩,这个遮罩在我前面自定义modal弹框时有用到

3、分别对按钮做旋转和移动动画和透明度,造成动画差异就是位移的动画距离不同

4、收起的时候回到原来位置并且让透明度变成0就ok了

 

思路说完了,下面开始上实现代码,这里同样也是封装成了组件,方便调用。

首先是wxml实现

  1. <view class="drawer_screen" bindtap="showOrHide" wx:if="{{isShow}}" catchtouchmove="myCatchTouch"></view>
  2. <view >
  3. <image src="../../img/add.png" class="buttom" animation="{{animDelLots}}" bindtap="deleteLots"></image>
  4. <image src="../../img/add.png" class="buttom" animation="{{animAdd}}" bindtap="add"></image>
  5. <image src="../../img/add.png" class="buttom" animation="{{animMain}}" bindtap="showOrHide"></image>
  6. </view>

然后是wxss

  1. //悬浮按钮
  2. .buttom{
  3. width: 100rpx;
  4. height: 100rpx;
  5. display: flex;
  6. flex-direction: row;
  7. position: fixed;
  8. bottom:60rpx;
  9. right: 60rpx;
  10. z-index: 1001;
  11. }
  12. .drawer_screen {
  13. width: 100%;
  14. height: 100%;
  15. position: fixed;
  16. top: 0;
  17. left: 0;
  18. right:0;
  19. bottom:0;
  20. z-index: 1000;
  21. background: #000;
  22. opacity: 0.5;
  23. overflow: hidden;
  24. }
  25. .drawer_box {
  26. overflow: hidden;
  27. position: fixed;
  28. z-index: 1001;
  29. }

json文件

  1. {
  2. "component": true,
  3. "usingComponents": {}
  4. }

最后是js逻辑实现

  1. // components/Menu/menu.js
  2. var systemInfo = wx.getSystemInfoSync();
  3. Component({
  4. /**
  5. * 组件的属性列表
  6. */
  7. properties: {
  8. },
  9. /**
  10. * 组件的初始数据
  11. */
  12. data: {
  13. isShow: false,//是否已经弹出
  14. animMain: {},//旋转动画
  15. animAdd: {},//item位移,透明度
  16. animDelLots: {},//item位移,透明度
  17. },
  18. /**
  19. * 组件的方法列表
  20. */
  21. methods: {
  22. //点击弹出或者收起
  23. showOrHide: function () {
  24. if (this.data.isShow) {
  25. //缩回动画
  26. this.takeback();
  27. this.setData({
  28. isShow: false
  29. })
  30. } else {
  31. //弹出动画
  32. this.popp();
  33. this.setData({
  34. isShow: true
  35. })
  36. }
  37. },
  38. add: function () {
  39. this.triggerEvent("addEvent")
  40. this.showOrHide()
  41. },
  42. deleteLots: function () {
  43. this.triggerEvent("deleteLotsEvent")
  44. this.showOrHide()
  45. },
  46. //弹出动画
  47. popp: function () {
  48. //main按钮顺时针旋转
  49. var animationMain = wx.createAnimation({
  50. duration: 500,
  51. timingFunction: 'ease-out'
  52. })
  53. var animationDelLots = wx.createAnimation({
  54. duration: 500,
  55. timingFunction: 'ease-out'
  56. })
  57. var animationAdd = wx.createAnimation({
  58. duration: 500,
  59. timingFunction: 'ease-out'
  60. })
  61. animationMain.rotateZ(180).step();
  62. animationDelLots.translate(0, -200 / 750 * systemInfo.windowWidth).rotateZ(180).opacity(1).step();
  63. animationAdd.translate(0, -320 / 750 * systemInfo.windowWidth).rotateZ(180).opacity(1).step();
  64. this.setData({
  65. animMain: animationMain.export(),
  66. animDelLots: animationDelLots.export(),
  67. animAdd: animationAdd.export(),
  68. })
  69. },
  70. //收回动画
  71. takeback: function () {
  72. //main按钮逆时针旋转
  73. var animationMain = wx.createAnimation({
  74. duration: 500,
  75. timingFunction: 'ease-out'
  76. })
  77. var animationDelLots = wx.createAnimation({
  78. duration: 500,
  79. timingFunction: 'ease-out'
  80. })
  81. var animationAdd = wx.createAnimation({
  82. duration: 500,
  83. timingFunction: 'ease-out'
  84. })
  85. animationMain.rotateZ(0).step();
  86. animationDelLots.translate(0, 0).rotateZ(0).opacity(0).step();
  87. animationAdd.translate(0, 0).rotateZ(0).opacity(0).step();
  88. this.setData({
  89. animMain: animationMain.export(),
  90. animDelLots: animationDelLots.export(),
  91. animAdd: animationAdd.export(),
  92. })
  93. }
  94. },
  95. //解决滚动穿透问题
  96. myCatchTouch: function () {
  97. return
  98. }
  99. })

在要调用的页面json文件引用menu组件(我这里引用了两个组件,还有一个是前面封装的dialog组件)

  1. "usingComponents": {
  2. "dialog": "/components/Dialog/dialog",
  3. "menu": "/components/Menu/menu"
  4. },

然后在调用的wxml中使用

  1. <!--_addEvent 和 _deleteLotsEvent分别是弹出菜单里面按钮对应的事件,需要在调用的js中实现 -->
  2. <menu hidden id='menu' bind:addEvent="_addEvent" bind:deleteLotsEvent="_deleteLotsEvent" />

调用menu组件的js中实现菜单中item的点击事件

  1. _addEvent: function(){
  2. //do something
  3. },
  4. _deleteLotsEvent: function(){
  5. //do something
  6. }

整体代码实现就这么多,代码比较简单,如果有不清楚的童鞋,请留言,我将为你们解答。

感谢你这么帅,这么多金,还读到了现在,谢谢!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/77092
推荐阅读
相关标签
  

闽ICP备14008679号