文档章节

用vue做一个酷炫的menu

MingSeng-W
 MingSeng-W
发布于 2017/11/13 23:40
字数 956
阅读 6495
收藏 265

写在前面

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

本文结构

1.效果演示

2.使用方法介绍

3.关键步骤讲解

正文

1.效果演示

 

pic_1

 

pic2

 

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

 

demo

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相乘得到其横坐标和纵坐标.

    关键代码:

计算每个item的夹角

位置解释

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

生成展开和收缩的keyframe

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

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

    item消失的keyframe

    

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

code

code

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

pic_6

 

关键代码

至此所有步骤讲解完毕

© 著作权归作者所有

共有 人打赏支持
MingSeng-W
粉丝 11
博文 1
码字总数 956
作品 0
成都
程序员
加载中

评论(20)

YJ_
YJ_
:clap:
mywd
mywd
技术活当赏:smile:
WEN-01号
WEN-01号
不错不错,虽然现在还看不懂
Sindtoto
Sindtoto
支持,很萌。
MingSeng-W
MingSeng-W

引用来自“烈冰”的评论

提两点建议:1、加快动画的速度;2、弹出来的小按钮与大按钮的距离根据屏幕尺寸自适应

回复@烈冰 : 动画的速度是可以通过props配置的,谢谢您提出的屏幕自适应,写的急没考虑到
MingSeng-W
MingSeng-W

引用来自“请点赞”的评论

不错,是vue 几版本的

回复@请点赞 : 2.1.0
请点赞
请点赞
不错,是vue 几版本的
烈冰
烈冰
提两点建议:1、加快动画的速度;2、弹出来的小按钮与大按钮的距离根据屏幕尺寸自适应
EnoND
EnoND
mark
Edik
Edik
666
试用 vue-admin-template 写一个自己的dashboard

初衷 其实自己还是比较热衷于基于CLI的dashboard,也有心去做一些尝试,比如 用 Nodejs CLI 的方式实现一个TODO应用 - 简书 ,后续也会继续增加新想法到这个里面。但是我今天意识到一个问题,...

萝卜日志
09/06
0
0
vue UI —— 告别webpack配置

vue UI 告别webpack配置 [TOC] vue-cli 3.0 的候选版本也已经发布多时了。vue-cli 3.0 版本为我们提供了集 为一体的可视化界面vue ui,妈妈再也不用担心我不懂配置啦~让我们来一起尝尝鲜吧~...

dante丶
08/06
0
0
vue UI 告别webpack配置

目录 vue UI 告别webpack配置 开始体验 项目细节 总结 vue UI 告别webpack配置 vue-cli 3.0 的候选版本也已经发布多时了。vue-cli 3.0 版本为我们提供了集 为一体的可视化界面vue ui,妈妈再...

Dante丶
08/06
0
0
ReactJS vs Angular 5 vs Vue.js - 哪个框架更好?

译者按: 在全球大范围看,React和Angular依然遥遥领先,Vue.js这位后起之秀还需努力做到全球化! 原文: ReactJS vs Angular5 vs Vue.js - What to choose in 2018? 译者: Fundebug 为了保证...

Fundebug
07/09
0
0
Vue 折腾记 - (11) @Vue/Cli 3.0.0 图形化项目管理,相当人性化

前言 从开始到现在已经经历了四个月的迭代(目前RC2), 除了终端初始化的姿势,还引入了一个新的项目初始化姿势; Web端的初始化,体验了一下,效果很不错;所以记录一下. 后方多图,感兴趣的可以瞧瞧...

CRPER
06/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用Golang做了一个命令行贪吃蛇游戏

用Golang做了一个命令行贪吃蛇游戏 项目介绍 项目链接:https://gitee.com/lwow2025/snake-go 最近看了一本做几个小项目的书,突然就想用Golang做一个命令行贪吃蛇,也没啥特殊原因。 软件架...

Mediv
29分钟前
0
0
storm的利用并行度提高处理速度的经验

在storm的流计算框架中,在数据量非常大或者计算逻辑比较复杂的情况下,可能会造成处理速度变慢的情况,最后反而不满足了系统的处理要求,因此这里讨论一下。本文的内容是我在storm的使用过程...

飓风2000
38分钟前
0
0
课程推荐|深入浅出区块链博主:全栈区块链开发者的4堂必修课(线上优惠)

Tiny熊从2017年开始更新“深入浅出区块链”博客,在第一篇文章中,关于如何系统学习区块链技术,他这样描述:“从事区块链开发也有很多方向,如:区块链应用开发人员、区块链架构师、底层核心...

HiBlock
50分钟前
0
0
激活win10 亲测有效

1.首先,我们先查看一下Win10正式专业版系统的激活状态: 点击桌面左下角的“Windows”按钮,从打开的扩展面板中依次点击“设置”-“更新和安全”,并切换到“激活”选项卡,在此就可以查看到...

可达鸭眉头一皱
52分钟前
0
0
SpringWind180926

SpringWind SpringWind项目代码学习笔记 /SpringWind/src/main/webapp/WEB-INF/views/login.html 第15行action="#springUrl('/account/login.html')"【为什么是#springUrl】 第4行<a class=......

颖伙虫
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部