背景
在這篇文章《2018年設計趨勢指南》中發現一款選單不錯,就想著用微信小程式實現
先上個動圖
開始正題
上方Nav
基本flex
佈局再加個padding
不需要多講吧?
提一下,微信小程式裡input的placeholder樣式是寫在
placeholder-style
裡或使用placeholder-class
下方選單
- 每個小卡片遵從
flex
佈局,設定width: 50%
,別忘了flex-wrap: wrap
- 每個小卡片內部同為
flex
佈局並設定垂直居中,想了想還是科普下:
.main-view-item{
display: flex;
justify-content: center;
align-items: center;
width: 50%;
}
複製程式碼
flex真他孃的好用
至於裡面的圖片是從iconfont上拿的,調這幾個配色的時間是我佈局時間的幾十倍....
動畫
微信小程式的動畫只能用JS,常規手段不可用,來個頭腦風暴hack起來
觀察每個卡片的摺疊方向後,為每個卡片新增初始rotate
使其反向摺疊,我在這裡定義了兩個Class
.rotateX90{
transform: rotateX(-90deg);
}
.rotateY90{
transform: rotateY(-90deg);
}
複製程式碼
好了這樣就看不到卡片了,然後給選單按鈕新增點選事件改變卡片的rotate(動態改變Class)就Ojbk啦,就像這樣
<view class='main-view-item rotateX90 item1 {{item1Style}}' animation='{{item1}}'></view>
複製程式碼
實際情況應該用
wx:for
進行迴圈渲染
var duration = 150
var item1 = wx.createAnimation({
duration: duration,
transformOrigin: '0 0 0'
})
item1.rotateX(90).step()
this.setData({
item1: item1,
item1Style: 'item1Style'
})
複製程式碼
這裡注意調整transformOrigin
來控制摺疊方向,對於後面的卡片在createAnimation
中新增delay
欄位即可(差為duration
的等差數列)
是不是很簡單嗯?
至於選單的收回,程式碼和展開差不多,就是反過來而已,不過有些展開的順序和transformOrigin
需要注意,這裡還是貼一個程式碼吧:
var duration = 150
var item3 = wx.createAnimation({
duration: duration,
transformOrigin: '100% 100% 0',
delay: duration * 2
})
item1.rotateX(90).step()
this.setData({
item3: item3,
item3Style: ''
})
複製程式碼
另外我在data
裡設定了兩個變數isShow
和isShowing
來判斷選單是否展開或者正在展開,來控制點選事件,差不多像這樣
handleClick(){
if(this.data.isShowing)
return;
else if(!this.data.isShow)
this.showMenu()
else
this.hideMenu()
}
複製程式碼
在動畫完成後對isShow
和isShowing
進行修改即可
歡迎有更好想法的朋友進行討論~