用vue做一个酷炫的menu
来源:互联网 发布:广州拓飞涉密数据恢复 编辑:程序博客网 时间:2024/06/08 13:08
写在前面
最近看到一个非常酷炫的menu插件,一直想把它鼓捣成vue形式,谁让我是vue的死灰粉呢,如果这都不算爱。开个小玩耍,我们一起来探索黑魔法吧。观看本教程的读者需要具备一定的vue和css3的知识.
本文结构
- 效果演示
- 使用方法介绍
- 关键步骤讲解
正文
1.效果演示
在线演示live demo
2.使用介绍
clone项目到本地
a. 首先在单文件组件里引入menu组件,导入common文件夹stylus里menuConfig.stylus.
b. 配置相应的参数
可选参数
* radius:default为100px,item距离menu的button的距离。
* startAngle:defaut为0,item开始的角度,以时钟3点钟方向记为0,然后顺时针方向为递增方向。
* endAngle:default为315,最后一个item的角度。
* itemNum:default为8
* animationDuration:default为0.5s,每个item动画的执行时间
* itemAnimationDelay:default为0.04s,每个item之间animation触发的间隔延迟时间
必选参数
* iconImgArr:import您需要的icon,然后生成iconImgArr(computed属性绑定),作为props传给menu组件menu的位置
* 目前有center,corner两种位置,在menu的class里指定。center的class:.menu-center-wrapper,corner的class:.menu-left-corner-wrapper。当然自己指定位置也是ok的。一个简单的example
3.关键步骤讲解
整个menu的实现关键在于计算menu展开后最后的坐标,以及展开与收缩的动画.(由于整个项目布局比较简单,所以这里主要讲解逻辑和动画的实现)
第一步:计算menu展开后横坐标和纵坐标
下面的x,y分别表示item在页面的位置,以x为例。 x:原始的位置,x2最后展开的位置,x1中间的过渡位置(主要是造成一个“拉回”的效果),以下是图片解释,为了解释简单明了,我放大了radius倍数以及增加了动画的执行时间。
位置的计算:首先计算每个item之间的夹角,起始item是沿着顺时针布局的,每个item之间的夹角等于(endAngle-startAngle)/(itemNum-1)。当前item应该旋转的角度为:angleCur=startAngle+index*每个item之间的夹角。得到item的旋转角度之后,用Math.cos和Math.sin和radius相乘得到其横坐标和纵坐标.
第二步,根据生成的坐标使用js动态生成animtion,并插入到样式文件中。
生成展开和收缩的keyframe,到这一步我们完成了点击menu展开与收缩。
第三步,完成点击item之后item放大与消失,其他的item缩小与消失
item消失的keyframe
这里触发动画使用vue提供transition ,当元素的v-show为false时,也就是display为none时,触发动画。
每个item动画完成后都会触发animationEnd事件,监听item的animationEnd事件,当所有动画依次触发完毕之后,提醒menu置于关闭状态(父子组件通信 )。
我在menu组件里使用v-on监听animationEnd事件,item自己的动画执行后,通过$emit触发animationEnd事件,通知menu的动画计数count++,当count达到总的项目数的时候,menu进行关闭.
再次打开menu的时候检查与item绑定的showItem是否为false,是的话置为true。点击时需要拿到被点击item的index,得到全局的currentIndex即被点击的item的index。被点中的使用放大动画,否则使用缩小动画。
关键代码
至此所有步骤讲解完毕,欢迎star和pr
- 用vue做一个酷炫的menu
- 用vue做一个酷炫的menu
- 用 Vue 做一个酷炫的 menu
- 用 Vue 做一个酷炫的 menu
- 用 Vue 做一个酷炫的 menu:15篇前端热文回看
- 利用vue做一个简单的todolist
- 新建一个Vue项目需要做的
- 用Vue做一个职业选择或地区选择的三级嵌套组件
- 一个简单的Menu
- 一个menu的原型
- 用vue.js做一个网易云音乐
- 用vue.js做一个网易云音乐
- css3 做一个会动的菜单 menu 按钮动画效果
- css3 做一个会动的菜单 menu 按钮动画效果
- 一个Vue+Canvas的酷炫后台管理
- 一个Vue+Canvas的酷炫后台管理
- 一个弹出式menu的制作
- vue toggle做一个点击切换class
- 小米的野心:新时代下的开放生态
- react-native-image-picker在Android上闪退的解决办法(上传头像base64,压缩上传图片)
- [转] Python学习之Anaconda的使用及配置方法
- Java基础知识
- js学习(二)
- 用vue做一个酷炫的menu
- NYOJ 60
- 动态库与静态库优缺点比较
- HUE--高可用Hadoop平台-Hue In Hadoop
- 【第三届蓝桥杯】转方阵
- 发布到百度平台遇到的问题
- IntelliJ Idea 2017 免费激活方法
- AnimationDrawable资源的使用
- Android 热修复以及阿里AndFix方案使用