效果圖:小程序
實現原理:點擊按鈕,往須要動畫的div中添加或移除擁有動畫效果的class。微信小程序
因爲微信小程序中不能操做page這個根節點,因此,只有用一個div(view)來模仿page根節點。api
1.結構微信
<view class='page {{isFix?"pageShow":"pageHide"}}' > <view class='header'> <view class='h-toggle iconfont icon-list' bindtap='pageBtn'></view> </view> </view> <view class='r-box {{isFix?"fixShow":"fixHide"}}' bindtap='fixHide'> <view class='r-list' catchtap='fixStopBu'> <view class='rl-close' catchtap='fixClose'> <text class='iconfont icon-close'></text> </view> </view> </view>
上面的是最主要的結構,其它的內容就不貼了。ide
(1) isFix是切換動畫名的狀態動畫
(2) r-box設置了bindtap點擊事件以後,r-list也設置了一個不冒泡的catchtap事件,是爲了實現點擊r-box的空白處時,不冒泡的效果。this
2.樣式spa
page { height: 100%; width: 100%; } .page { width: 100%; height: 100%; box-shadow: 0 0 10px rgba(26,26,26,.1); } .r-box { position: fixed; top: 0; right: 0; width: 100%; height: 100%; } .r-box .r-list { float: right; width: 66%; height: 100%; background: white; } .fixHide { transition: all .3s ease; transform: translateX(100%); } .fixShow { transition: all .3s ease; transform: translateX(0%); } .pageHide { transition: all .3s ease; transform: translateX(0) scaleY(1); } .pageShow { transition: all .3s ease; transform: translateX(-70%) scaleY(0.9); }
這些是最主要的樣式:code
(1) class爲page的div(view),就是模擬整個page頁面,因此寬高須要設爲100%。orm
(2) r-box是右邊側滑的div(view)
(3) fixHide,fixShow這是側滑欄的動畫效果。
(4) pageHide,pageShow這是整個頁面的動畫效果
(5) 因爲transform只能出現一次,因此當有兩個即以上的動畫效果時,只寫在一個transform裏,而後把不一樣的動畫效果分開就行。
(6) 過渡效果的速度曲線我使用的是ease,若是用linear,在手機上會感受很卡頓。
3.js
Page({ data:{ isFix:false,//右側列表是否顯示 }, // 右側列表顯示按鈕 pageBtn:function(){ this.setData({ isFix:true }) }, //右側列表空白點擊 fixHide:function(){ this.setData({ isFix: false }) }, //右側列表防冒泡,必須有,雖然沒內容 fixStopBu: function () {}, //右側列表關閉按鈕 fixClose:function(){ this.setData({ isFix:false }) }, })
實現的過程大體就是這樣。仍是挺簡單的。不知道用小程序的動畫api作起來會不會簡單一些或者更順暢一點,這個就看本身勤不勤了。