国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

基于 Vue 實現一個酷炫的 menu插件

2019-11-19 14:56:28
字體:
來源:轉載
供稿:網友

寫在前面

最近看到一個非常酷炫的menu插件,一直想把它鼓搗成vue形式,誰讓我是vue的死灰粉呢,如果這都不算愛:pensive:。:laughing:開個小玩耍,我們一起來探索黑魔法吧。觀看本教程的讀者需要具備一定的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

關鍵代碼

至此所有步驟講解完畢

總結

以上所述是小編給大家介紹的基于 Vue 實現一個酷炫的 menu插件,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 饶平县| 吴旗县| 丹棱县| 武宁县| 巴南区| 分宜县| 五华县| 河北省| 东宁县| 浦江县| 辽源市| 高雄市| 清涧县| 娄底市| 磐安县| 恩平市| 三门县| 奎屯市| 南靖县| 延长县| 静乐县| 兴业县| 区。| 象山县| 同仁县| 马公市| 社会| 高雄市| 富源县| 梧州市| 长葛市| 武义县| 大英县| 武清区| 萍乡市| 商丘市| 襄樊市| 伊春市| 武穴市| 昌乐县| 万年县|