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


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 相关文章推荐
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
Feb 03 Javascript
关于js中alert弹出窗口文本换行问题简单详细说明
Dec 11 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
Jan 07 Javascript
Bootstrap在线电子商务网站实战项目5
Oct 14 Javascript
jquery操作ID带有变量的节点实例
Dec 07 Javascript
详解vue-Resource(与后端数据交互)
Jan 16 Javascript
基于BootStrap的文本编辑器组件Summernote
Oct 27 Javascript
如何安装控制器JavaScript生成插件详解
Oct 21 Javascript
在Create React App中使用CSS Modules的方法示例
Jan 15 Javascript
JS实现checkbox互斥(单选)功能示例
May 04 Javascript
关于Layui Table隐藏列问题
Sep 16 Javascript
vue实现瀑布流组件滑动加载更多
Mar 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
让你同时上传 1000 个文件 (一)
2006/10/09 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
jquery构造器的实现代码小结
2011/05/16 Javascript
eval的两组性能测试数据
2012/08/17 Javascript
jquery设置控件位置的方法
2013/08/21 Javascript
js实现获取当前时间是本月第几周的方法
2015/08/11 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
2015/10/20 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
js select下拉联动 更具级联性!
2020/04/17 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
破解安装Pycharm的方法
2018/10/19 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
python 利用pyttsx3文字转语音过程详解
2019/09/25 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
2020/01/25 Python
django实现更改数据库某个字段以及字段段内数据
2020/03/31 Python
python/golang 删除链表中的元素
2020/09/14 Python
程序员机试试题汇总
2012/03/07 面试题
简历的个人自我评价范文
2014/01/03 职场文书
酒店销售主管岗位职责
2014/01/04 职场文书
模范家庭事迹材料
2014/02/10 职场文书
财务部绩效考核方案
2014/05/04 职场文书
揭牌仪式策划方案
2014/05/28 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
幼儿园元旦主持词
2015/07/06 职场文书