微信小程序实现炫酷的弹出式菜单特效


Posted in Javascript onJanuary 28, 2019

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

微信小程序实现炫酷的弹出式菜单特效

先简单说下思路:

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

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

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

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

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

微信小程序实现炫酷的弹出式菜单特效

首先是wxml实现

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

然后是wxss

//悬浮按钮
.buttom{
 width: 100rpx;
 height: 100rpx;
 display: flex;
 flex-direction: row;
 position: fixed;
 bottom:60rpx;
 right: 60rpx;
 z-index: 1001;
}
.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;
}
.drawer_box {
 overflow: hidden;
 position: fixed;
 z-index: 1001;
}

json文件

{
 "component": true,
 "usingComponents": {}
}

最后是js逻辑实现

// components/Menu/menu.js
var systemInfo = wx.getSystemInfoSync();
Component({
 /**
 * 组件的属性列表
 */
 properties: {
 
 },
 
 /**
 * 组件的初始数据
 */
 data: {
 isShow: false,//是否已经弹出
 animMain: {},//旋转动画
 animAdd: {},//item位移,透明度
 animDelLots: {},//item位移,透明度
 },
 
 /**
 * 组件的方法列表
 */
 methods: {
 //点击弹出或者收起
 showOrHide: function () {
  if (this.data.isShow) {
  //缩回动画
  this.takeback();
  this.setData({
   isShow: false
  })
  } else {
  //弹出动画
  this.popp();
  this.setData({
   isShow: true
  })
  }
 },
 add: function () {
  this.triggerEvent("addEvent")
  this.showOrHide()
 },
 deleteLots: function () {
  this.triggerEvent("deleteLotsEvent")
  this.showOrHide()
 },
 
 //弹出动画
 popp: function () {
  //main按钮顺时针旋转
  var animationMain = wx.createAnimation({
  duration: 500,
  timingFunction: 'ease-out'
  })
  var animationDelLots = wx.createAnimation({
  duration: 500,
  timingFunction: 'ease-out'
  })
  var animationAdd = wx.createAnimation({
  duration: 500,
  timingFunction: 'ease-out'
  })
  animationMain.rotateZ(180).step();
  animationDelLots.translate(0, -200 / 750 * systemInfo.windowWidth).rotateZ(180).opacity(1).step();
  animationAdd.translate(0, -320 / 750 * systemInfo.windowWidth).rotateZ(180).opacity(1).step();
  this.setData({
  animMain: animationMain.export(),
  animDelLots: animationDelLots.export(),
  animAdd: animationAdd.export(),
  })
 },
 //收回动画
 takeback: function () {
  //main按钮逆时针旋转
  var animationMain = wx.createAnimation({
  duration: 500,
  timingFunction: 'ease-out'
  })
  var animationDelLots = wx.createAnimation({
  duration: 500,
  timingFunction: 'ease-out'
  })
  var animationAdd = wx.createAnimation({
  duration: 500,
  timingFunction: 'ease-out'
  })
  animationMain.rotateZ(0).step();
  animationDelLots.translate(0, 0).rotateZ(0).opacity(0).step();
  animationAdd.translate(0, 0).rotateZ(0).opacity(0).step();
  this.setData({
  animMain: animationMain.export(),
  animDelLots: animationDelLots.export(),
  animAdd: animationAdd.export(),
  })
 }
 },
 //解决滚动穿透问题
 myCatchTouch: function () {
 return
 }
})

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

"usingComponents": {
 "dialog": "/components/Dialog/dialog",
 "menu": "/components/Menu/menu"
 },

然后在调用的wxml中使用

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

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

_addEvent: function(){
 //do something
 },
 _deleteLotsEvent: function(){
 //do something
 }

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
addEventListener()第三个参数useCapture (Boolean)详细解析
Nov 07 Javascript
一个JavaScript函数把URL参数解析成Json对象
Sep 24 Javascript
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
Jan 24 Javascript
jquery+easeing实现仿flash的载入动画
Mar 10 Javascript
js实现鼠标点击文本框自动选中内容的方法
Aug 20 Javascript
jquery实现标题字体变换的滑动门菜单效果
Sep 07 Javascript
jquery实现可自动判断位置的弹出层效果代码
Oct 12 Javascript
vue复合组件实现注册表单功能
Nov 06 Javascript
在小程序中推送模板消息的实现方法
Jul 22 Javascript
vue.js实现二级菜单效果
Oct 19 Javascript
京东优选小程序的实现代码示例
Feb 25 Javascript
el-form 多层级表单的实现示例
Sep 10 Javascript
微信小程序实现页面浮动导航
Jan 28 #Javascript
微信小程序顶部导航栏滑动tab效果
Jan 28 #Javascript
详解基于node.js的脚手架工具开发经历
Jan 28 #Javascript
微信小程序实现顶部导航特效
Jan 28 #Javascript
详解几十行代码实现一个vue的状态管理
Jan 28 #Javascript
vue.js仿hover效果的实现方法示例
Jan 28 #Javascript
vue-for循环嵌套操作示例
Jan 28 #Javascript
You might like
第十四节 命名空间 [14]
2006/10/09 PHP
php+oracle 分页类
2006/10/09 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
十大使用PHP框架的理由
2015/09/26 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
PHP session会话操作技巧小结
2016/09/27 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
javascript 异步页面查询实现代码(asp.net)
2010/05/26 Javascript
js继承的实现代码
2010/08/05 Javascript
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
jQuery实现的placeholder效果完整实例
2016/08/02 Javascript
JavaScript toUpperCase()方法使用详解
2016/08/26 Javascript
zTree获取当前节点的下一级子节点数实例
2017/09/05 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
Jquery获取radio选中值实例总结
2019/01/17 jQuery
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Python3生成手写体数字方法
2018/01/30 Python
Django学习笔记之ORM基础教程
2018/03/27 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
python分布式计算dispy的使用详解
2019/12/22 Python
LORAC官网:美国彩妆品牌
2019/08/27 全球购物
护士自荐信范文
2013/12/15 职场文书
护士检查书
2014/01/17 职场文书
九年级科学教学反思
2014/01/29 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
《正比例》教学反思
2016/02/23 职场文书