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


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 相关文章推荐
jqPlot 图表中文API使用文档及源码和在线示例
Feb 07 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
Aug 12 Javascript
eclipse导入jquery包后报错的解决方法
Feb 17 Javascript
AngularJS基础知识笔记之过滤器
May 10 Javascript
原生js仿jquery实现对Ajax的封装
Oct 04 Javascript
微信小程序 Button 组件详解及简单实例
Jan 10 Javascript
JavaScript判断浏览器及其版本信息
Jan 20 Javascript
servlet+jquery实现文件上传进度条示例代码
Jan 25 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
Mar 09 Javascript
详解Angular.js中$http拦截器的介绍及使用
Jul 04 Javascript
javascript中join方法实例讲解
Feb 21 Javascript
nuxt配置通过指定IP和端口访问的实现
Jan 08 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
PHP中for循环语句的几种变型
2007/03/16 PHP
利用PHP实现智能文件类型检测的实现代码
2011/08/02 PHP
解析PHP中empty is_null和isset的测试
2013/06/29 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
限制文本框输入N个字符的js代码
2010/05/13 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
解决bootstrap-select 动态加载数据不显示的问题
2018/08/10 Javascript
js实现input密码框显示/隐藏功能
2020/09/10 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
Python查找相似单词的方法
2015/03/05 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
python 自定义装饰器实例详解
2019/07/20 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
简单了解为什么python函数后有多个括号
2019/12/19 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
python是怎么被发明的
2020/06/15 Python
Python排序函数的使用方法详解
2020/12/11 Python
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
大学生个人总结的自我评价
2013/10/05 职场文书
年度考核自我鉴定
2013/11/09 职场文书
数控专业自荐书范文
2014/03/16 职场文书
电大毕业个人生自我鉴定
2014/03/26 职场文书
公司出纳岗位职责
2015/03/31 职场文书
英语通知范文
2015/04/22 职场文书
2015年秋季小学开学标语
2015/07/16 职场文书
css3应用示例:新增的选择器
2022/03/16 HTML / CSS