微信小程式實現多摺疊展開酷炫選單

AddOneG發表於2018-04-08

背景

在這篇文章《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裡設定了兩個變數isShowisShowing來判斷選單是否展開或者正在展開,來控制點選事件,差不多像這樣

handleClick(){
  if(this.data.isShowing)
    return;
  else if(!this.data.isShow)
    this.showMenu()
  else
    this.hideMenu()
}
複製程式碼

在動畫完成後對isShowisShowing進行修改即可

歡迎有更好想法的朋友進行討論~

相關文章