基于 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 相关文章推荐
setTimeout自动触发一个js的方法
Jan 15 Javascript
简介AngularJS的视图功能应用
Jun 17 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
Oct 12 Javascript
jquery自定义表单验证插件
Oct 12 Javascript
JavaScript中浅讲ajax图文详解
Nov 11 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
Jan 19 Javascript
浅谈React和Redux的连接react-redux
Dec 04 Javascript
利用ES6实现单例模式及其应用详解
Dec 09 Javascript
使用vuex的state状态对象的5种方式
Apr 19 Javascript
vue项目持久化存储数据的实现代码
Oct 01 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
Apr 22 Javascript
laravel-admin 与 vue 结合使用实例代码详解
Jun 04 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 is_array() 检测变量是否是数组的实现方法
2016/06/13 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
php curl常用的5个经典例子
2017/01/20 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
js中的escape及unescape函数的php实现代码
2007/09/04 Javascript
页面中iframe相互传值传参
2009/12/13 Javascript
JavaScript建立一个语法高亮输入框实现思路
2013/02/26 Javascript
jquery 获取标签名(tagName)示例代码
2013/07/11 Javascript
JQUERY dialog的用法详细解析
2013/12/19 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
微信小程序之页面拦截器的示例代码
2017/09/07 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
[55:25]VGJ.T vs Optic Supermajor小组赛D组 BO3 第三场 6.3
2018/06/04 DOTA
Python的迭代器和生成器
2015/07/29 Python
Python扩展内置类型详解
2018/03/26 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
WxPython建立批量录入框窗口
2019/02/27 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
2020/11/10 Python
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
泰国国际航空公司官网:Thai Airways International
2019/12/04 全球购物
NHL官方在线商店:Shop.NHL.com
2020/05/01 全球购物
什么时候用assert
2015/05/08 面试题
活动总结怎么写
2014/04/28 职场文书
三好学生评语大全
2014/12/29 职场文书
招标保密承诺书
2015/01/20 职场文书
鲁迅故里导游词
2015/02/05 职场文书
关于vue-router-link选择样式设置
2022/04/30 Vue.js