基于 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 相关文章推荐
javascript+css 网页每次加载不同样式的实现方法
Dec 27 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
Oct 12 Javascript
写得不错的jquery table鼠标经过变色代码
Sep 27 Javascript
node.js中的fs.readSync方法使用说明
Dec 17 Javascript
JavaScript分秒倒计时器实现方法
Feb 02 Javascript
angularJS中router的使用指南
Feb 09 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
Aug 31 Javascript
JS实现的样式切换功能tableCSS实例
Dec 30 Javascript
bootstrap中模态框、模态框的属性实例详解
Feb 17 Javascript
你点的 ES6一些小技巧,请查收
Apr 25 Javascript
vue基础之模板和过滤器用法实例分析
Mar 12 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
Dec 29 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
咖啡界又出新概念,无需咖啡豆的分子咖啡
2021/03/03 咖啡文化
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
推荐一本PHP程序猿都应该拜读的书
2014/12/31 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
jQuery实现火车票买票城市选择切换功能
2017/09/15 jQuery
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
v-slot和slot、slot-scope之间相互替换实例
2020/09/04 Javascript
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
PyQT实现多窗口切换
2018/04/20 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
python多线程和多进程关系详解
2020/12/14 Python
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
玩具反斗城葡萄牙官方商城:Toys"R"Us葡萄牙
2016/10/21 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
个人欠款担保书
2014/05/20 职场文书
工程售后服务承诺书
2014/05/21 职场文书
计划生育工作总结2015
2015/04/03 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL