基于 Vue 实现一个酷炫的 menu插件


Posted in Javascript onNovember 14, 2017

写在前面

最近看到一个非常酷炫的menu插件,一直想把它鼓捣成vue形式,谁让我是vue的死灰粉呢,如果这都不算爱:pensive:。:laughing:开个小玩耍,我们一起来探索黑魔法吧。观看本教程的读者需要具备一定的vue和css3的知识.

本文结构

1.效果演示

2.使用方法介绍

3.关键步骤讲解

正文

1.效果演示

基于 Vue 实现一个酷炫的 menu插件

pic_1

基于 Vue 实现一个酷炫的 menu插件

pic2

基于 Vue 实现一个酷炫的 menu插件

pic_3

在线演示 live demo

2.使用介绍

项目地址:github.com/MingSeng-W/vue-bloom-menu ,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

基于 Vue 实现一个酷炫的 menu插件 

demo

3.关键步骤讲解

整个menu的实现关键在于计算menu展开后最后的坐标,以及展开与收缩的动画.(由于整个项目布局比较简单,所以这里主要讲解逻辑和动画的实现)

第一步:计算menu展开后横坐标和纵坐标

下面的x,y分别表示item在页面的位置,以x为例。

x:原始的位置,x2最后展开的位置,x1中间的过渡位置(主要是造成一个“拉回”的效果),以下是图片解释,为了解释简单明了,我放大了radius倍数以及增加了动画的执行时间。

基于 Vue 实现一个酷炫的 menu插件

位置解释

位置的计算:首先计算每个item之间的夹角,起始item是沿着顺时针布局的,每个item之间的夹角等于(endAngle-startAngle)/(itemNum-1)。当前item应该旋转的角度为:angleCur=startAngle+index*每个item之间的夹角。得到item的旋转角度之后,用Math.cos和Math.sin和radius相乘得到其横坐标和纵坐标.

关键代码:

基于 Vue 实现一个酷炫的 menu插件

计算每个item的夹角

基于 Vue 实现一个酷炫的 menu插件

位置解释

第二步,根据生成的坐标使用js动态生成animtion,并插入到样式文件中。

基于 Vue 实现一个酷炫的 menu插件

生成展开和收缩的keyframe

到这一步我们完成了点击menu展开与收缩。

第二步,完成点击item之后item放大与消失,其他的item缩小与消失

item消失的keyframe

基于 Vue 实现一个酷炫的 menu插件

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进行关闭.

基于 Vue 实现一个酷炫的 menu插件

code

基于 Vue 实现一个酷炫的 menu插件

code

基于 Vue 实现一个酷炫的 menu插件

再次打开menu的时候检查与item绑定的showItem是否为false,是的话置为true。点击时需要拿到被点击item的index,得到全局的currentIndex即被点击的item的index。被点中的使用放大动画,否则使用缩小动画。

基于 Vue 实现一个酷炫的 menu插件

pic_6

基于 Vue 实现一个酷炫的 menu插件

关键代码

至此所有步骤讲解完毕

总结

以上所述是小编给大家介绍的基于 Vue 实现一个酷炫的 menu插件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jquery last-child 列表最后一项的样式
Jan 22 Javascript
js获取html文件的思路及示例
Sep 17 Javascript
使用 js+正则表达式为关键词添加链接
Nov 11 Javascript
jquery实现的Banner广告收缩效果代码
Sep 02 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
Feb 06 Javascript
js实现人民币大写金额形式转换
Apr 27 Javascript
Vue.js每天必学之指令系统与自定义指令
Sep 07 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
Mar 13 Javascript
vue实现简单表格组件实例详解
Apr 16 Javascript
JavaScript循环_动力节点Java学院整理
Jun 28 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
May 13 Javascript
Vue左滑组件slider使用详解
Aug 21 Javascript
Node之简单的前后端交互(实例讲解)
Nov 14 #Javascript
Angular移动端页面input无法输入的解决方法
Nov 14 #Javascript
使用Vue-Router 2实现路由功能实例详解
Nov 14 #Javascript
JS 仿支付宝input文本输入框放大组件的实例
Nov 14 #Javascript
js实现数组内数据的上移和下移的实例
Nov 14 #Javascript
vue router使用query和params传参的使用和区别
Nov 13 #Javascript
vue+vue-validator 表单验证功能的实现代码
Nov 13 #Javascript
You might like
PHP的FTP学习(四)
2006/10/09 PHP
php获取网页上所有链接的方法
2015/04/03 PHP
java模拟PHP的pack和unpack类
2016/04/13 PHP
yii2缓存Caching基本用法示例
2016/07/18 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
详解react-native-fs插件的使用以及遇到的坑
2017/09/12 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
JS生成随机打乱数组的方法示例
2017/12/23 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
vue项目引入字体.ttf的方法
2018/09/28 Javascript
js实现全选和全不选
2020/07/28 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
python3实现读取chrome浏览器cookie
2016/06/19 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
汽车专业学生自我评价
2014/01/19 职场文书
学校出纳员岗位职责
2014/03/18 职场文书
同居协议书范本
2014/04/23 职场文书
促销活动计划书
2014/05/02 职场文书
大学生自我评价200字(4篇)
2014/09/17 职场文书
基层党支部承诺书
2015/04/30 职场文书
公司催款律师函
2015/05/27 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python