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


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 相关文章推荐
js将iframe中控件的值传到主页面控件中的实现方法
Mar 11 Javascript
浅谈javascript获取元素transform参数
Jul 24 Javascript
javascript 使用for循环时该注意的问题-附问题总结
Aug 19 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
Mar 24 Javascript
基于jQuery实现仿百度首页选项卡切换效果
May 29 Javascript
jQuery grep()方法详解及实例代码
Oct 30 Javascript
JS轮播图实现简单代码
Feb 19 Javascript
js解决软键盘遮挡输入框的问题分享
Dec 19 Javascript
Angular6封装http请求的步骤详解
Aug 13 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
Aug 13 Javascript
详解vuex之store源码简单解析
Jun 13 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
Nov 06 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
咖啡豆分级制度 咖啡豆等级分类 咖啡豆是按口感分类的吗?
2021/03/05 新手入门
PHP 得到根目录的 __FILE__ 常量
2008/07/23 PHP
php制作文本式留言板
2015/03/18 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
用ADODB.Stream转换
2007/01/22 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
js使用循环清空某个div中的input标签值
2014/09/29 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
彻底解决 webpack 打包文件体积过大问题
2017/07/07 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
解决iView中时间控件选择的时间总是少一天的问题
2018/03/15 Javascript
nodejs用gulp管理前端文件方法
2018/06/24 NodeJs
webpack手动配置React开发环境的步骤
2018/07/02 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
T3官网:头发造型工具
2019/12/26 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
四年级学生评语大全
2014/04/21 职场文书
电视节目策划方案
2014/05/16 职场文书
汽车机电维修工求职信
2014/09/30 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
欢迎词范文
2015/01/27 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
Mysql查询时间区间日期列表,不会由于数据表数据影响
2022/04/19 MySQL
Python数组变形的几种实现方法
2022/05/30 Python