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


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列举css中所有图标的实现代码
Jul 04 Javascript
php的文件上传入门教程(实例讲解)
Apr 10 Javascript
jquery获取复选框被选中的值
Apr 10 Javascript
node.js WEB开发中图片验证码的实现方法
Jun 03 Javascript
node.js中的buffer.write方法使用说明
Dec 10 Javascript
深入探寻seajs的模块化与加载方式
Apr 14 Javascript
Javascript编写俄罗斯方块思路及实例
Jul 07 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
Jan 06 Javascript
javascript实现下雪效果【实例代码】
May 03 Javascript
jquery滚动条插件slimScroll使用方法
Feb 09 Javascript
jQuery实现链接的title快速出现的方法
Feb 20 Javascript
微信小程序实现流程进度的图样式功能
Jan 16 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
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
php生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
破解图片防盗链的代码(asp/php)测试通过
2010/07/02 PHP
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
php获取$_POST同名参数数组的实现介绍
2013/06/30 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
原生JS与jQuery编写简单选项卡
2017/10/30 jQuery
Vue全局分页组件的实现代码
2018/08/10 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
微信小程序 云开发模糊查询实现解析
2019/09/02 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
2021/02/14 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
Python文件处理
2016/02/29 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
2018/06/13 Python
python 多个参数不为空校验方法
2019/02/14 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
美国第一香水网站:Perfume.com
2017/01/23 全球购物
斯洛伐克香水和化妆品购物网站:Parfemy-Elnino.sk
2020/01/28 全球购物
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
幼儿教师师德承诺书
2014/05/23 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
大学学生会辞职信
2015/05/13 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python
MySQL中出现乱码问题的终极解决宝典
2021/05/26 MySQL
关于MySQL中explain工具的使用
2023/05/08 MySQL